280 likes | 437 Views
Praktikum 2. GL_LINES. GL_POLYGON. GL_LINE_STRIP. GL_LINE_LOOP. GL_POINTS. GL_TRIANGLES. GL_QUADS. GL_TRIANGLE_FAN. GL_TRIANGLE_STRIP. GL_QUAD_STRIP. OpenGL Geometric primitives. OpenGL Geometric primitives.
E N D
GL_LINES GL_POLYGON GL_LINE_STRIP GL_LINE_LOOP GL_POINTS GL_TRIANGLES GL_QUADS GL_TRIANGLE_FAN GL_TRIANGLE_STRIP GL_QUAD_STRIP OpenGL Geometric primitives
OpenGL Geometric primitives • Setiapobyekdimodelkansebagaikombinasidarikomponen-komponendasar (Geometric primitives) • Sebagaicontoh, obyeksegitigapada tutorial 1 dimodelkandenganmenggunakankomponendasarGL_POLYGON. Obyektersebutdapat pula dimodelkandengankomponendasarGL_TRIANGLES. ObyeksegiempatselaindapatdimodelkandenganGL_POLYGON jugabisadenganGL_QUADS. • Dalam OpenGL, menggambar geometric primitives selalu dilakukan di antara fungsi glBegin(PRIMITIVES) // FungsiMenggambar Primitives disini glEnd()
Polygon SegiDelapan 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 Segitigapertemuan 1, ubahpadafungsi display. • Pada program berikutmenggunakanvertekpadaruang 3D (x,y,z) yaknifungsi glVertex3f
Reshape Function • Buatlahobjekbujursangkarbirupadaruang 2D dengankoordinattitikkiribawah (-0.5, -0.5) • Jikakita drag ujung windows sehingga window tidaklagiberupabujursangkar, bujursangkar-nyajugaberubahbentuk. Gambarberikutmengilustrasikansituasinya.
Reshape Function • Agar gambartetapberadapadaproporsi yang tepat, makaperludigunakan callback reshape yang dipanggilsetiap kali window berubahukuran. Untukituperlulakukandualangkahberikut: • membuatfungsi yang akandipanggilsaatreshape, disinifungsinyaadalahvoid resize(intwidth, int height) • melakukanregistrasi callback reshape denganfungsiglutReshapeFunc(.)
Menambahkan Reshape Func • Dari program bujursangkartadi, tambahkanfungsi 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)bertanggungjawabuntukmelakukan setting viewport darisuatu window, yaitubagiandari window yang digunakanuntukmenggambar. • Daftarkanfungsi resize tersebutdifungsi main denganglutReshapeFuncsebelumglutMainLoop glutDisplayFunc(display); glutReshapeFunc(resize); glutMainLoop();
viewing volume camera model tripod Transformasi • Perhatikancarakerjakamera. Memotretberartimengubahobyek 3D menjadiobyek 2D berupafoto
Transformasi • GrafikaKomputeradalahprosestransformasidari model 3D obyekmenjadicitra 2D, inisamadengananalogikamera. • Sebelummemotret, apa yang dilakukan? • melakukanpengesetankameradalambentuk setting lensakamera (zoom in/out) • mengarahkankamerakeobyek (ex: mengaturletak tripod) • mengaturletakobyek (ex: mengubah-ubahletakobjek) • mengaturskaladan layout darifoto (ex : fotodenganorangdisisipinggir)
Transformasi • Analogidiatasmerupakanpenjelasandarijenis-jenistransformasisbb: • melakukanpengesetankameradalambentuk setting lensakamera (TransformasiProyeksi), • mengarahkamerakeobyek (Transformasi Viewing), • mengaturletakobyek (Transformasi Modeling), • mengaturskaladan layout darifoto (Transformasi Viewport) -> denganglViewPortpadacontohsebelumnya
TransformasiProyeksi • Lensakameradanmatamanusiamemilikidaerahpenglihatan (viewing volume) yang berbentukkerucut, • Namunkarenabentuk display yang biasanyaberbentuksegiempatmembuat OpenGL (danhampirsemua API grafikakomputer lain) lebihefisienmemodelkandaerahpenglihatansebagai volume berbentukpiramida.
TransformasiProyeksi • Tipetransformasiproyeksiadaduamacam, bergantungpada parameter danbentukpiramidanya. DuatipetransformasitersebutadalahTransformasiOrtogonal/Paralel(Orthogonal Transformation) danTransformasiPerspektif(Perspective Transformation) • TransformasiOrtogonal : membuatjarakbendarelatifterhadapkameratidakberpengaruhpadacitrabendatersebut. Biasanyatransformasiinidigunakanpadaaplikasi-aplikasitekniksepertigambarteknik • TransformasiPerspektif : Padatransformasijenisinijarakbendaakanmempengaruhigambar yang dibuat. • Transformasiproyeksi yang banyakdigunakanadalahTransformasiPerspektif
TransformasiProyeksiterdiridari a. Transformasi Orthogonal/Paralel (gambaratas) b. TransformasiPerspektif (mengerucutkesatutitikproyeksi, gambarbawah)
TransformasiProyeksi • Untukmerubah parameter transformasiortogonaldapatmenggunakanperintahglOrtho()dengandidahuluiprosesmerubah status OpenGL ke mode proyeksidenganperintahglMatrixMode(GL_PROJECTION). • Parameter transformasiperspektifdapatdirubahdenganmenggunakangluPerspective()/glFrustum() , jugadengandidahuluiprosesmerubah status OpenGL ke mode proyeksidenganperintahglMatrixMode(GL_PROJECTION).
Program TransformasiProyeksi • Tambahkanpada program segi 8 • Keyboard Func • Timer Func • Reshape Funcuntuk resize • Daftarkanketigafunctsbdi main • Ubahjadi double buffered
gluPerspective() glMatrixMode(GL_PROJECTION); glLoadIdentity( ); gluPerspective(fovy, aspect, near, far) • fovyadalahsudutantarabidang bottom dan up.
Setting ke mode transformasiproyeksi void init() { glClearColor( 1.0, 0.0, 0.0, 1.0 ); // A Background Clear Color //masukke mode transformasiproyeksi glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45, (GLdouble)500.0/(GLdouble)500.0, 0, 100); //kembalike mode transformasimodelling/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( intargc, 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( "TransformasiProyeksi"); // 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(); // Invoke this function for initialization glutMainLoop(); // Enter the event processing loop return 0; // Indicate normal termination (Required by ANSI C) }
TransformasiViewing • Untukmenghasilkangambar, kameraperludiletakkanpadaposisi yang tepatdidepanpemandangan yang diinginkan. • Secaradefault, dalam OpenGL kemeraakanberadapadaposisi (0,0,0) denganmenghadapkearahz = -1 dengansumbuymengarahkeataskamera. • Hal inidapatdilakukandenganmenggunakanperintahgluLookAt() dengandidahuluiprosesmerubah status OpenGL kemodelviewdenganperintahglMatrixMode(GL_MODELVIEW).
TransformasiModeling • Selainposisidanorientasikamera yang dapatdirubah-rubah, secara natural obyekjugadapatberpindahposisidanorientasirelatifterhadap yang lain. • Transformasiobyekdapatdirepresentasikandenganduacara, yaitu: • menggunakanmatrikstransformasi (glLoadMatrix) • menggunakanoperasitransformasi (glRotate, glTranslate) • dengandidahuluiprosesmerubah status OpenGL kemodelviewdenganperintahglMatrixMode(GL_MODELVIEW).
Konsep Double Buffer • Konsep Double Buffer. Pada program diatas mode display menggunakantipeGLUT_DOUBLE yang diikutiolehglutSwapBuffers(). • Hal inimerupakanteknik yang disebutDouble Bufferuntukmenghindariflicker. Untukmengetahuiapaitu flicker, ubah mode display menjadiGLUT_SINGLEdanhapus/commented perintahglutSwapBuffer().