Grfik 3 Dimensi Achmd Bsuki Nn Rmdijnti Achmd Bsuki, Nn Rmdijnti - Lortorium Computer Vision Politeknik Elektronik Negeri Sury (PENS-ITS)
Mteri Sistem Koordint 3D Definisi Oyek 3D Cr Menggmr Oyek 3D Konversi Vektor 3D menjdi Titik 2D Konversi Titik 2D menjdi Vektor 3D Visile dn Invisile
Sistem Koordint 3 Dimensi Y P(x,y,z) y x z X Z
Titik 3D Titik 3D dinytkn dengn : P(x,y,z) typedef struct { flot x,y,z; } point3d_t
Definisi Oyek 3 Dimensi Oyek 3-D dlh sekumpuln titik-titik 3-D (x,y,z) yng mementuk lusn-lusn (fce) yng digungkn menjdi stu kestun. Fce dlh gungn titik-titik yng mementuk lusn tertentu tu sering dinmkndengnsisi. Titik (vertex) Fce Oyek kuus mempunyi 8 titik dn 6 fce
Implementsi Definisi Dri Struktur Fces typedef struct { int NumerofVertices; short int pnt[32]; } fce_t; NumerofVertices menytkn jumlh titik pd seuh fce. pnt[32] menytkn nomor-nomor titik yng digunkn untuk mementuk fce, dengn mksimum 32 titik
Implementsi Definisi Dri Struktur Oyek 3D typedef struct { int NumerofVertices; point3d_t pnt[100]; int NumerofFces; fce_t fc[32]; } oject3d_t; NumerofVertices menytkn jumlh titik yng mementuk oyek. pnt[100] menytkn titik-titik yng mementuk fce, dengn mksimum 100 titik NumerofFces menytkn jumlh fce yng mementuk oyek Fc[32] menytkn fce-fce yng mementuk oyek.
Contoh Pernytn Oyek Lims SegiEmpt Titik-titik yng mementuk oyek: Titik 0 (0,150,0) Titik 1 (100,0,0) Titik 2 (0,0,100) Titik 3 (-100,0,0) Titik 4 (0,0,-100) Fce yng mementuk oyek : Fce 0 0,2,1 Fce 1 0,3,2 Fce 2 0,4,3 Fce 3 0,1,4 Fce 4 1,2,3,4 Z 3 2 Y 0 4 1 X
Implementsi Pernytn Oyek 3 Dimensi oject3d_t prism={5, {{0,100,0},{100,0,0},{0,0,100}, {-100,0,0},{0,0,-100}}, 5, {{3,{0,1,2}},{3,{0,2,3}}, {3,{0,3,4}},{3,{0,4,1}}, {4,{1,4,3,2}}}}; Pernytn ini ditulis pd fungsi userdrw segi nili dri oyek 3D yng kn digmrkn
Cr Menggmr Oyek 3 Dimensi Oyek 3 Dimensi terdiri dri titik-titik dn fce-fce. Penggmrn dilkukn pd setip fce menggunkn polygon. Polygon dientuk dri titik-titik yng terdpt pd seuh fce. Titik-titik dinytkn dlm struktur 3D, sedngkn lyr komputer dlm struktur 2D. Sehingg diperlukn konversi dri 3D menjdi 2D.
Konversi Vektor 3D menjdi 2D Untukmenggmroyek3D, untuksetip fce perlu dilkukn penguhn titik 3D menjdi vektor 3D, gr mudh dilkukn trnsformsi. Setelh proses pengolhn vektor, mk entuk vektor 3D menjdi 2D. Sumu Z dlh sumu yng serh dengn gris mt, sehingg perlu trnsformsi untuk menmpilkn sumu ini. Untuk hl ini perlu dilkukn rotsi sumu. Dlm konversi rh Z tidk dimil.
Konversi Vektor 3D menjdi 2D Y Konversi untuk menggmr oyek Z X Y Trnsformsi Sumu (Tilting) Z X
Vektor 3D vec = v v v v 0 1 2 3 typedef struct { flot v[4]; } vector3d_t;
Implementsi Konversi vektor 3D menjdi titik 2D point2d_t Vector2Point2D(vector3D_t vec) { point2d_t pnt; pnt.x=vec.v[0]; pnt.y=vec.v[1]; return pnt; }
Implementsi Konversi titik 3D menjdi vektor 3D vector3d_t Point2Vector(point3D_t pnt) { vector3d_t vec; vec.v[0]=pnt.x; vec.v[1]=pnt.y; vec.v[2]=pnt.z; vec.v[3]=1.; return vec; }
Implementsi Cr Menggmr Oyek 3D mt=tilting; for(i=0;i<prism.numerofvertices;i++) { vec[i]=point2vector(prism.pnt[i]); vec[i]=mt*vec[i]; } for(i=0;i<prism.numeroffces;i++) { for(j=0;j<prism.fc[i].numerofvertices;j++) vecuff[j]=vec[prism.fc[i].pnt[j]]; for(j=0;j<prism.fc[i].numerofvertices;j++) titik2d[j]=vector2point2d(vec[prism.fc[i].pnt[j]]); drwpolygon(titik2d,prism.fc[i].numerofvertices); }
mt=tilting; for(i=0;i<prism.numerofvertices;i++) { vec[i]=point2vector(prism.pnt[i]); vec[i]=mt*vec[i]; } Deklrsi mt segi mtrik tilting menytkn hw oyek yng digmr mengikuti pergerkn sumu koordint (tilting). Setip titik diuh menjdi vektor dengn memperhtikn mtrik trnsformsi yng dinytkn dlm mt.
Implementsi Tilting Tilting dlh mtrik rotsi dri sumu koordint dn semu oyek yng digmr di dlmny. flot thet=0.5; mtrix3d_t tilting=rottionxmtx(thet)*rottionymtx(-thet); Dlm deklrsi ini, mtrik tilting dlh rotsi terhdp sumu Y seesr -0.5 rd dn rotsi terhdp sumu X seesr 0.5 rd.
for(i=0;i<prism.numeroffces;i++) { for(j=0;j<prism.fc[i].numerofvertices;j++) vecuff[j]=vec[prism.fc[i].pnt[j]]; for(j=0;j<prism.fc[i].numerofvertices;j++) titik2d[j]=vector2point2d(vec[prism.fc[i].pnt[j]]); drwpolygon(titik2d,prism.fc[i].numerofvertices); } Untuk setip fce pd oyek 3D: (1) Amil vektor dri setip titik pd fce terseut (2) Konversikn setip vektor 3D menjdi titik 2D (3) Dri hsil konversi digmrkn polygon
Visile dn Invisile Visile dn invisile menytkn pkh sutu fce terliht (visile) tu tidk terliht (invisile) Pd oyek 3D tidk semu fce terliht, kren terdpt fce-fce yng erd di gin elkng dn terhlng oleh fce yng linny. Untuk menytkn fce visile dn invisile digunkn vektor norml pd fce terseut. Sutu fce visile il rh z pd vektor norml positif, dn invisile il rh z pd vektor normlny negtif
Vektor Norml Vektor norml dlh vektor yng rhny tegk lurus dengn lusn sutu fce Vektor norml dlh hsil perklin silng vektor (crossproduct) dri vektorvektor yng d pd lusn fce c c = x
Perklin Silng (Cross Product) Perklin Silng (Cross Product) Perklin silng (cross product) dri vektor =( x, y, z ) dn =( x, y, z ) didefinisikn dengn ( ) ( ) ( ) ( ) x y y x z x x z y z z y x y y x z x x z y z z y z y x z y x k j i k j i c = + + = =,,
Implementsi Cross-Product vector3d_t opertor ^ (vector3d_t, vector3d_t ) { vector3d_t c;//c=* c.v[0]=.v[1]*.v[2]-.v[2]*.v[1]; c.v[1]=.v[2]*.v[0]-.v[0]*.v[2]; c.v[2]=.v[0]*.v[1]-.v[1]*.v[0]; c.v[3]=1.; return c; } Cross product disimolkn dengn opertor ^ =( x, y, z ) diuh sesui struktur dt dri vektor 3D menjdi (.v[0],.v[1],.v[2]) =( x, y, z ) diuh sesui struktur dt dri vektor 3D menjdi (.v[0],.v[1],.v[2])
Implementsi Visile dn Invisile Untuk mengimplementsikn fce visile dn invisile mk dilkukn penggmrn du kli Pertm digmr dulu fce-fce yng invisile (NormlVector.v[2]<0) Kedu digmr fce-fce yng visile (NormlVector.v[2]>0)
Contoh Visile dn Invisile Y X Z
setcolor(0,0,1); for(i=0;i<prism.numeroffces;i++) { for(j=0;j<prism.fc[i].numerofvertices;j++) vecuff[j]=vec[prism.fc[i].pnt[j]]; NormlVector=(vecuff[1]-vecuff[0])^(vecuff[2]-vecuff[0]); normlzi=normlvector.v[2]; if(normlzi<0.) { for(j=0;j<prism.fc[i].numerofvertices;j++) titik2d[j]=vector2point2d(vec[prism.fc[i].pnt[j]]); drwpolygon(titik2d,prism.fc[i].numerofvertices); } } Menghitung vektor norml dri setip fce (NormlVector) Menghitung rh z dri vektor norml (normlzi) Menentukn pkh fce invisile (normlize<0) Bgin invisile dieri wrn iru (0,0,1)
setcolor(0,1,1); for(i=0;i<prism.numeroffces;i++) { for(j=0;j<prism.fc[i].numerofvertices;j++) vecuff[j]=vec[prism.fc[i].pnt[j]]; NormlVector=(vecuff[1]-vecuff[0])^(vecuff[2]-vecuff[0]); normlzi=normlvector.v[2]; if(normlzi>0.) { for(j=0;j<prism.fc[i].numerofvertices;j++) titik2d[j]=vector2point2d(vec[prism.fc[i].pnt[j]]); drwpolygon(titik2d,prism.fc[i].numerofvertices); } } Menghitung vektor norml dri setip fce (NormlVector) Menghitung rh z dri vektor norml (normlzi) Menentukn pkh fce visile (normlize>0) Bgin visile dieri wrn cyn (0,1,1)