Upload presentasi
Presentasi sedang didownload. Silahkan tunggu
Diterbitkan olehSurya Tedja Telah diubah "7 tahun yang lalu
1
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
2
Materi Membuat objek 3D melalui Sierpinski gasket (Fractal)
Mengenal Hidden-surface Removal
3
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
4
Sierpinski Gasket dalam 2D
Diawali dengan sebuah segitiga Sambungkan sisi-sisi segitiga dengan segitiga lain, buang segitiga yang ditengah Ulangi prosesnya
5
Contoh Sierpinski Gasket dengan 5 subdivisi
6
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
7
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);
8
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;
9
Tugas Modifikasi (enhacement) program di Sierpinski Gasket 2D menurut kuriositas dan kreativitas anda Buat laporan dalam Word hasil yang anda kerjakan
10
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
11
3D Gasket Pembagian bidang menjadi 4
Apabila tetrahedron tengah dihilangkan maka akan membuat 4 tetrahedra yang lebih kecil
12
Contoh Setelah 5 iterasi
13
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
14
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
15
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
16
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
17
Hasil tidak 100% Betul Segitiga digambar sesuai dengan urutan, maka segitiga yang didepan tidak dalam posisi yang benar Yang diperoleh Yang diinginkan
18
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.
19
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
20
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.
Presentasi serupa
© 2024 SlidePlayer.info Inc.
All rights reserved.