Grafika Komputer Evangs Mailoa
Kumpulan polygon atau permukaan yang secara bersama-sama membentuk kulit dari suatu obyek. Dinyatakan dengan daftar poligon-poligon yang disertai dengan arah dari permukaan tiap poligon. Arah permukaan dinyatakan dengan vektor normal.
Arah vektor dari sebuah obyek gudang
Secara lebih rinci arah permukaan dinyatakan dengan setiap vektor normal dari titik (verteks) dari permukaan tersebut. Contohnya, untuk suatu dinding sebelah kanan gudang yang menghadap ke n1, arah permukaannya dinyatakan dengan 4 vektor v1, v2,v3, dan v4 seperti yang terlihat pada gambar di samping.
Obyek sebuah gudang seperti pada gambar di atas terdiri dari 7 permukaan poligon dengan jumlah verteks semuanya 10 (masing-masing digunakan bersama oleh 3 permukaan). Untuk menyederhanakan masalah ukuran sisinya adalah 1 unit, dan karena tiap sisinya berupa bidang datar maka vektor normalnya cukup satu untuk tiap permukaan.
Daftar verteks (vectorlist), vektor normal (normallist), dan permukaan (facelist) dari obyek gudang tersebut dinyatakan dalam tabel tabel berikut. vertex x y z 0 0 0 0 1 1 0 0 2 1 1 0 3 0.5 1.5 0 4 0 1 0 5 0 0 1 6 1 0 1 7 1 1 1 8 0.5 1.5 1 9 0 1 1 Daftar vertek dari obyek Gudang (Vertexlist)
normal n x n y n z 0-1 0 0 1-0.707 0.707 0 2 0.707 0.707 0 3 1 0 0 4 0-1 0 5 0 0 1 6 0 0-1 Daftar vektor normal dari obyek Gudang (Vectorlist)
Daftar permukaan dari obyek gudang (facelist) face verteks normal 0 (kiri) 0,5,9,4 0,0,0,0 1(atap kiri) 3,4,9,8 1,1,1,1 2(atap kanan) 2,3,8,7 2,2,2,2 3(kanan) 1,2,7,6 3,3,3,3 4(bawah) 0,1,6,5 4,4,4,4 5(depan) 5,6,7,8,9 5,5,5,5,5 6(belakang) 0,4,3,2,1 6,6,6,6,6 Urutan verteks untuk tiap sisi dinyatakan berlawanan arah jarum jam dilihat dari luar permukaan.
Soliditas. Mesh menyatakan obyek yang padat bila seluruh permukaannya menutup suatu ruang positif dan terbatas. Keterhubungan. Suatu mesh terhubung jika ada jalur yang tidak terputus sepanjang sisi poligon diantara sembarang dua verteks. (Jika suatu mesh tidak terhubung, maka mesh tersebut menyatakan dua obyek). Kesederhanaan. Mesh disebut sederhana bila dia menyatakan obyek yang padat dan tidak berlubang. Kedatar (Planarity). Suatu mesh datar jika setiap permukaan obyek yang dinyatakanya terdiri dari bidang datar. Kecembungan (Convexity). Suatu mesh menyatakan obyek cembung bila garis yang menghubungkan dua titik sembarang pada permukaan obyek berada di dalam obyek.
Sebagai contoh kita akan membuat limas dengan titik-titik (0,0,0), (1,0,0), (0,1,0), dan (0,0,1). Gambar beserta struktur datanya adalah sebagai berikut.
//Program PoligonMesh #include <windows.h> #include <stdlib.h> #include <stdio.h> #include <fstream.h> #include <gl\gl.h> #include <gl\glut.h> #define MAX_LEN 50 int is_depth; /* depth testing flag */ typedef struct GLfloat x,y,z; GLint v; // 0 for vector, 1 for point Point3; typedef struct int vertindex; int normindex; VertexID; typedef struct int nverts; VertexID vert[5]; Face; typedef struct int numverts; Point3 * pt; int numnormals; Point3 *norm; int numfaces; Face * face; Mesh;
void draw(void) // use OpenGL to draw this mesh int f, v, in, iv; fstream instream; instream.open("kubus.txt", ios ::in); if(instream.fail()) return; // open the file GLint numvertex, numface, numnormal; instream >> numvertex >> numnormal >> numface;// read the number of polylines printf("\n numkvertex = %d, %d, %d",numvertex, numface, numnormal); Point3 pt[20], norm[10]; int i,j; for (i=0;i<numvertex;i++) instream >> pt[i].x >> pt[i].y >> pt[i].z; printf("\n titik = %f, %f, %f",pt[i].x, pt[i].y, pt[i].z);
for (i=0;i<numnormal;i++) instream >> norm[i].x >> norm[i].y >> norm[i].z; printf("\n norm = %f, %f, %f",norm[i].x, norm[i].y, norm[i].z); Face fc[20]; for (i=0;i<numface;i++) instream >> fc[i].nverts; printf("\n Jumlah Vertex= %d",fc[i].nverts); for (j=0;j<fc[i].nverts;j++) instream >> fc[i].vert[j].vertindex; printf("\n Vertex Index = %d",fc[i].vert[j].vertindex); for (j=0;j<fc[i].nverts;j++) instream >> fc[i].vert[j].normindex; printf("\n Norm Index = %d",fc[i].vert[j].normindex);
for( f = 0; f < numface; f++) // draw each face glbegin(gl_line_loop); glcolor3f(1.0, f/10, 0.0); for(v = 0; v < fc[f].nverts; v++) glend(); instream.close(); // for each one.. in = fc[f].vert[v].normindex ; // index of this normal iv = fc[f].vert[v].vertindex ; // index of this vertex glvertex3f(pt[iv].x, pt[iv].y, pt[iv].z);
void init(void) glclearcolor(0.0, 0.0, 0.0, 0.0); glmatrixmode(gl_projection); glloadidentity(); glortho(-3.2, 3.2, -2.4, 2.4, 1, 50); glmatrixmode(gl_modelview); glloadidentity(); glulookat(4,4,4,0,1,0,0,1,0); glenable(gl_depth_test); is_depth =1;
void display(void) if (is_depth) glclear(gl_color_buffer_bit GL_DEPTH_BUFFER_BIT); else glclear(gl_color_buffer_bit); draw(); glutswapbuffers();
void keyboard(unsigned char key, int x, int y) switch (key) case 'x': case 'X': gltranslatef(5.0, 0.0, 3.0); break; case 'a': case 'A': gltranslatef(5.0, 0.0, 0.0); break; case 'd': case 'D': gltranslatef(-5.0, 0.0, 0.0); break; case 'w': case 'W': case 's': case 'S': case 'u' : case 'U' : case 'n' : case 'N' : gltranslatef(0.0, 0.0, 5.0); break; gltranslatef(0.0, 0.0, -5.0); break; gltranslatef(0.0,5.0,0.0); break; gltranslatef(0.0,-5.0, 0.0); break;
case 'o': case 'O': case 'm': case 'M': case 'l': case 'L': glrotatef(3.0, 1.0, 0.0, 0.0); // rotate up break; glrotatef(-3.0, 1.0, 0.0, 0.0); // rotate down break; glrotatef(3.0, 0.0, 1.0, 0.0); // rotate left case 't': case 'T': if (is_depth) is_depth = 0; gldisable(gl_depth_test); else is_depth = 1; glenable(gl_depth_test); display();
void resize(int width, int height) if (height == 0) height = 1; glmatrixmode(gl_projection); glloadidentity(); /* note we divide our width by our height to get the aspect ratio */ gluperspective(45.0, width / height, 1.0, 400.0); /* set initial position */ gltranslatef(0.0, -5.0, -150.0); glmatrixmode(gl_modelview);
int main (int argc, char **argv) glutinit(&argc, argv); glutinitdisplaymode(glut_double GLUT_RGB); glutinitwindowsize(600, 600); glutinitwindowposition(50, 50); glutcreatewindow("a 3D Object"); init(); glutdisplayfunc(display); glutkeyboardfunc(keyboard); /* set keyboard handler */ glutreshapefunc(resize); glutmainloop(); return 0;
Polyhedra adalah mesh dari polygon sederhana yang menutup ruang terbatas. Dengan kata lain Polyhedron menyatakan obyek padat tunggal. Dengan demikian : Setiap sisi (edge) digunakan bersama oleh dua muka. Minimal tiga sisi bertemu pada tiap titik (Vertex) Permukaan-permukaan obyek tidak saling menempel, kecuali pada sisi bersama. Contoh polihedra adalah PIRAMIDA. DONAT juga polihedra, tetapi bukan polihedra sederhana. GUDANG adalah polihedra yang terdiri dari dua subpolihedra, yaitu bagian gedung dan cerobong asapnya.
Mau bertanya..?