OpenGL yog lub cuab yeej muaj tswv yim 3D siv los kos cov xwm txheej peb-seem los ntawm cov txheej txheem yooj yim. Kab lus no yuav qhia koj yuav ua li cas kos lub voos xwmfab yooj yim uas koj tuaj yeem tig mus saib hauv peb qhov ntev!
Rau txoj haujlwm no koj yuav xav tau tus kws kho kab lis kev cai thiab qee qhov kev paub ntawm C programming.
Cov kauj ruam
Ntu 1 ntawm 3: Kev teeb tsa thawj zaug
Kauj Ruam 1. Nruab OpenGL Txhawm rau pib ua raws cov theem no txhawm rau txhim kho OpenGL ntawm koj lub system
Yog tias koj twb muaj OpenGL, nrog rau kev txhim kho C compiler tau teeb tsa, koj tuaj yeem hla cov theem no thiab mus rau tom ntej.
Kauj Ruam 2. Tsim daim ntawv
Tsim cov ntaub ntawv tshiab hauv koj tus lej uas koj nyiam kho thiab khaws nws li mycube.c
Kauj ruam 3. Ntxiv #includes
Cov no yog qhov yooj yim suav nrog koj yuav xav tau rau koj qhov program. Nws yog ib qho tseem ceeb kom paub tias muaj qhov sib txawv tiag tiag suav nrog xav tau rau cov haujlwm sib txawv. Nco ntsoov suav tag nrho cov no kom ntseeg tau tias koj txoj haujlwm muaj ntau yam thiab tuaj yeem ua haujlwm rau ib tus neeg siv.
// Xws li #include #include #include #define GL_GLEXT_PROTOTYPES #ifdef _APPLE_ #include #else #include #endif
Kauj Ruam 4. Ntxiv cov qauv ua haujlwm thiab hloov pauv thoob ntiaj teb
Koj cov kauj ruam tom ntej yog tshaj tawm qee qhov qauv ua haujlwm.
// Function Prototypes void display (); tsis muaj dab tsi specialKeys (); // Global Variables ob npaug rot_y = 0; ob npaug rot_x = 0;
Kauj Ruam 5. Teeb lub ntsiab () ua haujlwm
int lub ntsiab (int argc, char* argv ) {// Pib GLUT thiab txheej txheem cov neeg siv tsis glutInit (& argc, argv); // Thov muab ob npaug rau qhov tseeb xim qhov rai nrog Z-buff glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
Kauj Ruam 6. Tsim lub qhov rai
Cov kauj ruam tom ntej yog tsim lub qhov rais nyob rau hauv uas koj yuav kos lub voos xwmfab. Hauv qhov kev qhia no, lub qhov rais hu ua "Awesome Cube".
// Tsim qhov rai glutCreateWindow ("Cube Txaus");
Kauj Ruam 7. Pab kom ntsuas qhov tob
OpenGL yog cov lus nruj heev uas nws tsis xav tias muaj qhov tshwj xeeb tau qhib. Txhawm rau koj txoj haujlwm kom raug tso tawm hauv 3-qhov ntev siv Z-tsis uas koj tau saib ua ntej, koj yuav tsum tau ua pab kom tob-xeem. Raws li koj txuas ntxiv tshawb xyuas OpenGL, koj yuav pom ntau yam tshwj xeeb uas koj yuav xav tau kom suav nrog teeb pom kev zoo, textures, cull-facing thiab ntau ntxiv.
// Pab kom Z-buff qhov tob ntsuas glEnable (GL_DEPTH_TEST);
Kauj Ruam 8. Ntxiv kev hu rov qab
Nov yog cov haujlwm rov qab uas koj tau sau cov qauv rau ua ntej lawm. Txhua lub sijhawm dhau los ntawm lub voj loj, cov haujlwm no yuav raug hu. Cov zaub muaj nuj nqi rov ua qhov xwm txheej raws li kev hloov pauv mus rau qhov hloov pauv uas tau ua txij li kev hu yav dhau los. Cov haujlwm tshwj xeebKey tso cai rau peb los cuam tshuam nrog txoj haujlwm.
// Hu rov qab ua haujlwm glutDisplayFunc (zaub); glutSpecialFunc (tshwj xeebKeys);
Kauj Ruam 9. Pib MainLoop
Qhov no yuav rov qab ua lub luag haujlwm tseem ceeb kom txog thaum koj kaw qhov program kom tso cai rau kev ua yeeb yaj kiab thiab cov neeg siv cuam tshuam.
// Dhau kev tswj hwm rau GLUT rau cov xwm txheej glutMainLoop (); // Rov qab mus rau OS rov qab 0; }
Ntu 2 ntawm 3: Cov zaub () Muaj nuj nqi
Kauj Ruam 1. Nkag siab lub hom phiaj ntawm txoj haujlwm no
Txhua txoj haujlwm ntawm kev kos koj lub voos xwmfab yuav ua tiav hauv txoj haujlwm no. Lub tswv yim dav tom qab koj lub voos xwmfab yog kos txhua rau rau sab ntawm tus kheej thiab tso rau hauv txoj haujlwm tsim nyog.
Lub tswv yim, txhua sab yuav raug kos los ntawm kev txhais plaub fab thiab cia OpenGL txuas cov kab thiab sau nws nrog cov xim uas koj txhais tau. Hauv qab no yog cov kauj ruam los ua qhov no
Kauj ruam 2. Ntxiv glClear ()
Thawj kauj ruam koj yuav tsum tau ua hauv txoj haujlwm no yog tshem cov xim thiab Z tsis. Tsis muaj cov kauj ruam no, cov duab kos qub tseem tuaj yeem pom hauv qab cov duab kos tshiab thiab cov khoom kos yuav tsis nyob hauv qhov chaw raug ntawm lub vijtsam.
void display () {// Clear screen thiab Z-buff glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Kauj Ruam 3. Ntxiv glBegin () thiab glEnd ()
OpenGL txhais cov khoom ua ke ua ke ntawm ntau lub duab sib txawv. Siv cov glBegin () hais kom ua, koj ua tau zoo sau tus xaum uas yuav kos duab. Txhawm rau nqa tus xaum thiab pib lub ntsej muag tshiab, koj yuav tsum siv lub glEnd () hais kom ua Hauv qhov kev qhia no koj yuav siv GL_POLYGON txhawm rau kos txhua sab ntawm lub voos xwmfab tab sis nws muaj peev xwm siv lwm yam kev ntsuas ntsuas xws li GL_LINE, GL_QUAD, lossis GL_TRIANGLE los tsim lwm yam duab.
- Ntawm no koj yuav pib nrog lub hauv ntej ntawm koj lub voos xwmfab. Tom qab ntawd koj yuav ntxiv xim rau txhua 6 sab.
// Ntau sab xim - PEM HAUV glBegin (GL_POLYGON); // Vertices yuav muab ntxiv rau theem tom ntej glEnd ();
Kauj Ruam 4. Ntxiv glVertex3f ()
Thaum koj tau hais tias koj xav pib koj lub polygon, koj yuav tsum txhais cov vertices ntawm qhov khoom. glVertex muaj ntau daim ntawv nyob ntawm seb koj xav ua dab tsi nrog koj lub hom phiaj.
- Thawj yog pes tsawg qhov koj tab tom ua haujlwm. 3 saum toj no hauv glVertex3f hais tias koj tab tom kos duab hauv 3 qhov ntev. Nws tseem tuaj yeem ua haujlwm hauv 2 lossis 4 qhov ntev. Qhov f saum toj no hauv glVertex3f hais tias koj tab tom ua haujlwm nrog cov lej lej ntab. Koj tseem tuaj yeem siv luv, cov lej lossis ob npaug.
- Pom tias cov ntsiab lus no tau teev tseg hauv a counter-clockwise yam. Qhov no tsis tseem ceeb heev tam sim no tab sis thaum koj pib ua haujlwm nrog teeb pom kev zoo, textures, thiab cull-facing, qhov no yuav dhau los ua qhov tseem ceeb heev yog li tau txais tus cwj pwm ntawm kev txhais koj cov ntsiab lus rov qab-clockwise tam sim no.
- Ntxiv ntxiv cov vertices ntawm kab glBegin () thiab glEnd ().
// Ntau sab xim - PEM HAUV glBegin (GL_POLYGON); glVertex3f (-0.5, -0.5, -0.5); // P1 glVertex3f (-0.5, 0.5, -0.5); // P2 glVertex3f (0.5, 0.5, -0.5); // P3 glVertex3f (0.5, -0.5, -0.5); // P4 glEnd ();
Kauj Ruam 5. Ntxiv glColor3f ()
glColor ua haujlwm zoo ib yam li glVertex. Koj tuaj yeem txhais cov ntsiab lus xws li luv, cov lej, ob npaug, lossis ntab. Txhua xim muaj tus nqi ntawm 0 txog 1. Txhua 0's ua rau lub ntsiab lus dub thiab tag nrho 1's yuav ua rau lub ntsiab lus dawb. 3 hauv glColor3f () hais txog RGB xim system uas tsis muaj alpha channel. Cov alpha ntawm cov xim piav qhia nws cov pob tshab. Txhawm rau hloov qib alpha, siv glColor4f () nrog qhov ntsuas kawg yog tus nqi 0 txog 1 rau qhov tsis pom kev kom pob tshab.
- Thaum koj hu rau glColor3f () txhua lub vertex kos los ntawm lub ntsiab lus ntawd yuav yog xim ntawd. Yog li, yog tias koj xav kom tag nrho plaub lub kaum sab xis kom liab, tsuas yog teeb tsa xim ib zaug txhua lub sijhawm ua ntej glVertex3f () cov lus txib thiab txhua lub kaum sab xis yuav liab.
- Sab pem hauv ntej tau piav qhia hauv qab no qhia yuav ua li cas txhawm rau txhais cov xim tshiab rau txhua lub vertex. Thaum koj ua qhov no, koj tuaj yeem pom cov khoom muaj txiaj ntsig ntawm OpenGL xim. Txij li txhua lub vertex ntawm lub polygon muaj nws tus kheej xim, OpenGL yuav cia li muab cov xim! Cov kauj ruam tom ntej yuav qhia yuav ua li cas muab plaub lub kaum sab xis nrog tib xim.
// Ntau sab xim - PEM HAUV glBegin (GL_POLYGON); glColor3f (1.0, 0.0, 0.0); glVertex3f (0.5, -0.5, -0.5); // P1 yog liab glColor3f (0.0, 1.0, 0.0); glVertex3f (0.5, 0.5, -0.5); // P2 yog ntsuab glColor3f (0.0, 0.0, 1.0); glVertex3f (-0.5, 0.5, -0.5); // P3 yog xiav glColor3f (1.0, 0.0, 1.0); glVertex3f (-0.5, -0.5, -0.5); // P4 yog xim liab glEnd ();
Kauj Ruam 6. Ua lwm sab
Ua haujlwm seb qhov chaw ntawm txhua lub vertex yuav yog rau lwm tsib sab ntawm lub voos xwmfab tab sis kom yooj yim, cov no tau suav rau koj thiab suav nrog hauv cov lus kawg () muaj nuj nqi hauv qab no
// Sab dawb - RAWS glBegin (GL_POLYGON); glColor3f (1.0, 1.0, 1.0); glVertex3f (0.5, -0.5, 0.5); glVertex3f (0.5, 0.5, 0.5); glVertex3f (-0.5, 0.5, 0.5); glVertex3f (-0.5, -0.5, 0.5); glEnd (); // Ntshav sab - RIGHT glBegin (GL_POLYGON); glColor3f (1.0, 0.0, 1.0); glVertex3f (0.5, -0.5, -0.5); glVertex3f (0.5, 0.5, -0.5); glVertex3f (0.5, 0.5, 0.5); glVertex3f (0.5, -0.5, 0.5); glEnd (); // Sab ntsuab - LEFT glBegin (GL_POLYGON); glColor3f (0.0, 1.0, 0.0); glVertex3f (-0.5, -0.5, 0.5); glVertex3f (-0.5, 0.5, 0.5); glVertex3f (-0.5, 0.5, -0.5); glVertex3f (-0.5, -0.5, -0.5); glEnd (); // Sab xiav - TOP glBegin (GL_POLYGON); glColor3f (0.0, 0.0, 1.0); glVertex3f (0.5, 0.5, 0.5); glVertex3f (0.5, 0.5, -0.5); glVertex3f (-0.5, 0.5, -0.5); glVertex3f (-0.5, 0.5, 0.5); glEnd (); // Sab liab - BOTTOM glBegin (GL_POLYGON); glColor3f (1.0, 0.0, 0.0); glVertex3f (0.5, -0.5, -0.5); glVertex3f (0.5, -0.5, 0.5); glVertex3f (-0.5, -0.5, 0.5); glVertex3f (-0.5, -0.5, -0.5); glEnd (); glFlush (); glutSwapBuffers (); }
Peb kuj xav ntxiv ob kab kawg ntawm cov cai rau txoj haujlwm no. Cov no yog glFlush ();
thiab glutSwapBuffers ();
uas muab rau peb qhov cuam tshuam ob npaug uas koj tau kawm txog yav dhau los.
Ntu 3 ntawm 3: Tus Neeg Siv Kev Sib Tham
Kauj ruam 1. Ntxiv specialKeys ()
Koj yuav luag tiav tab sis tam sim no, koj tuaj yeem kos lub voos xwmfab tab sis tsis muaj txoj hauv kev tig nws. Ua li no, koj yuav tsim tshwj xeebKeys () muaj nuj nqi los tso cai rau peb nias lub pob yuam sij thiab tig lub voos xwmfab!
- Txoj haujlwm no yog vim li cas koj thiaj tshaj tawm thoob ntiaj teb kev hloov pauv tig_x thiab tig_y. Thaum koj nias sab xis thiab sab laug xub, tig_y yuav nce lossis nqis qis dua 5 degrees. Ib yam li ntawd, thaum koj nias tus xub thiab nqis xub tuav, tig_x yuav hloov raws li.
void specialKeys (int qhov tseem ceeb, int x, int y) {// Txoj cai xub - nce kev sib hloov los ntawm 5 degree yog (qhov tseem ceeb == GLUT_KEY_RIGHT) tig_y += 5; // Sab laug xub - txo kev sib hloov los ntawm 5 degree ntxiv yog (qhov tseem ceeb == GLUT_KEY_LEFT) tig_y - = 5; lwm tus yog (qhov tseem ceeb == GLUT_KEY_UP) tig_x += 5; lwm tus yog (qhov tseem ceeb == GLUT_KEY_DOWN) tig_x -= 5; // Thov tso saib hloov tshiab glutPostRedisplay (); }
Kauj ruam 2. Ntxiv glRotate ()
Koj cov lus kawg yog ntxiv cov lus uas yuav tig koj lub hom phiaj. Rov qab mus rau cov zaub () muaj nuj nqi thiab ua ntej ntawm sab xub ntiag, ntxiv cov kab no:
// Pib dua kev hloov pauv glLoadIdentity (); // Tig thaum tus neeg siv hloov tig_x thiab tig_y glRotatef (tig_x, 1.0, 0.0, 0.0); glRotatef (tig_y, 0.0, 1.0, 0.0); // Ntau yam xim sab - POM ZOO….
Kauj Ruam 3. Ntxiv cov lus txib hauv qab no los ntsuas lub voos xwmfab los ntawm 2 raws x-axis, 2 raws y-axis, tig lub voos xwmfab 180 degrees txog y-axis, thiab txhais lub voos xwmfab 0.1 raws x-axis
Nco ntsoov npaj cov no nrog rau yav dhau los glRotate () cov lus txib hauv qhov kev txiav txim raug raws li tau piav qhia saum toj no. (Yog tias koj tsis paub meej, qhov no tau ua tiav hauv kab lus kawg ntawm qhov kawg ntawm kev qhia.)
// Lwm yam kev hloov pauv glTranslatef (0.1, 0.0, 0.0); glRotatef (180, 0.0, 1.0, 0.0); glScalef (2.0, 2.0, 0.0);
Kauj Ruam 4. Sau thiab sau koj cov cai
Piv txwv tias koj tab tom siv gcc ua koj tus neeg sau, khiav cov lus txib no los ntawm koj lub davhlau ya nyob twg los suav sau thiab sim koj li program.
Ntawm Linux: gcc cube.c -o cube -lglut -lGL./ mycube Ntawm Mac: gcc -o foo foo.c -framework GLUT -framework OpenGL./ mycube Rau Windows: gcc -Wall -ofoo foo.c -lglut32cu - lglu32 -lopengl32./ mycube
Kauj Ruam 5. Txheeb xyuas koj tus lej ua tiav
Nws yuav tsum zoo li no:
// // File: mycube.c // Author: Matt Daisley // Created: 4/25/2012 // Project: Source code for Make a Cube in OpenGL // Nqe lus piav qhia: Tsim lub qhov rai OpenGL thiab kos lub voos xwmfab 3D / Tias tus neeg siv tuaj yeem tig siv tus xub xub // // Kev tswj: xub xub -Tig sab laug // xub xub -Tig sab xis // nce xub -tig rov // nqis xub -tig rov // ------ ----------------------------------------------------------------------- -// Xws li // ------------------------------------------- --------------- #include #include #include #define GL_GLEXT_PROTOTYPES #ifdef _APPLE_ #include #else #include #endif // ------------- --------------------------------------------- // Function Prototypes / / ------------------------------------------------------- --------- void display (); tsis muaj dab tsi specialKeys (); // ------------------------------------------------------- ---------- // Ntiaj teb Variables // ---------------------------------- ------------------------ ob npaug rot_y = 0; ob npaug rot_x = 0; // ------------------------------------------------------- ---------- // display () Callback function // ------------------------------- --------------------------- void display () {// Clear screen and Z-buff glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Pib dua kev hloov pauv glLoadIdentity (); // Lwm yam kev hloov pauv // glTranslatef (0.1, 0.0, 0.0); // Tsis suav nrog // glRotatef (180, 0.0, 1.0, 0.0); // Tsis suav nrog // Tig thaum cov neeg siv hloov pauv_x thiab tig_y glRotatef (tig_x, 1.0, 0.0, 0.0); glRotatef (tig_y, 0.0, 1.0, 0.0); // Lwm yam kev hloov pauv // glScalef (2.0, 2.0, 0.0); // Tsis suav nrog // Ntau sab xim - PAWG glBegin (GL_POLYGON); glColor3f (1.0, 0.0, 0.0); glVertex3f (0.5, -0.5, -0.5); // P1 yog liab glColor3f (0.0, 1.0, 0.0); glVertex3f (0.5, 0.5, -0.5); // P2 yog ntsuab glColor3f (0.0, 0.0, 1.0); glVertex3f (-0.5, 0.5, -0.5); // P3 yog xiav glColor3f (1.0, 0.0, 1.0); glVertex3f (-0.5, -0.5, -0.5); // P4 yog xim liab glEnd (); // Sab dawb - RAWS glBegin (GL_POLYGON); glColor3f (1.0, 1.0, 1.0); glVertex3f (0.5, -0.5, 0.5); glVertex3f (0.5, 0.5, 0.5); glVertex3f (-0.5, 0.5, 0.5); glVertex3f (-0.5, -0.5, 0.5); glEnd (); // Ntshav sab - RIGHT glBegin (GL_POLYGON); glColor3f (1.0, 0.0, 1.0); glVertex3f (0.5, -0.5, -0.5); glVertex3f (0.5, 0.5, -0.5); glVertex3f (0.5, 0.5, 0.5); glVertex3f (0.5, -0.5, 0.5); glEnd (); // Sab ntsuab - LEFT glBegin (GL_POLYGON); glColor3f (0.0, 1.0, 0.0); glVertex3f (-0.5, -0.5, 0.5); glVertex3f (-0.5, 0.5, 0.5); glVertex3f (-0.5, 0.5, -0.5); glVertex3f (-0.5, -0.5, -0.5); glEnd (); // Sab xiav - TOP glBegin (GL_POLYGON); glColor3f (0.0, 0.0, 1.0); glVertex3f (0.5, 0.5, 0.5); glVertex3f (0.5, 0.5, -0.5); glVertex3f (-0.5, 0.5, -0.5); glVertex3f (-0.5, 0.5, 0.5); glEnd (); // Sab liab - BOTTOM glBegin (GL_POLYGON); glColor3f (1.0, 0.0, 0.0); glVertex3f (0.5, -0.5, -0.5); glVertex3f (0.5, -0.5, 0.5); glVertex3f (-0.5, -0.5, 0.5); glVertex3f (-0.5, -0.5, -0.5); glEnd (); glFlush (); glutSwapBuffers (); } // ------------------------------------------------------- ----------- // specialKeys () Callback Function // ------------------------------ ---------------------------- tsis muaj dab tsi specialKeys (int qhov tseem ceeb, int x, int y) {// Txoj cai xub-nce kev sib hloov los ntawm 5 degree yog (qhov tseem ceeb == GLUT_KEY_RIGHT) tig_y += 5; // Sab laug xub - txo kev sib hloov los ntawm 5 degree ntxiv yog (qhov tseem ceeb == GLUT_KEY_LEFT) tig_y - = 5; lwm tus yog (qhov tseem ceeb == GLUT_KEY_UP) tig_x += 5; lwm tus yog (qhov tseem ceeb == GLUT_KEY_DOWN) tig_x -= 5; // Thov tso saib hloov tshiab glutPostRedisplay (); } // ------------------------------------------------------- ----------- // main () muaj nuj nqi // ------------------------------- --------------------------- int lub ntsiab (int argc, char* argv ) {// Initialize GLUT thiab txheej txheem cov neeg siv tsis glutInit (& argc, argv); // Thov muab ob npaug rau qhov tseeb xim qhov rai nrog Z-buff glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); // Tsim qhov rai glutCreateWindow ("Cube Txaus"); // Pab kom Z-buff qhov tob ntsuas glEnable (GL_DEPTH_TEST); // Hu rov qab ua haujlwm glutDisplayFunc (zaub); glutSpecialFunc (tshwj xeebKeys); // Dhau kev tswj hwm rau GLUT rau cov xwm txheej glutMainLoop (); // Rov qab mus rau OS rov qab 0; }