Anda di halaman 1dari 27

Praktikum 2

OpenGL Geometric primitives


GL_LINES GL_POLYGON GL_POINTS GL_LINE_STRIP GL_LINE_LOOP

GL_TRIANGLES

GL_QUADS GL_QUAD_STRIP GL_TRIANGLE_STRIP GL_TRIANGLE_FAN

OpenGL Geometric primitives


Setiap obyek dimodelkan sebagai kombinasi dari komponen-komponen dasar (Geometric primitives) Sebagai contoh, obyek segitiga pada tutorial 1 dimodelkan dengan menggunakan komponen dasar GL_POLYGON. Obyek tersebut dapat pula dimodelkan dengan komponen dasar GL_TRIANGLES. Obyek segiempat selain dapat dimodelkan dengan GL_POLYGON juga bisa dengan GL_QUADS. Dalam OpenGL, menggambar geometric primitives selalu dilakukan di antara fungsi glBegin(PRIMITIVES) // Fungsi Menggambar Primitives di sini glEnd()

Polygon Segi Delapan


void display() { glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_POLYGON); glColor3f(0, 1, 0); glVertex3f(-0.5, -0.5, 1); glColor3f(0, 0, 1); glVertex3f(-0.75, 0, 1); glColor3f(1, 0, 0); glVertex3f(-0.5, 0.5, 1); glColor3f(0, 1, 0); glVertex3f(0, 0.75, 1); glColor3f(0, 0, 1); glVertex3f(0.5, 0.5, -1); glColor3f(1, 0, 0); glVertex3f(0.75, 0, -1); glColor3f(0, 1, 0); glVertex3f(0.5, -0.5, -1); glColor3f(0, 0, 1); glVertex3f(0,-0.75, -1); glEnd(); glFlush(); }

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(.)

Menambahkan Reshape Func


Dari program bujur sangkar tadi, tambahkan fungsi resize() void resize( int w, int h ) {
if (w >= h) glViewport(0, 0, (GLsizei)h, (GLsizei)h) ; else glViewport(0, 0, (GLsizei)w, (GLsizei)w) ;

} 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).

Program Transformasi Proyeksi


Tambahkan pada program segi 8
Keyboard Func Timer Func Reshape Func untuk resize Daftarkan ketiga func tsb di main Ubah jadi double buffered

gluPerspective()

glMatrixMode(GL_PROJECTION); glLoadIdentity( ); gluPerspective(fovy, aspect, near, far) fovy adalah sudut antara bidang bottom dan up.

Setting ke mode transformasi proyeksi


void init() { glClearColor( 1.0, 0.0, 0.0, 1.0 ); // A Background Clear Color //masuk ke mode transformasi proyeksi glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45, (GLdouble)500.0/(GLdouble)500.0, 0, 100); //kembali ke mode transformasi modelling/viewing glMatrixMode(GL_MODELVIEW); }

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(); }

Directive & Global Variable


#include <GL/glut.h> float z_pos=0.0f; float rot=0.0f;

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).

Konsep Double Buffer


Konsep Double Buffer. Pada program di atas mode display menggunakan tipe GLUT_DOUBLE yang diikuti oleh glutSwapBuffers(). Hal ini merupakan teknik yang disebut Double Buffer untuk menghindari flicker. Untuk mengetahui apa itu flicker, ubah mode display menjadi GLUT_SINGLE dan hapus/commented perintah glutSwapBuffer().

Anda mungkin juga menyukai