Program Studi S-1 Teknik Informatika FMIPA Universitas Padjadjaran COMPUTER GRAPHICS D10K-5C01 GK10: OpenGL 3D Dr. Setiawan Hadi, M.Sc.CS. Program Studi S-1 Teknik Informatika FMIPA Universitas Padjadjaran
Materi Membuat objek 3D melalui Sierpinski gasket (Fractal) Mengenal Hidden-surface Removal
Aplikas 3 Dimensi Dalam OpenGL, aplikasi 2D merupakan kasus khusus grafika 3D Berpindah dari 2D ke 3D Menggunakan glVertex3f() Dalam hal ini, urutan penngambaran poligon sangat berpengaruh dimana ada bidang tertutupi bidang yang lain Untuk membuat gambar lebih realistis menggunakan hidden-surface removal
Sierpinski Gasket dalam 2D Diawali dengan sebuah segitiga Sambungkan sisi-sisi segitiga dengan segitiga lain, buang segitiga yang ditengah Ulangi prosesnya
Contoh Sierpinski Gasket dengan 5 subdivisi
Gasket merupakan sebuah Fraktal Perhatikan luas area hitam dan kelilingnya Jika kita terus membagi maka Luas akan menuju nol Tetapi keliling akan menuju tak berhingga Bentuk ini adalah objek geometri yang tidak biasa Bukan dua- maupun tiga dimensi Melainkan sebuah objek yang berdimensi fraktal
Program 2D #include <math.h> #include <stdio.h> #include <stdlib.h> #include <GL/glut.h> void init() { glClearColor(0.0, 0.0, 0.0, 1.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); } void gasket(int n, float ax, float ay,float bx, float by,float cx, float cy) if (n <= 0) glVertex2f(ax, ay); glVertex2f(bx, by); glVertex2f(cx, cy); else float dx = (ax+bx)/2; float dy = (ay+by)/2; float ex = (bx+cx)/2; float ey = (by+cy)/2; float fx = (cx+ax)/2; float fy = (cy+ay)/2; gasket(n-1, ax, ay, dx, dy, fx, fy); gasket(n-1, bx, by, ex, ey, dx, dy); gasket(n-1, cx, cy, fx, fy, ex, ey);
Program 2D void draw() { glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_TRIANGLES); glColor3f(1.0, 0.0, 0.0); gasket(4, 0,0.5, -0.5,-0.5, 0.5,-0.5); glEnd(); glFlush(); } int main(int argc, char *argv[]) glutInit(&argc, argv); glutInitWindowSize(500, 500); glutInitWindowPosition(250, 250); glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); glutCreateWindow("Gasket2D"); glutDisplayFunc(draw); init(); glutMainLoop(); return 0;
Tugas Modifikasi (enhacement) program di Sierpinski Gasket 2D menurut kuriositas dan kreativitas anda Buat laporan dalam Word hasil yang anda kerjakan
Catatan Efisiensi Dengan menerapkan glBegin dan glEnd pada display callback (tidak pada fungsi segitiga dan menggunakan GL_TRIANGLES, bukan GL_POLYGON dalam glBegin, maka glBegin dan glEnd tidak dipangil setiap kali untuk penggambaran sebuah segitiga, emlainkan hanya dipanggil sekali untuk keseluruhan
3D Gasket Pembagian bidang menjadi 4 Apabila tetrahedron tengah dihilangkan maka akan membuat 4 tetrahedra yang lebih kecil
Contoh Setelah 5 iterasi
Program Gasket3D #include <math.h> #include <stdio.h> #include <stdlib.h> #include <GL/glut.h> void init() { glClearColor(0.0, 0.0, 0.0, 1.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glEnable(GL_DEPTH_TEST); } 13
Program Gasket3D void gasket(int n, float ax, float ay, float az, float bx, float by, float bz, float cx, float cy, float cz) { if (n <= 0) glVertex3f(ax, ay, az); glVertex3f(bx, by, bz); glVertex3f(cx, cy, cz); } else float dx = (ax+bx)/2; float dy = (ay+by)/2; float dz = (az+bz)/2; float ex = (bx+cx)/2; float ey = (by+cy)/2; float ez = (bz+cz)/2; float fx = (cx+ax)/2; float fy = (cy+ay)/2; float fz = (cz+az)/2; gasket(n-1, ax, ay, az, dx, dy, dz, fx, fy, fz); gasket(n-1, bx, by, bz, ex, ey, ez, dx, dy, dz); gasket(n-1, cx, cy, cz, fx, fy, fz, ex, ey, ez); 14
Program Gasket3D void draw() { float ax = 0.0; float ay = 0.5; float az = -0.5; float bx = -0.43; float by = -0.25; float bz = -0.5; float cx = 0.43; float cy = -0.25; float cz = -0.5; float dx = 0.0; float dy = 0.0; float dz = 0.0; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glBegin(GL_TRIANGLES); glColor3f(0.5, 0.5, 0.5); gasket(3, ax, ay, az, bx, by, bz, cx, cy, cz); glColor3f(1.0, 0.0, 0.0); gasket(3, dx, dy, dz, ax, ay, az, bx, by, bz); glColor3f(0.0, 1.0, 0.0); gasket(3, dx, dy, dz, bx, by, bz, cx, cy, cz); glColor3f(0.0, 0.0, 1.0); gasket(3, dx, dy, dz, cx, cy, cz, ax, ay, az); glEnd(); glFlush(); } 15
Program Gasket3D int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitWindowSize(500, 500); glutInitWindowPosition(250, 250); glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH); glutCreateWindow("Gasket3D"); glutDisplayFunc(draw); init(); glutMainLoop(); return 0; } 16
Hasil tidak 100% Betul Segitiga digambar sesuai dengan urutan, maka segitiga yang didepan tidak dalam posisi yang benar Yang diperoleh Yang diinginkan
Hidden Surface Removal Yang terlihat hanyalah bidang atau permukaan yang di depan, bidang dibelakangnya tidak boleh kelihatan OpenGL menggunakan metode hidden-surface removal yang dinamakan algoritma z-buffer Algoritma ini menyimpan informasi kedalaman (depth) sedemikian rupa sehingga pada saat rendering, yang kelihatan hanyalah objek atau bidang yang didepan.
Menggunakan algoritma z-buffer Algoritma ini menggunakan buffer tambahan yang disebut the z-buffer, untuk menyimpan informasi kedalaman sebagai informasi geometri yang mengalir pada pipeline. Kebutuhan Dalam main.c glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH) Diaktifkan dalam init.c glEnable(GL_DEPTH_TEST) Di-clear-kan dalam display callback glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) Z-Buffer bukan satu-satunya cara untuk HSR
Tugas Modifikasi (enhance) program di Sierpinski Gasket 3D menurut kuriositas dan kreativitas anda Buat laporan (tuliskan) dalam Word hasil yang anda kerjakan Gabungkan dengan tugas sebelumnya (Sierpinski 2D), submit ke e-learning sebagai Tugas OpenGL1.