GL_TRIANGLES
Dari Program Segitiga pertemuan 1, ubah pada fungsi display. Pada program berikut menggunakan vertek pada ruang 3D (x,y,z) yakni fungsi glVertex3f
Reshape Function
Buatlah objek bujursangkar biru pada ruang 2D dengan koordinat titik kiri bawah (-0.5, -0.5) Jika kita drag ujung windows sehingga window tidak lagi berupa bujursangkar, bujursangkar-nya juga berubah bentuk. Gambar berikut mengilustrasikan situasinya.
Reshape Function
Agar gambar tetap berada pada proporsi yang tepat, maka perlu digunakan callback reshape yang dipanggil setiap kali window berubah ukuran. Untuk itu perlu lakukan dua langkah berikut:
membuat fungsi yang akan dipanggil saat reshape, di sini fungsinya adalah void resize(int width, int height) melakukan registrasi callback reshape dengan fungsi glutReshapeFunc(.)
} glViewport(x_left, x_top, x_right, y_right) bertanggung jawab untuk melakukan setting viewport dari suatu window, yaitu bagian dari window yang digunakan untuk menggambar.
Daftarkan fungsi resize tersebut di fungsi main dengan glutReshapeFunc sebelum glutMainLoop
glutDisplayFunc(display); glutReshapeFunc(resize); glutMainLoop();
Transformasi
Perhatikan cara kerja kamera. Memotret berarti mengubah obyek 3D menjadi obyek 2D berupa foto
viewing volume camera model
tripod
Transformasi
Grafika Komputer adalah proses transformasi dari model 3D obyek menjadi citra 2D, ini sama dengan analogi kamera. Sebelum memotret, apa yang dilakukan?
melakukan pengesetan kamera dalam bentuk setting lensa kamera (zoom in/out) mengarahkan kamera ke obyek (ex: mengatur letak tripod) mengatur letak obyek (ex: mengubah-ubah letak objek) mengatur skala dan layout dari foto (ex : foto dengan orang di sisi pinggir)
Transformasi
Analogi di atas merupakan penjelasan dari jenis-jenis transformasi sbb:
melakukan pengesetan kamera dalam bentuk setting lensa kamera (Transformasi Proyeksi), mengarah kamera ke obyek (Transformasi Viewing), mengatur letak obyek (Transformasi Modeling), mengatur skala dan layout dari foto (Transformasi Viewport) -> dengan glViewPort pada contoh sebelumnya
Transformasi Proyeksi
Lensa kamera dan mata manusia memiliki daerah penglihatan (viewing volume) yang berbentuk kerucut, Namun karena bentuk display yang biasanya berbentuk segiempat membuat OpenGL (dan hampir semua API grafika komputer lain) lebih efisien memodelkan daerah penglihatan sebagai volume berbentuk piramida.
Transformasi Proyeksi
Tipe transformasi proyeksi ada dua macam, bergantung pada parameter dan bentuk piramidanya. Dua tipe transformasi tersebut adalah Transformasi Ortogonal/Paralel (Orthogonal Transformation) dan Transformasi Perspektif(Perspective Transformation) Transformasi Ortogonal : membuat jarak benda relatif terhadap kamera tidak berpengaruh pada citra benda tersebut. Biasanya transformasi ini digunakan pada aplikasiaplikasi teknik seperti gambar teknik Transformasi Perspektif : Pada transformasi jenis ini jarak benda akan mempengaruhi gambar yang di buat. Transformasi proyeksi yang banyak digunakan adalah Transformasi Perspektif
Transformasi Proyeksi terdiri dari a. Transformasi Orthogonal/Paralel (gambar atas) b. Transformasi Perspektif (mengerucut ke satu titikproyeksi, gambar bawah)
Transformasi Proyeksi
Untuk merubah parameter transformasi ortogonal dapat menggunakan perintah glOrtho() dengan didahului proses merubah status OpenGL ke mode proyeksi dengan perintah glMatrixMode(GL_PROJECTION). Parameter transformasi perspektif dapat dirubah dengan menggunakan gluPerspective()/glFrustum() , juga dengan didahului proses merubah status OpenGL ke mode proyeksi dengan perintah glMatrixMode(GL_PROJECTION).
gluPerspective()
glMatrixMode(GL_PROJECTION); glLoadIdentity( ); gluPerspective(fovy, aspect, near, far) fovy adalah sudut antara bidang bottom dan up.
Timer Func
void myTimeOut(int id) { // called if timer event // ...advance the state of animation incrementally... rot+=10; glutPostRedisplay(); // request redisplay glutTimerFunc(100, myTimeOut, 0); // request next timer event }
Keyboard Func
void myKeyboard(unsigned char key,int x, int y) { if((key=='<')||(key==',')) z_pos-=0.1f; if((key=='>')||(key=='.')) z_pos+=0.1f; }
Reshape Func
void resize( int w, int h ) { glViewport( 0, 0, (GLsizei) w, (GLsizei) h ); glMatrixMode( GL_PROJECTION ); glLoadIdentity(); gluPerspective(45, (GLdouble)w/(GLdouble)h, 0, 100); glMatrixMode( GL_MODELVIEW ); }
Display Func
void display() { glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); glTranslatef(0.0,0.0f,z_pos); glRotatef(rot, 0, 0, 1); glBegin(GL_POLYGON); glColor3f(0, 1, 0); glVertex3f(-0.5, -0.5, -5); glColor3f(0, 0, 1); glVertex3f(-0.75, 0, -5); glColor3f(1, 0, 0); glVertex3f(-0.5, 0.5, -5); glColor3f(0, 1, 0); glVertex3f(0, 0.75, -5); glColor3f(0, 0, 1); glVertex3f(0.5, 0.5, -5); glColor3f(1, 0, 0); glVertex3f(0.75, 0, -5); glColor3f(0, 1, 0); glVertex3f(0.5, -0.5, -5); glColor3f(0, 0, 1); glVertex3f(0,-0.75, -5); glEnd();
glFlush(); glutSwapBuffers(); }
Main Func
int main( int argc, char **argv) { glutInit( &argc, argv); // Initialize GLUT function callings glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB); // Set window size (width, height) in number of pixels glutInitWindowSize( 400, 400); // Set window position, from the left and top of the screen, glutInitWindowPosition( 500, 500); // in numbers of pixels // Specify a window creation event glutCreateWindow( "Transformasi Proyeksi"); // Specify the drawing function that is called when the window glutDisplayFunc( display); // is created or re-drew glutKeyboardFunc(myKeyboard); glutTimerFunc(100, myTimeOut, 0); glutReshapeFunc(resize); init(); glutMainLoop(); return 0; } // Invoke this function for initialization // Enter the event processing loop // Indicate normal termination (Required by ANSI C)
Transformasi Viewing
Untuk menghasilkan gambar, kamera perlu diletakkan pada posisi yang tepat didepan pemandangan yang diinginkan. Secara default, dalam OpenGL kemera akan berada pada posisi (0,0,0) dengan menghadap ke arah z = -1 dengan sumbu y mengarah ke atas kamera. Hal ini dapat dilakukan dengan menggunakan perintah gluLookAt() dengan didahului proses merubah status OpenGL ke modelview dengan perintah glMatrixMode(GL_MODELVIEW).
Transformasi Modeling
Selain posisi dan orientasi kamera yang dapat dirubahrubah, secara natural obyek juga dapat berpindah posisi dan orientasi relatif terhadap yang lain. Transformasi obyek dapat direpresentasikan dengan dua cara, yaitu:
menggunakan matriks transformasi (glLoadMatrix) menggunakan operasi transformasi (glRotate, glTranslate)
dengan didahului proses merubah status OpenGL ke modelview dengan perintah glMatrixMode(GL_MODELVIEW).