You are on page 1of 64

HC VIN CNG NGH

BU CHNH VIN THNG

BI TP LN
TM HIU C BN V OPENGL

Gio vin hng dn: Trnh Th Vn Anh Lp: H09CN7 Nhm Sinh vin thc hin: Hong Th Hng Sm Th Chm Trn Th Phng Thm L Mu Thnh Nguyn Th Thu Lan Hong Cng Phc Nguyn Thu Ngc Phm Ngc Thng Trn Minh Ngc Dip

H Ni, thng 12 nm 2010

Mc lc

Phn A. Tm hiu v Opengl..............3


CHNG 1. GII THIU V OPENGL.................3 CHNG 2. CI T OPENGL TRONG VISUAL C++..............4 CHNG 3. CC THNH PHN C BN CA OPENGL....4 3.1. Chng trnh u tin trong opengl.....4 3.2. Xo mn hnh trong opengl......5 3.3. V hnh trong opengl6 3.4. S dng mu v8 3.5. Giao din ca ca s v qun l ca s......10 3.6. Quan st khung nhn.11 3.7. Chut...14 3.8. Th hin to 3 chiu...21 3.9. S dng nh sng trong opengl...25 3.10. V nhiu vt Dng ma trn.31 CHNG 4. V CC I TNG HNH HC C BN TRONG OPENGL.41 4.1 V im, ng, a gic (Point, Line, Polygon)...42 4.1.1. OpenGl to ra im, ng, a gic t cc nh( Vertex).43 4.1.2. Mt s lnh khc........43 4.2. Tp li...44 4.2.2. Pho c tam gic hp l...44 4.3. Php bin i im nhn v bin i m hnh (Verwing and Modeling Transformations).45 4.3.1. Pho bin i im nhn........45 4.3.2. Pho bin i m hnh...46 4.3.3. Cc chuyn i t php bin i im nhn sang bin i m hnh..46 4.3.4. Php bin i cng nhn.........47 4.3.5. iu khin cc ngn xp ma trn...49 Phn B. V d m phng....................51 I. Mi trng lm vic trong ViSualC++51 II- S dng VC++ kt hp vi OpenGl m phng ng hc .56

Phn A. Tm hiu v Opengl


CHNG 1. GII THIU V OPENGL
OpenGL l giao din phn mm hng th tc theo chun cng nghip h tr ho 3 chiu. c pht trin u tin bi Silicon Graphic Inc, bao gm khong 250 cu lnh c h tr bi nhiu ngn ng nh C, C++, Java...cho php ngi lp trnh s dng to ra cc i tng ha. OpenGL c thit k khng ph thuc vo nn tng phn cng cng nh h iu hnh my tnh (independence of hardware platform and operating system) . Vi OpenGL ta s to ra cc m hnh t cc i tng hnh hc c bn l im (point), ng (line) v a gic (polygon). C php lnh ca OpenGL: Cc cu lnh ca OpenGL u s dng tin t gl v cc t tip theo c bt u bng k t hoa, v d glClearColor(). Cc hng c nh ngha bng tin t GL_ tiptheo l cc t vit hoa c ngn cch bng k t gch di, v d GL_COLOR_BUFFER_BIT Cc th vin lin quan ca OpenGL: Mc d OpenGL l mt cng c mnh nhng cc i tng v u l cc i tng hnh hc c bn. n gin ha mt s cng vic, chng ta c trang b thm mt s th vin cho php s dng cc th tc v mc cao hn: - OpenGL Utility Library (GLU): Bao gm mt s th tc thit lp ma trn xc nh hng nhn (viewing orientation), ma trn cc php chiu (projection), v biu din cc mt trong khng gian 3 chiu (redering surfaces) - OpenGL Utility Toolkit (GLUT): L mt b cng c c vit bi Mark Kilgard bao gm cc th tc gip cho n gin ha vic xy dng cc i tng hnh hc. Cc th tc ca GLUT c bt u bng tin t glut.

CHNG 2. CI T OPENGL TRONG VISUAL C++


Lp trnh opengl trong Windows bng Visual C, ta s dng ba th vin sau glaux.lib glu32.lib v opengl32.lib.Trong Visual C mun link ti cc th vin ny ta lm nh sau: trn menu(trnh n) chn Project sau chn setting ri cui cng trong tab link ta nh tn 3 th vin trn vo (gia cc tn ca th vin c du cch) khi to mt project mi ta phi chn Window32 console application v gi ta c th vit m lnh . Ta Down Load : glut-3.7.6-bin.rar 1. Copy v Unzip tp glut-3.7.6-bin.rar 2. Copy tp glut32.dll vo Window\System(Win xp, xp sp3) 3. Copy tp glu.32.lip vo Program File\Microsoft Visual Studio\VC98\ Lip
3

4. Copy tp glut.h vo Program File\Microsoft Visual Studio\VC98\ Include\Gl

CHNG 3. CC THNH PHN C BN CA OPENGL


3.1. Chng trnh u tin trong Opengl

/*filename: hello.c*/ /*Chng trnh u tin to mt ca s trong opengl*/ #ifdef unix /*Phn ny dng xc nh mi trng lm vic ca bn*/ #include <GL/gl.h> /*N s xc nh bn bin dch chng trnh ny trn unix*/ #include aux.h /*hay Windows, vi lp trnh vin trn windows bn c */ #define CALLBACK /*th b phn bn trn i v ch ly phn in m*/ #else #include<windows.h> #include<GL/gl.h> #include<GL/glaux.h> #endif int main(int argc, char *argv[]) { auxInitWindow(argv[0]); return 0; }

Lnh auxInitWindow(string); c tc dng to mt ca s mi, string l tiu ca ca s , bn c th vit tiu nh th no l tu chng ta. Chng trnh ny sau khi bin dch th n mi ch hin ra mt ca s ri ng ngay, nu windows ca ta chy nhanh qu th ta s khng nhn thy g ht Sau y chng ta s bt Window dng li chng 1 giy chng ta quan st.Cng vi m lnh trn bn ch cn thm mt dng lnh: sleep(s_giy_mun_xem x 1000);(tc l lnh ny bt window tm dng trong vng 1 phn nghn giy) 3.2. Xo mn hnh trong opengl

/*filename: clear.cpp*/ #ifdef unix #include <GL/gl.h> #include "aux.h" #define CALLBACK #else #include<windows.h>

#include<GL/gl.h> #include<GL/glaux.h> #endif int main(int argc, char *argv[]) { auxInitWindow(argv[0]); /*Nhng dng lnh mi*/ glClearColor(1.0,1.0,1.0,0.0); glClear(GL_COLOR_BUFFER_BIT); glFlush(); /*Nhng dng lnh mi*/ Sleep(1000); return 0; }

Cc lnh glClearColor(), glClear(),glFush() l nhng lnh c bn ca Opengl.glClearColor() c nhim v chn mu xo window, bn d dng nhn ra l n c 4 tham s, 4 tham s l RGBA( red green blue alpha).Khng ging vi hm RGB() trong Win32 API , 4 tham s ny c gi tr trong khong 0.0f n 1.0f(kiu float).Ba tham s u l mu xanh l cy v xanh da tri, cn tham s th 4 l sng ti ca window. 3.3. V hnh trong opengl - v mt s hnh n gin:
/*filename line.cpp*/ #ifdef unix #include <GL/gl.h> #include "aux.h" #define CALLBACK #else #include<windows.h> #include<GL/gl.h> #include<GL/glaux.h> #endif int main(int argc, char *argv[]) { auxInitWindow(argv[0]); glClearColor(1.0,1.0,1.0,0.0); glClear(GL_COLOR_BUFFER_BIT); /*nhng dng lnh mi*/ glBegin(GL_LINE_LOOP); glVertex2d(0.1,0.1); glVertex2d(0.9,0.1); glVertex2d(0.9,0.9); glVertex2d(0.1,0.9); /*nhng dng lnh mi*/ glEnd(); glFlush(); Sleep(1000); return 0; }

Tt c cc hnh khi c v trong opengl u c nm gia hai dng lnh glBegin() v glEnd().
5

C th c nhiu cp dng lnh nh vy, tc l ta c th vit cc hm v khc nhau v dng cp cu lnh trn trong cc hm .Tham s ca glBegin() l GL_LINE_LOOP c ngha l n bo window v mt ng khp kn im u trng vi im cui. Di y l mt s hng s c bn: Hng s ngha GL_POINT V im GL_LIN V ng thng ni hai im GL_LINE_STRIP Tp hp ca nhng on c ni vi nhau GL_LINE_LOOP ng gp khc khp kn GL_TRIANGLES V hnh tam gic GL_QUADS V t gic GL_TRIANGLES_STRIP V mt tp hp cc tam gic lin nhau, chung mt cnh GL_QUAD_STRIP V mt tp hp cc t gic lin nhau, chung mt cnh GL_TRIANGLE_FAN V hnh qut Di y l bc tranh ton cnh v cc thng s ny.

Hm glVertex2d() xc nh im hai chiu.chng ta nn bit mt s tin t cc hm ca opengl, cc hm dng th vin no s bt u bng tn ca th vin v d dng cc hm c bn ca opengl th thng l bt u vi gl, cc hm dng th vin glut th bt u vi glu cc hm dng th vin aux th bt u vi aux......Cc hm cng c hu t v d glVertex2d() l v im 2 chiu, glVertex3d() l v im 3 chiu,.... 3.4. S dng mu v - m ngun:
/*filename: color1.cpp*/ #ifdef unix #include <GL/gl.h> #include "aux.h" #define CALLBACK #else #include<windows.h> #include<GL/gl.h> #include<GL/glaux.h> #endif int main(int argc, char *argv[]) { auxInitDisplayMode(AUX_RGBA); /*hm mi*/ auxInitWindow(argv[0]); glClearColor(0.0,0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT); glColor3d(1.0,0.0,0.0); /*hm mi*/ glClearColor(0.0,0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_QUADS); /*tham s mi*/ glVertex2d(0.1,0.1); glVertex2d(0.9,0.1); glVertex2d(0.9,0.9); glVertex2d(0.1,0.9); glEnd(); glFlush(); Sleep(1000); return 0; }

Hm auxInitDisplayMode() bo vi window rng chng ta chn cch hin th nhng g m chng ta sp v ti y, tham s ca n l AUX_RGBA chnh l mode RGBA m nhm chng ti cp trn. Hm glColor3d() cho php chng ta chn mu v, tham s ca n l red green v blue nhng cc gi tr ny l kiu double nu ta mun dng kiu float th c hm glColor3f(), c hai kiu trn gi tr ca mu vn nm trong khong 0 n 1. Ch l chng trnh trn chng ta i tham s mi cho hm glBegin(), by gi n s v mt t gic, v trong chng trnh ny th l mt hnh vung. Trong phn ny nhm ti mun trnh by mt k thut na, chng trnh trn ch cho chng ta nhn thy mt mu do chng ta t mt mu duy nht trc khi v. c th to nhiu mu n tng bn c th ci t i ci t li hm glColor3d() mi khi chng ta v mi.
7

Di y l m ngun:

/*filename: color2.cpp*/ #ifdef unix #include <GL/gl.h> #include "aux.h" #define CALLBACK #else #include<windows.h> #include<GL/gl.h> #include<GL/glaux.h> #endif int main(int argc, char *argv[]) { auxInitDisplayMode(AUX_RGBA); auxInitWindow(argv[0]); glClearColor(0.0,0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT); glClearColor(0.0,0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_QUADS); glColor3d(1.0,0.0,0.0); /*hm ny glVertex2d(0.1,0.1); glColor3d(0.0,1.0,0.0); /*tham s glVertex2d(0.9,0.1); glColor3d(0.0,0.0,1.0); /*tham s glVertex2d(0.9,0.9); glColor3d(1.0,0.0,1.0); /*tham s glVertex2d(0.1,0.9); glEnd(); glFlush(); Sleep(1000); return 0; }

c chuyn xung y*/ mi cho hm*/ mi cho hm*/ mi cho hm*/

Bin dch v chy th bn c mt hnh vung trng kh p mt Ngoi ra , cch s dng hm, vi cc hu t: v d vi hm glVertex*() v glColor*(), hay cc hm khc c du hoa th * th n c th c rt nhiu hu t.V n c cu to nh sau: ly v d hm glVertex*() C hm glVertex4dv(Gldouble x,Gldouble y,Gldouble z,Gldouble w) s 4 th hin rng hm c 4 tham s, ch d th hin rng tham s c gi tr double(ngoi ra n cn c th l float,int,short, unsigned int, unsigned short, unsigned char,char) ch v th hin rng n dng pointer. 3.5. Giao din ca ca s v qun l ca s: Vi nhng chng trnh ch cn v n gin th ta c th dng cc chng trnh trn, nhng vi cc chng trnh phc tp sau ny chng ta khng th vit nh th c na. Di y nhm ti s trnh by cu trc ca chng trnh trong opengl. Trc ht l t kho CALLBACK, nu lp trinh WIN API th c th hiu r c lnh ny, nhng c th ni n gin l khi s dng th vin AUX th ta phi dng t kho ny ch nh n.Cc chng trnh bn trn chng ta vit u dng
8

lnh Sleep(1000) bt window dng li cho chng ta theo di, sp ti y chng ta s lm mt cch chuyn nghip hn l dng hm auxMailLoop() trong thn ca hm main() hm chnh ca chng trnh. Tham s ca hm ny l con tr tr n hm m chng ta v , hin th nhng g chng ta mun( trong chng trnh ny tham s chnh l hm draw()). iu g s xy ra nu ngi dng thay i kch c ca ca s. thc hin iu ny chng ta cng dng mt hm tng t nh hm auxMainLoop(), l hm auxReshapeFunc(), tham s ca n cng l con tr ch n hm m chng ta c th thay i thng s ca ca s, tham s ca n trong chng trnh ny l hm resize(). Nu bn hc qua v ho my tnh th s d dng hiu v to trong ho, hm glLoadIdentity() c nhim v thit nh ma trn ca to l ma trn n v. M ngun di y s cho chng ta r hn:
/*filename: interface.cpp*/ #ifdef unix #include <GL/gl.h> #include "aux.h" #define CALLBACK #else #include<windows.h> #include<GL/gl.h> #include<GL/glaux.h> #endif GLvoid CALLBACK draw(void){ /*ch bn c th khng cn ch void trong */ glClearColor(0.0,0.0,0.0,0.0); /*khi lp trnh vi VC, Glvoid l kiu */ glClear(GL_COLOR_BUFFER_BIT);/*hm trong opengl, n tng t */ glClearColor(0.0,0.0,0.0,0.0); /*nh void trong C hay C++*/ glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_QUADS); glColor3d(1.0,0.0,0.0); glVertex2d(0.1,0.1); glColor3d(0.0,1.0,0.0); glVertex2d(0.9,0.1); glColor3d(0.0,0.0,1.0); glVertex2d(0.9,0.9); glColor3d(1.0,0.0,1.0); glVertex2d(0.1,0.9); glEnd(); glFlush(); } GLvoid CALLBACK resize(GLsizei w,GLsizei h) { glLoadIdentity(); } int main(int argc, char *argv[])

auxInitDisplayMode(AUX_RGBA); auxInitWindow(argv[0]); auxReshapeFunc(resize); auxMainLoop(draw); return 0;

3.6. Quan st Khung nhn: Chng trnh trn, khi ta thay i kch c c lc ta khng nhn thy hnh vung m chng ta v na, ti sao li nh vy?Cu tr li nm trong chng trnh di y:
/*filename: view.cpp*/ #ifdef unix #include <GL/gl.h> #include "aux.h" #define CALLBACK #else #include<windows.h> #include<GL/gl.h> #include<GL/glaux.h> #endif GLvoid CALLBACK draw(void){ glClearColor(0.0,0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT); glClearColor(0.0,0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_QUADS); glColor3d(1.0,0.0,0.0); glVertex2d(0.1,0.1); glColor3d(0.0,1.0,0.0); glVertex2d(0.9,0.1); glColor3d(0.0,0.0,1.0); glVertex2d(0.9,0.9); glColor3d(1.0,0.0,1.0); glVertex2d(0.1,0.9); glEnd(); glFlush(); } GLvoid CALLBACK resize(GLsizei w,GLsizei h) { glLoadIdentity(); glViewport(0,0,w,h); /*hm mi*/ glOrtho(-1.0,1.0,-1.0,1.0,0.0,1.0); /*hm mi*/ } int main(int argc, char *argv[]) {

10

auxInitDisplayMode(AUX_RGBA); auxInitWindow(argv[0]); auxReshapeFunc(resize); auxMainLoop(draw); return 0;

Nhm ti s gii thiu th no l Viewport. Viewport xc nh cng nhn cho chng ta, tc l phn khng gian trn ca s window ma ngi quan st c php quan st. N chnh l mt hnh ch nht. Hai tham s u tin ca hm ny xc nh to ca nh trn cng pha tay tri ca hnh ch nht, hai to d sau xc nh chiu rng v chiu cao ca hnh ch nht y. Vi cc tham s trn ta c th thy , chng trnh trn cho php ta quan st ton b mn hnh. Tip theo l kiu nhn glOrtho(). Quan st hnh v di y:

Nh thy trn hnh, hm glOrtho(), xc lp mt ma trn cho php chng ta nhn theo kiu nh hnh v, y l hm tng qut: void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far); Tng ng vi chng trnh trn ca chng ta left l 1.0, right l 1.0, bottom l 1.0, top l 1.0, near l 0.0 v far l 1.0. Trong phn ny nhm ti mun trnh by thm mt hm s na.Cc chng trnh trn u to ca s vi chiu di v rng xc inh, mun to mt ca s c kch c theo mun bn dng hm sau: auxInitPosition(), n c 4 thng s l to x, y ca nh trn bn tay tri ca ca s, chiu rng v chiu di ca ca s.Di y l m ngun:
/*filename : size.cpp*/ #ifdef unix #include <GL/gl.h> #include "aux.h" #define CALLBACK

11

#else #include<windows.h> #include<GL/gl.h> #include<GL/glaux.h> #endif GLvoid CALLBACK draw(void){ glClearColor(0.0,0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT); glClearColor(0.0,0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_QUADS); glColor3d(1.0,0.0,0.0); glVertex2d(0.1,0.1); glColor3d(0.0,1.0,0.0); glVertex2d(0.9,0.1); glColor3d(0.0,0.0,1.0); glVertex2d(0.9,0.9); glColor3d(1.0,0.0,1.0); glVertex2d(0.1,0.9); glEnd(); glFlush(); } GLvoid CALLBACK resize(GLsizei w,GLsizei h) { glLoadIdentity(); glViewport(0,0,w/2,h/2); glOrtho(-1.0,1.0,-1.0,1.0,0.0,1.0); } int main(int argc, char *argv[]) { auxInitPosition(200,100,640,480); auxInitDisplayMode(AUX_RGBA); auxInitWindow(argv[0]); auxReshapeFunc(resize); auxMainLoop(draw); return 0; }

/*hm mi*/

3.7. Chut: Trong cc tr chi ta u thy s quan trng ca vic s dng chut, trong phn ny chng ta s xem xt lm th no chng trnh chng ta nhn ra chng ta ang bm tri chut, chng ta ang di chuyn chut. lm c iu ny chng ta s dng hm auxMouseFunc(). Di y l m ngun ca chng trnh mouse.cpp
/*filename mouse.cpp*/ #ifdef unix #include <GL/gl.h> #include "aux.h" #define CALLBACK #else

12

#include<windows.h> #include<GL/gl.h> #include<GL/glaux.h> #include"stdio.h" /*nu bn khng c dng ny th hm printf() khng thc hin*/ #endif GLvoid CALLBACK draw(void){ glClearColor(0.0,0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT); glClearColor(0.0,0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_QUADS); glColor3d(1.0,0.0,0.0); glVertex2d(0.1,0.1); glColor3d(0.0,1.0,0.0); glVertex2d(0.9,0.1); glColor3d(0.0,0.0,1.0); glVertex2d(0.9,0.9); glColor3d(1.0,0.0,1.0); glVertex2d(0.1,0.9); glEnd(); glFlush(); } GLvoid CALLBACK left(AUX_EVENTREC *event) { printf("%d,%d\n",event->data[AUX_MOUSEX],event->data[AUX_MOUSEY]); } GLvoid CALLBACK resize(GLsizei w,GLsizei h) { glLoadIdentity(); glViewport(0,0,w/2,h/2); glOrtho(-1.0,1.0,-1.0,1.0,0.0,1.0); } int main(int argc, char *argv[]) { auxInitPosition(200,100,640,480); auxInitDisplayMode(AUX_RGBA); auxInitWindow(argv[0]); auxReshapeFunc(resize); /*hm mi*/ auxMouseFunc(AUX_LEFTBUTTON,AUX_MOUSEDOWN,left); /*hm mi*/ auxMainLoop(draw); return 0; }

Trong chng trnh trn , chng ta thy xut hin hm left() v hm auxMouseFunc(). Hm auxMouseFunc() c gi n hm left(), n c ngha rng, khi chut c bm th s thc hin hm left(). Trong tham s ca hm auxMouseFunc() c cc tham s sau: tham s u tin ni n phn no ca chut c tc ng, tham s th 2 ni n n c tc ng nh th no, v tham s cui cng mun ni tc ng ri th lm g. Trong hm left() tham s c dng con tr v
13

c kiu l AUX_EVENTREC, n ly d liu v to x v y ca chut. Trong mt chng trnh khng phi l ch c mt hm auxMouseFunc() m bn c th dng bao nhiu tu thch, min l ng va chm nhau l c, trong phn m ngun chng ti c cho thm mt chng trnh v d v cch dng 2 ln hm auxMouseFunc()(trong file mouse2.cpp) Di y ti s trnh by mt chng trnh kh th v , m ngun ca n nh sau:
/*filename connectlines.cpp*/ #ifdef unix #include <GL/gl.h> #include "aux.h" #define CALLBACK #else #include<windows.h> #include<GL/gl.h> #include<GL/glaux.h> #include"stdio.h" #endif GLvoid CALLBACK draw(void){ } GLvoid CALLBACK left(AUX_EVENTREC *event) { static int flag=0; static GLint x,y; if(flag){ glColor3d(0.0,0.0,0.0); glBegin(GL_LINE_STRIP); glVertex2i(x,y); glVertex2i(event->data[AUX_MOUSEX],event->data[AUX_MOUSEY]); glEnd(); glFlush(); } x=event->data[AUX_MOUSEX]; y=event->data[AUX_MOUSEY]; flag=1; } GLvoid CALLBACK resize(GLsizei w,GLsizei h) { glLoadIdentity(); glViewport(0,0,w,h); glOrtho(0.0,(GLdouble)w,(GLdouble)h,0.0,0.0,1.0);/* i thng s*/ glClearColor(1.0,1.0,1.0,0.0); /*chuyn v tr 2 hm ny*/ glClear(GL_COLOR_BUFFER_BIT); } int main(int argc, char *argv[]) { auxInitPosition(200,100,640,480); auxInitDisplayMode(AUX_RGBA);

14

auxInitWindow(argv[0]); auxReshapeFunc(resize); auxMouseFunc(AUX_LEFTBUTTON,AUX_MOUSEDOWN,left); auxMainLoop(draw); return 0;

Thc ra chng trnh ny rt d hiu, c l khng phi trnh by g nhiu. N lu c im li v ni thnh mt ng gp khc.Nhc im ca chng trnh trn hn cc bn r khi bin dch n.N khng v li ca s ca bn khi ca s ca bn b che bi mt ca s khc, hay b minimize, tc l hnh m ta mun v khng c gi ti hm draw(). V vy bn phi lu nhng im chn v v li chng trong hm draw().Di y l m ngun:
/*filename connectlines1.cpp*/ #ifdef unix #include <GL/gl.h> #include "aux.h" #define CALLBACK #else #include<windows.h> #include<GL/gl.h> #include<GL/glaux.h> #endif #define MAXPOINTS 100 GLint point[MAXPOINTS][2]; int num=0; ti*/ GLvoid CALLBACK draw(void) { int i; if(num>=2){ glClearColor(1.0,1.0,1.0,0.0); glClear(GL_COLOR_BUFFER_BIT); glColor3d(0.0,0.0,0.0); glBegin(GL_LINE_STRIP); /*bn hy nh cu trc ny*/ for(i=0;i<num;i++) { glVertex2iv(point[i]); } glEnd(); glFlush(); } } GLvoid CALLBACK left(AUX_EVENTREC *event) { if(num>=MAXPOINTS) return; bn v */ point[num][0]=event->data[AUX_MOUSEX]; chut*/ point[num][1]=event->data[AUX_MOUSEY]; chut*/ /*s im ti a c th c chn*/ /*mng lu tr cc im */ /*s im chn n thi im hin

/*gii hn s im /*lu tr to x ca /*lu tr to y ca

15

num++; ln bm*/ }

/*tng s im sau mi

GLvoid CALLBACK resize(GLsizei w,GLsizei h) { glLoadIdentity(); glViewport(0,0,w,h); glOrtho(0.0,(GLdouble)w,(GLdouble)h,0.0,0.0,1.0); } int main(int argc, char *argv[]) { auxInitPosition(200,100,640,480); auxInitDisplayMode(AUX_RGBA); auxInitWindow(argv[0]); auxReshapeFunc(resize); auxMouseFunc(AUX_LEFTBUTTON,AUX_MOUSEDOWN,left); auxMainLoop(draw); return 0; }

By gi bn khng phi lo n vic ca s khng chu v li khi n b che mt. Mt iu cng ng ch trong chng trnh trn l chng ta s dng hm glVertex2iv() hm ny c tham s l thnh vin ca mng v thnh vin ca mng c cc gi tr x,y l s nguyn, ch i trong phn hu t ca hm trn biu hin cho gi tr nguyn cn ch v biu hin cho kiu pointer. Di y cung cp mt chng trnh c th v c c nhng ng gp khc v cc a gic. M ngun khng c g phc tp v ng bn y c, n ch l cch sp xp d liu v c thm mt hm right() m cp cc phn trn.
/*filename connectlines2.cpp*/ #ifdef unix #include <GL/gl.h> #include "aux.h" #define CALLBACK #else #include<windows.h> #include<GL/gl.h> #include<GL/glaux.h> #endif #define MAXPOINTS 100 GLint point[MAXPOINTS][2]; int num=0; int flag=0; GLvoid CALLBACK draw(void) { int i; if(num>=2){ if(flag){ flag=0; i=num-2; glColor3d(0.0,0.0,0.0);

16

} else{

glBegin(GL_LINE_STRIP);

} }

i=0; glClearColor(1.0,1.0,1.0,0.0); glClear(GL_COLOR_BUFFER_BIT); glColor3d(0.0,0.0,0.0); glBegin(GL_POLYGON); } for(;i<num;i++) { glVertex2iv(point[i]); } glEnd(); glFlush();

GLvoid CALLBACK left(AUX_EVENTREC *event) { if(num>=MAXPOINTS) return; point[num][0]=event->data[AUX_MOUSEX]; point[num][1]=event->data[AUX_MOUSEY]; num++; flag=1; } GLvoid CALLBACK right(AUX_EVENTREC *event) { draw(); } GLvoid CALLBACK resize(GLsizei w,GLsizei h) { glLoadIdentity(); glViewport(0,0,w,h); glOrtho(0.0,(GLdouble)w,(GLdouble)h,0.0,0.0,1.0); glClearColor(1.0,1.0,1.0,0.0); glClear(GL_COLOR_BUFFER_BIT); } int main(int argc, char *argv[]) { auxInitPosition(200,100,640,480); auxInitDisplayMode(AUX_RGBA); auxInitWindow(argv[0]); auxReshapeFunc(resize); auxMouseFunc(AUX_LEFTBUTTON,AUX_MOUSEDOWN,left); auxMouseFunc(AUX_RIGHTBUTTON,AUX_MOUSEDOWN,right); auxMainLoop(draw); return 0; }

17

3.8. Th hin to 3 chiu: n gi ta mi bit n to 2 chiu trong opengl, nu ch c vy th chng khc g trong lp trnh Window c.V vy trong phn ny chng ta s cng xem opengl v cc hnh 3 chiu nh th no.
/*filename : rotated45.cpp*/ #ifdef unix #include <GL/gl.h> #include "aux.h" #define CALLBACK #else #include<windows.h> #include<GL/gl.h> #include<GL/glaux.h> #endif GLvoid CALLBACK draw(void) { glClearColor(0.0,0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT); glRotated(45,0.0,1.0,0.0); glBegin(GL_QUADS); glColor3d(1.0,0.0,0.0); glVertex2d(0.1,0.1); glColor3d(0.0,1.0,0.0); glVertex2d(0.9,0.1); glColor3d(0.0,0.0,1.0); glVertex2d(0.9,0.9); glColor3d(1.0,0.0,1.0); glVertex2d(0.1,0.9); glEnd(); glFlush(); }

/*quay quanh trc OY 45 */

GLvoid CALLBACK resize(GLsizei w,GLsizei h) { glLoadIdentity(); glViewport(0,0,w,h); glOrtho(-1.0,1.0,-1.0,1.0,0.0,1.0); } int main(int argc, char *argv[]) { auxInitPosition(200,100,640,480); auxInitDisplayMode(AUX_RGBA); auxInitWindow(argv[0]); auxReshapeFunc(resize); auxMainLoop(draw); return 0; }

Chng trnh ny khng c g c bit ngoi hm glRotated() , hm ny cho php chng ta quay hnh t gic ca chng ta quanh trc OY vi gc quay 45 .Tham s u tin ca n l gc s c quay, 3 tham s sau l tham s ca vector m hnh
18

ca chng ta s quay vi gc quay trn.Ta nhn thy rng cc gi tr ca vector chng ta l : to x bng 0, to y bng 1, to z bng 0. Tc l vct ca chng ta thng ng theo trc OY, ta c th thay i cc thng s ca vector ny kim nghim hm ny xem . Cc gi tr ca cc thng s ny l kiu double.(Ch nu khng th cc thng s khc th bn s rt kh quan st hm ny hot ng nh th no ) Tip theo nhm ti xin trnh by cch v mt hnh lp phng tht s bng opengl.
/*filename cube1.cpp*/ #ifdef unix #include <GL/gl.h> #include "aux.h" #define CALLBACK #else #include<windows.h> #include<GL/gl.h> #include<GL/glaux.h> #endif GLdouble vertex[][3]={ phng*/ {0.0,0.0,0.0}, {1.0,0.0,0.0}, {1.0,1.0,0.0}, {0.0,1.0,0.0}, {0.0,0.0,1.0}, {1.0,0.0,1.0}, {1.0,1.0,1.0}, {0.0,1.0,1.0} }; int edge[][2]={ {0,1}, {1,2}, {2,3}, {0,3}, {4,5}, {5,6}, {6,7}, {7,4}, {0,4}, {1,5}, {2,6}, {3,7} }; /*Khai bo d liu cho tm nh ca hnh lp

/*Khai bo cc cnh, m chng ta s s dng d liu*/ /*ca cc nh bn trn*/

GLvoid CALLBACK draw(void) { int i; glClearColor(0.0,0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT); glColor3d(1.0,1.0,1.0);

19

glBegin(GL_LINES); for(i=0;i<12;i++){ glVertex3dv(vertex[edge[i][0]]); glVertex3dv(vertex[edge[i][1]]); } glEnd(); glFlush();

/*hm mi*/ /*hm mi*/

GLvoid CALLBACK resize(GLsizei w,GLsizei h) { glLoadIdentity(); glViewport(0,0,w,h); glOrtho(-2.0,2.0,-2.0,2.0,0.0,2.0); //gluPerspective(30.0,1.0,1.0,10.0); //gluLookAt(3.0,4.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0); } int main(int argc, char *argv[]) { auxInitPosition(200,100,512,512); auxInitDisplayMode(AUX_RGBA); auxInitWindow(argv[0]); auxReshapeFunc(resize); auxMainLoop(draw); return 0; }

Phn khai bo d liu, iu ng ni th nht l chng ta dng hm glVertex3dv() thay cho cc hm v nh 2 chiu trc y, hm ny nhn tham s l thnh vin ca mng, gi tr ca cc thnh vin phi l double, v n c to 3 chiu. Trc ht bin dch chng trnh trn, ta cha thy g nu khng cho hai hm m nhm ti nh du bn trn vo, hy nh li cch quan st bng glOrtho() trc y v d dng nhn thy chng ta khng th nhn thy ton b hnh lp phng c m ch l mt hnh vung, v cch nhn bng glOrtho() ch cho ta nhn song song thi. Chnh v vy m chng ta phi chuyn qua cch quan st bng gluPerspective(), bn tham s ca n c trnh by nh sau:

20

void gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble near, GLdouble far); Tham s u tin l gc quan st trong mt phng XOZ, trong v d trn gc l 30, tham s th hai l t l gia w v h, n bng w/h, tham s th 3 v th 4 th hn cc bn quen khi quan st bng glOrtho().Nu ch c hm ny khng th chng ta vn cha quan st c hnh lp phng m chng ta v. quan st c chng ta phi dng thm hmgluLookAt() Hm ny c ti 9 tham s, nhng thc ra n nm trong 3 tham s chnh.Tham s u tin l v tr ca mt, cng c th coi l v tr ca camera(ch l trong to 3 chiu, nn v tr ca mt cha 3 to ), tham s th 2 l im nhn, v tham s th 3 gi l upvector, t ny khng bit dch ra ting vit ra sao. Upvector , hy tng tng bn ang theo di mt vt, upvector chnh l vector t tim bn ln nh u, nu thay i s liu cng tng t nh bn nghing u sang phi sang tri. Vy l 9 tham s r, by gi hy b lnh glOrtho() i v cho 2 lnh nh du vo, chng ta s quan st c hnh lp phng , m ngun nm trong file cube2.cpp 3.9. S dng nh sng trong opengl. xc nh mt no c chiu sng v vi cng sng bao nhiu, ngi ta dng vc t php tuyn (normal vector). Trong chng trnh di y s gii thiu cch dng vc t ny. M ngun:
/*filename: light1.cpp*/ #ifdef unix #include <GL/gl.h> #include "aux.h" #define CALLBACK #else #include<windows.h> #include<GL/gl.h> #include<GL/glaux.h> #endif #include<GL/glu.h> GLdouble vertex[][3]={ {0.0,0.0,0.0}, {1.0,0.0,0.0}, {1.0,1.0,0.0}, {0.0,1.0,0.0}, {0.0,0.0,1.0}, {1.0,0.0,1.0}, {1.0,1.0,1.0}, {0.0,1.0,1.0} }; int face[][4]={ {0,1,2,3},

21

};

{1,5,6,2}, {5,4,7,6}, {4,0,3,7}, {4,5,1,0}, {3,2,6,7}

GLdouble normal[][3]={ {0.0,0.0,-1.0}, {1.0,0.0,0.0}, {0.0,0.0,1.0}, {-1.0,0.0,0.0}, {0.0,-1.0,0.0}, {0.0,1.0,0.0} }; GLvoid CALLBACK none(void) { } GLvoid CALLBACK draw(void) { int i,j; static int r=0; glClearColor(0.0,0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity(); gluLookAt(3.0,4.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0); glRotated((double)r,0.0,1.0,0.0); glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHTING); /*tham s mi*/ glEnable(GL_LIGHT0); /*tham s mi*/ glBegin(GL_QUADS); for(i=0;i<6;i++){ glNormal3dv(normal[i]); /*hm mi*/ for(j=0;j<4;j++){ glVertex3dv(vertex[face[i][j]]); } } glEnd(); glDisable(GL_LIGHT0); /*tham s mi*/ glDisable(GL_LIGHTING); /*tham s mi*/ glDisable(GL_DEPTH_TEST); auxSwapBuffers(); if(++r>=360) r=0; } GLvoid CALLBACK resize(GLsizei w,GLsizei h) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); glViewport(0,0,w,h);

22

gluPerspective(30.0,1.0,1.0,10.0); glMatrixMode(GL_MODELVIEW); } int main(int argc, char *argv[]) { auxInitPosition(200,100,512,512); auxInitDisplayMode(AUX_RGBA|AUX_DOUBLE|AUX_DEPTH); auxInitWindow(argv[0]); auxReshapeFunc(resize); auxIdleFunc(draw); glCullFace(GL_BACK); auxMainLoop(none); return 0; }

Thng s mi trong hm glEnable() v glDisable(), cc thng s ny cho php chng ta s dng nh sng trong khi to vt. Opengl cung cp cho chng ta 8 ngun sng m chng trnh trn mi ch s dng mt ngun sng LIGHT0, hm glNormal3dv() thit lp vc t php tuyn cho mi mt chng ta v, v th khi vt th quay quanh trc th ta s thy sng ti thay i. Trong chng trnh light0.cpp trn chng ta khng s dng mu nn mu s c xc nh l mu mc nh nh cc bn thy. Tip theo y ti xin gii thiu cch s dng vt liu to vt vi cc mu sc n tng khc nhau.Chng ta khai bo d liu sau:
GLfloat GLfloat GLfloat GLfloat ambient[]={ 0.2,0.2,0.2,1.0}; diffuse[]={ 0.8,0.0,0.0,1.0}; specular[]={0.5,0.5,0.5,1.0}; shininess=40.0;

Trong cc thng s trn u c t theo h RGBA(nh cp cc phn trn), chnh v th m chng c 4 gi tr.Thng s ambient biu hin cho sng ca mi trng bn ngoi, diffuse l khuch tn, specular l phn x v shininess l bng( bng sng). Cc thng s trn c hm glMaterial*() s dng to vt th ca chng ta.Hy quan st cch khai bo hm trn:
glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,ambient); glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,diffuse); glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,specular); glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,shininess);

Ch l lnh cui cng khng phi l fv nh bnh thng, v shininess ch l mt s. y l m ngun ca chng trnh.
/*filename light1.cpp*/ #ifdef unix #include <GL/gl.h> #include "aux.h" #define CALLBACK

23

#else #include<windows.h> #include<GL/gl.h> #include<GL/glaux.h> #endif #include<GL/glu.h> GLdouble vertex[][3]={ {0.0,0.0,0.0}, {1.0,0.0,0.0}, {1.0,1.0,0.0}, {0.0,1.0,0.0}, {0.0,0.0,1.0}, {1.0,0.0,1.0}, {1.0,1.0,1.0}, {0.0,1.0,1.0} }; int face[][4]={ {0,1,2,3}, {1,5,6,2}, {5,4,7,6}, {4,0,3,7}, {4,5,1,0}, {3,2,6,7} }; GLdouble normal[][3]={ {0.0,0.0,-1.0}, {1.0,0.0,0.0}, {0.0,0.0,1.0}, {-1.0,0.0,0.0}, {0.0,-1.0,0.0}, {0.0,1.0,0.0} }; GLfloat GLfloat GLfloat GLfloat ambient[]={ 0.2,0.2,0.2,1.0}; diffuse[]={ 0.8,0.0,0.0,1.0}; specular[]={0.5,0.5,0.5,1.0}; shininess=40.0;

GLvoid CALLBACK none(void) { } GLvoid CALLBACK draw(void) { int i,j; static int r=0; glClearColor(0.0,0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity(); gluLookAt(3.0,4.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0); glRotated((double)r,0.0,1.0,0.0);

24

glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,ambient); glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,diffuse); glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,specular); glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,shininess); glBegin(GL_QUADS); for(i=0;i<6;i++){ glNormal3dv(normal[i]); for(j=0;j<4;j++){ glVertex3dv(vertex[face[i][j]]); } } glEnd(); glDisable(GL_LIGHT0); glDisable(GL_LIGHTING); glDisable(GL_DEPTH_TEST); auxSwapBuffers(); if(++r>=360) r=0; } GLvoid CALLBACK resize(GLsizei w,GLsizei h) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); glViewport(0,0,w,h); gluPerspective(30.0,1.0,1.0,10.0); glMatrixMode(GL_MODELVIEW); } int main(int argc, char *argv[]) { auxInitPosition(200,100,512,512); auxInitDisplayMode(AUX_RGBA|AUX_DOUBLE|AUX_DEPTH); auxInitWindow(argv[0]); auxReshapeFunc(resize); auxIdleFunc(draw); glCullFace(GL_BACK); auxMainLoop(none); return 0; }

3.10. V nhiu vt - Dng Ma trn.


- M Ngun :
void cube() { int i,j;

25

glBegin(GL_QUADS); for(i=0;i<6;i++){ glNormal3dv(normal[i]); for(j=0;j<4;j++){ glVertex3dv(vertex[face[i][j]]); } } glEnd(); }

V im nhn khng thay i nn khi c ca window thay i ta cng phi thay i theo. Di y l m ngun thay i khung nhn ca chng ta:
GLvoid CALLBACK resize(GLsizei w,GLsizei h) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); glViewport(0,0,w,h); gluPerspective(30.0,1.0,1.0,10.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(3.0,4.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0); }

Ch l hai hm cui trong hm trn c chuyn t hm draw() sang. Nu thit t ma trn nh trn th khi hm glRotated() lm thay i v tr ca vt s lm cho window ca chng ta tr nn khng bnh thng. V vy trc khi dng hm glRotated() th chng ta phi lu ma trn vo ri kh thc hin xong hm ny ta li tr li ma trn th s bnh thng. lm vic ny chng ta s dng 2 hm glPushMatrix() v glPopMatrix(). M ngun c trnh by di y.
/*filename matrix1.cpp*/ #ifdef unix #include <GL/gl.h> #include "aux.h" #define CALLBACK #else #include<windows.h> #include<GL/gl.h> #include<GL/glaux.h> #endif #include<GL/glu.h> GLdouble vertex[][3]={ {0.0,0.0,0.0}, {1.0,0.0,0.0}, {1.0,1.0,0.0}, {0.0,1.0,0.0}, {0.0,0.0,1.0}, {1.0,0.0,1.0}, {1.0,1.0,1.0}, {0.0,1.0,1.0} };

26

int face[][4]={ {0,1,2,3}, {1,5,6,2}, {5,4,7,6}, {4,0,3,7}, {4,5,1,0}, {3,2,6,7} }; GLdouble normal[][3]={ {0.0,0.0,-1.0}, {1.0,0.0,0.0}, {0.0,0.0,1.0}, {-1.0,0.0,0.0}, {0.0,-1.0,0.0}, {0.0,1.0,0.0} }; void cube() { int i,j; glBegin(GL_QUADS); for(i=0;i<6;i++){ glNormal3dv(normal[i]); for(j=0;j<4;j++){ glVertex3dv(vertex[face[i][j]]); } } glEnd(); } GLvoid CALLBACK none(void) { } GLvoid CALLBACK draw(void) { static int r=0; glClearColor(0.0,0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glPushMatrix(); glRotated((double)r,0.0,1.0,0.0); cube(); glPopMatrix(); glDisable(GL_LIGHT0); glDisable(GL_LIGHTING); glDisable(GL_DEPTH_TEST); auxSwapBuffers(); if(++r>=360) r=0;

27

} GLvoid CALLBACK resize(GLsizei w,GLsizei h) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); glViewport(0,0,w,h); gluPerspective(30.0,1.0,1.0,10.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(3.0,4.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0); } int main(int argc, char *argv[]) { auxInitPosition(200,100,512,512); auxInitDisplayMode(AUX_RGBA|AUX_DOUBLE|AUX_DEPTH); auxInitWindow(argv[0]); auxReshapeFunc(resize); auxIdleFunc(draw); glCullFace(GL_BACK); auxMainLoop(none); return 0; } By gi ta s tm cch v hai hnh lp phng m khng mt cng v li tng mt ca hnh lp phng mi na. lm c iu ny bn dng hm glTranslated(), hm ny c 3 thng s, n c nhim v chuyn ta n v tr mi v(qua ba thng s ca n).Thc ra n nhn ma trn hin ti vi mt ma trn khc chuyn to cho chng ta, v th m chng ta s phi dng 2 ln cc hm glPushMatrix() v glPopMatrix().Hy nh l bao nhiu ln gi hm glPushMatrix() th cng phi tng y ln gi hm glPopmatrix().Di y l m ngun: /*filename matrix2.cpp*/ #ifdef unix #include <GL/gl.h> #include "aux.h" #define CALLBACK #else #include<windows.h> #include<GL/gl.h> #include<GL/glaux.h> #endif #include<GL/glu.h> GLdouble vertex[][3]={ {0.0,0.0,0.0}, {1.0,0.0,0.0}, {1.0,1.0,0.0}, {0.0,1.0,0.0}, {0.0,0.0,1.0}, {1.0,0.0,1.0}, {1.0,1.0,1.0}, {0.0,1.0,1.0}

28

}; int face[][4]={ {0,1,2,3}, {1,5,6,2}, {5,4,7,6}, {4,0,3,7}, {4,5,1,0}, {3,2,6,7} }; GLdouble normal[][3]={ {0.0,0.0,-1.0}, {1.0,0.0,0.0}, {0.0,0.0,1.0}, {-1.0,0.0,0.0}, {0.0,-1.0,0.0}, {0.0,1.0,0.0} }; void cube() { int i,j; glBegin(GL_QUADS); for(i=0;i<6;i++){ glNormal3dv(normal[i]); for(j=0;j<4;j++){ glVertex3dv(vertex[face[i][j]]); } } glEnd(); } GLvoid CALLBACK none(void) { } GLvoid CALLBACK draw(void) { static int r=0; glClearColor(0.0,0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glPushMatrix(); glRotated((double)r,0.0,1.0,0.0); cube(); glPushMatrix(); glTranslated(1.0,1.0,1.0); cube(); glPopMatrix(); glPopMatrix();

29

glDisable(GL_LIGHT0); glDisable(GL_LIGHTING); glDisable(GL_DEPTH_TEST); auxSwapBuffers(); if(++r>=360) r=0;

GLvoid CALLBACK resize(GLsizei w,GLsizei h) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); glViewport(0,0,w,h); gluPerspective(30.0,1.0,1.0,10.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(3.0,4.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0); } int main(int argc, char *argv[]) { auxInitPosition(200,100,512,512); auxInitDisplayMode(AUX_RGBA|AUX_DOUBLE|AUX_DEPTH); auxInitWindow(argv[0]); auxReshapeFunc(resize); auxIdleFunc(draw); glCullFace(GL_BACK); auxMainLoop(none); return 0; }

Tip theo chng ta s cho hnh lp phng th hai quay vi vn tc khc, vn tc mi ca n l 2*r, lm c iu ny bn ch cn thm hm glRotated((double) (2*r),0.0,1.0,0.0); vo sau hm glTranslated(1.0,1.0,1.0); v trc hm cube() th hai. M ngun nm trong file matrix3.cpp. By gi hy cng t mu cho chng.
/*filename matrix4.cpp*/ #ifdef unix #include <GL/gl.h> #include "aux.h" #define CALLBACK #else #include<windows.h> #include<GL/gl.h> #include<GL/glaux.h> #endif #include<GL/glu.h> GLdouble vertex[][3]={ {0.0,0.0,0.0},

30

};

{1.0,0.0,0.0}, {1.0,1.0,0.0}, {0.0,1.0,0.0}, {0.0,0.0,1.0}, {1.0,0.0,1.0}, {1.0,1.0,1.0}, {0.0,1.0,1.0}

int face[][4]={ {0,1,2,3}, {1,5,6,2}, {5,4,7,6}, {4,0,3,7}, {4,5,1,0}, {3,2,6,7} }; GLdouble normal[][3]={ {0.0,0.0,-1.0}, {1.0,0.0,0.0}, {0.0,0.0,1.0}, {-1.0,0.0,0.0}, {0.0,-1.0,0.0}, {0.0,1.0,0.0} }; void cube() { int i,j; glBegin(GL_QUADS); for(i=0;i<6;i++){ glNormal3dv(normal[i]); for(j=0;j<4;j++){ glVertex3dv(vertex[face[i][j]]); } } glEnd(); } GLvoid CALLBACK none(void) { } GLvoid CALLBACK draw(void) { static int r=0; static GLfloat red[]={ 1.0,0.0,0.0,1.0}; static GLfloat blue[]={ 0.0,0.0,1.0,1.0}; glClearColor(0.0,0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glPushMatrix();

31

glRotated((double)r,0.0,1.0,0.0); glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,red); cube(); glPushMatrix(); glTranslated(1.0,1.0,1.0); glRotated((double)(2*r),0.0,1.0,0.0); glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,blue); cube(); glPopMatrix(); glPopMatrix(); glDisable(GL_LIGHT0); glDisable(GL_LIGHTING); glDisable(GL_DEPTH_TEST); auxSwapBuffers(); if(++r>=360) r=0;

GLvoid CALLBACK resize(GLsizei w,GLsizei h) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); glViewport(0,0,w,h); gluPerspective(30.0,1.0,1.0,10.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(3.0,4.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0); } int main(int argc, char *argv[]) { auxInitPosition(200,100,512,512); auxInitDisplayMode(AUX_RGBA|AUX_DOUBLE|AUX_DEPTH); auxInitWindow(argv[0]); auxReshapeFunc(resize); auxIdleFunc(draw); glCullFace(GL_BACK); auxMainLoop(none); return 0; }

n y th khng cn gii thch g ta cng hiu chng trnh ny.

32

CHNG 4. V CC I TNG HNH HC C BN TRONG OPENGL


4.1. V im, ng, a gic (Point, Line, Polygon) 4.1.1 OpenGL to ra im, ng, a gic t cc nh (Vertex).

Cc nh c lit k gia hai hm :


glBegin(tham s) . glEnd();

Danh sch cc tham s c lit k trong bng 2.1 GL_PONT GL_LINES GL_POLYGON GL_TRIANGLES GL_QUADS GL_LINE_SRIP GL_LINE_LOOP GL_TRIANGLE_STRIP GL_TRIANGLE_FAN GL_QUAD_STRIP Cc im on thng a gic li Tam gic T gic ng gp khc khng khp kn ng gp khc khp kn Mt gii cc tam gic lin kt vi nhau Cc tam gic lin kt vi nhau theo hnh qut Mt gii cc t gic lin kt vi nhau

Mt s kiu d liu: K hiu s i f d Kiu d liu 16-bt interger 32- bit interger 32-bit floating-point 64-bit floating-point Tn kiu ca Opengl GLshort Glint, Glsizei Glfoat, GL.elamf Glfoat.double, GL.elampd

V d 2.1:
33

Sau y l mt s v d khi ta ch nh 1 im glVertex2s(2, 3); //Ta thuc kiu GLshort trong khng gian 2 chiu glVertex3d(0.0,0.0,3.1415926535898); //Ta thuc kiu GLdouble trong khng gian 3 chiu glVertex4f(2.3, 1.0, -2.2, 2.0); //Ta ng nht kiu GLfloat GLdouble dvect[3] = {5.0, 9.0,1992.0}; glVertex3dv(dvect); //Ta c ly t mng dvect

V d 2.2: Lnh Kt qu hin th


glBegin(GL_POLYGON); glVertex2f(0.0, glVertex2f(0.0, glVertex2f(3.0, glVertex2f(4.0, glVertex2f(3.0, glEnd(); glBegin(GL_POINTS); glVertex2f(0.0, glVertex2f(0.0, glVertex2f(3.0, glVertex2f(4.0, glVertex2f(3.0, glEnd(); 0.0); 3.0); 3.0); 1.5); 0.0);

0.0); 3.0); 3.0); 1.5); 0.0);

4.1.2. Mt s lnh khc Thit lp mu nn cho ca s hin th


glClearColor(red, green ,blue ,anpha); (0red, green, blue, anpha1)

Thit lp mu cho i tng v


glColor3f(red, green, blue); (0red, green, blue1)

V hnh ch nht
glRect{sifd}(x1, y1, x2, y2);

Mt s th tc trong GLUT cho php v hnh trong khng gian 3 chiu(solid l hnh c, wire l hnh khung) V hnh lp phng
glutWireCube(GLdouble size); glutSolidCube(GLdouble size);

34

V hnh cu
glutWireSphere(GLdouble radius, GLdouble slices, GLdouble stacks); glutSolidSphere(GLdouble radius, GLdouble slices, GLdouble istacks);

V hnh hoa
glutWireTorus(GLdouble innerRadius, GLdouble outerRadius, GLdouble nsides, GLdouble rings); glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius, GLdouble nsides, GLdouble rings);

V hnh m pha tr
glutWireTeapot(GLdouble size); glutSolidTeapot(GLdouble size);

V hnh nn
glutWireCone(GLdouble Radius, GLdouble height, GLint slices, GLint stacks); glutSolidCone(GLdouble Radius, GLdouble height, GLint slices, GLint stacks);

4.2. Tp li v php c tam gic hp l (Convexity and Valid Triangulation) 4.2.1 Tp li Mt tp S c gi l li (convex) nu vi 2 im bt k P,Q thuc S th on thng PQ nm trn vn trong S

Hnh 2.3 Tp li v tp khng li Cho mt tp hp cc im T={P1, P2,...., Pn}, bao li (convex hull) ca T l tp li nh nht F cha T. Khi bt k im X thuc F u c th biu din di dng nh sau: X=1P1+2P2+....+nPn (0i, 1+2+ ....+n=1) Trng hp c bit: - Mt on thng AB lun l mt tp li, mt im P bt k thuc AB c biu din duy nht di dng P=1A+2B (i0, 1+2=1) - Mt tam gic ABC lun l mt tp li, mt im P bt k thuc ABC

35

c biu din duy nht di dng P=1A+2B+3C (i0, 1+2+3=1) OpenGL t mu on thng v tam gic bng cch ni suy vc t mu (interpolating the color vectors) ti mi nh ca on thng v tam gic. V d nu mu ti ba nh A, B, C ca tam gic ln lt l C1, C2, C3 khi nu im P thuc tam gic ABC v P=1A+2B+3C th mu ti im P l 1C1+2C2+3C3

4.2.2 Php c tam gic hp l Mt php c tam gic hp l ca mt hnh X l mt tp hp cc tam gic tha mn hai iu kin sau: - Hp ca cc tam gic chnh l hnh X - Hai tam gic bt k tha mn: Tch ri nhau hoc chung nhau duy nht 1 nh hoc chung nhau duy nht mt cnh

Hnh 2.4 Php c tam gic hp l v khng hp l Trong OpenGL khi p dng mt php c tam gic cho mt tp li th yu cu bt buc phi l mt php c tam gic hp l. Ti sao phi c yu cu nh vy? Ta hy xt v d ti hnh 2.3(b), gi s E l trung im cnh AC v cc vc t biu din mu ti cc im A, E v C ln lt l (1,0,0), (0,1,0) v (0,0,1). Xt trong tam gic ABC, v E l trung im cnh AC do mu ti E l trung bnh cng mu ti A v C do mu ti E c tnh l (0.5,0,0.5) iu c ngha l cng ti mt im E c hai cch biu din mu khc nhau.

4.3.Php bin i im nhn v bin i m hnh (Viewing and Modeling Transformations) OpenGL s dng ma trn v php nhn ma trn biu din cc php bin i (ta s cp n vn ny sau) do mt ch quan trng l trc khi p dng cc php bin i ta phi xa v thit lp ma trn hin thi (current matrix) v ma trn
36

n v (identity matrix) bng lnh glLoadIdentity(). 4.3.1 Php bin i im nhn Php bin i im nhn tng t nh ta chn v tr v hng ca camera trong thc t v vy ta s quy c ti v tr im nhn (viewpoint) c t mt camera cho d hnh dung. OpenGL s dng lnh gluLookAt() nh v v tr v hng ca im nhn, c php lnh nh sau gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez, centerz, GLdouble centerx, GLdouble centery, GLdouble

GLdouble upx, GLdouble upy, GLdouble upz) Trong : (eyex, eyey, eyez) l v tr ca im nhn, (centerx, centery, centerz) ch nh mt im no thuc ng ngm v (upx, upy, upz) xc nh hng nh ca camera (bn cht chnh l hng t y ln nh ca viewing volume). V d lnh gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0) s nh v camera ti v tr (0.0, 0.0, 5.0), ng ngm l hng l hng m ca trc oz (nhn v gc ta ) v hng ca nh l hng dng ca trc oy Mc nh v tr ca camera ti gc ta , ng ngm l hng m ca trc oz v hng ca nh l hng dng ca trc oy

Hnh 2.6 V tr mc nh ca im nhn l ti gc ta 4.3.2 Php bin i m hnh Bn cht php bin i m hnh l xc nh v tr v hng ca m hnh (i tng cn v trong khng gian). V d chng ta c th p dng cc php tnh tin (translation), php quay (rotation), php t l (scale) hoc kt hp cc php bin i
37

vi nhau. Mt s lnh lin quan n bin i m hnh ca OpenGL Php tnh tin: glTranslate{fd}(TYPE x, TYPE y, TYPE z); ngha: Tnh tin m hnh theo vc t tnh tin (x, y, z) Php quay: glRotate{fd}(TYPE angle, TYPE x, TYPE y, TYPE z); ngha: Quay m hnh mt gc angle ngc chiu kim ng h xung quanh tia ni t gc ta n im (x, y, z) Php t l: glScale{fd}(TYPE x, TYPE y, TYPE z); ngha: Bin i t l m hnh vi h s t l tng ng vi ba trc ox, oy, oz ln lt l x, y, z Ch : Vi x=-1, y=1, z=1 th php t l tr thnh php i xng qua mt phng oyz, tng t vi mt phng oxy v oxz. 4.3.3. Cch chuyn i t php bin i im nhn sang php bin i m hnh Ta bit cch s dng cu lnh gluLookAt() thay i v tr v hng ca camera, y l cu lnh thuc OpenGL Utility Library (GLU). Ta cng bit cc cu lnh ca OpenGL thc hin php bin i m hnh l glTranslate*(), glRotate*() v glScale*(). Thc cht php bin i im nhn c th c thay th bi mt vi cu lnh ca php bin i m hnh. Quay li v d gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0) sau lnh ny camera c tnh tin t v tr mc nh l gc ta v im (0.0, 0.0, 5.0), iu tng ng vi vic gi nguyn camera ti gc ta v tnh tin vt th 5 n v v hng ngc li dc theo trc oz glTranslatef(0.0, 0.0, -5.0). Xt trng hp tng qut: gluLookAt(eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz) thay th lnh trn bng cc php bin i m hnh ta p dng cc php bin i mc ch l a camera v v tr mc nh (ti gc ta , hng nhn v hng m ca trc oz v hng nh l hng dng ca trc oy). Bc 1: Tnh tin camera v gc ta bng cch p dng lnh glTranslatef(-eyex,-eyey,-eyez) Bc 2: p dng cc php quay a hng nhn ca camera v hng m ca oz v a hng nh ca camera v hng dng ca oy V d 2.3: Lnh gluLookAt(5.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, -1.0); c thay th tng ng bi cc cu lnh sau glRotatef(45, 0.0, 0.0, 1.0);//Quay mt gc 45 quanh trc oz a hng nh camera v hng dng trc oy glRotatef(-90, 0.0, 1.0, 0.0);//Quay mt gc -90 quanh trc oy a hng nhn camera v hng m trc oz glTranslatef(-5.0, 0.0, 0.0);//a camera v gc ta Ch : Th t thc hin cc lnh theo th t ngc li th t ca cc cu lnh. Qu trnh c minh ha trn hnh 2.7, mi tn mu xanh ch hng nhn ca camera v mi tn mu nt t ch hng nh ca camera

38

Hnh 2.8 Chuyn bin i im nhn sang bin i m hnh 4.3.4. Php bin i cng nhn (Viewport Transformation) Cng nhn l mt min hnh ch nht nm pha trong mt ca s (window) ang m trn mn hnh cho php hin th hnh nh. Hnh nh ca vt th sau khi c chiu ln khung nhn s c nh x ln cng nhn. Ta c th nh ngha nhiu cng nhn hin th nhiu khung cnh khc nhau trn ca s. nh ngha cng nhn ta dng cu lnh sau: glViewport(GLint x, GLint y, GLsizei width, GLsizei height); Trong (x,y) xc nh ta gc tri pha di ca cng nhn, ta ny l ta trong ca s ang m. Gc tri pha di ca ca s c ta l (0,0). Hai tham s width v height l chiu rng v chiu cao ca khung nhn. ch mc nh gi tr tham s ca khung nhn l (0, 0, winWidth, winHeight) trong winWidth v winHeight l kch thc ca ca s ni hin th khung nhn.

39

Hnh 2.12 Mn hnh my tnh, ca s v cng nhn

nh ngha ca s trn mn hnh ta dng hai cu lnh sau ca GLUT: glutInitWindowPosition (int x, int y); //Ch nh v tr gc tri trn ca ca s trong h ta xoy ca mn hnh (Hnh 2.11) glutInitWindowSize (int Width, int Height); //Ch nh kch thc ca ca s (pixels), hai kch thc thng c chn bng nhau hnh khng b mo T l hai kch thc ca cng nhn nn chn bng vi t l hai kch thc ca khung nhn. Nu hai t l ny khng bng nhau th hnh nh hin th trn mn hnh s b mo (distorted). \

Hnh khng b mo

Hnh b mo

Hnh 2.13 nh c nh x t khung nhn ln cng nhn

4.3.5. iu khin cc ngn xp ma trn ( Matrix Stacks) OpenGL biu din cc php bin i im nhn v m hnh bng ngn xp ma trn Modelview (Modelview matrix stack). Ngn xp ny c ti a l 32 phn t l cc ma trn vung 4x4 tng ng cc php bin i tc ng ln i tng v v ma trn hin thi lun l ma trn nm trn nh ca stack. Mi mt php bin i im nhn hoc bin i m hnh to ra mt ma trn mi, ma trn ny c nhn vi ma trn hin thi v kt qu tr thnh ma trn hin thi mi (ngn xp thm 1 phn t mi trn nh). biu din cc php chiu, OpenGL s dng mt ngn xp khc c gi l ngn
40

xp ma trn php chiu (Projection matrix stack) gm ti a 2 phn t ma trn vung 4x4. Ma trn hin thi m t php chiu ang c p dng cho i tng v, hay ni cch khc ma trn ny m t viewing volume.

Hnh 2.14 Ngn xp ma trn modelview v ma trn php chiu Ta c th iu khin ma trn hin thi bng cc cu lnh sau: glLoadIdentity(); //Thit lp ma trn hin thi v ma trn n v glLoadMatrix{fd}(const TYPE *m); // Thit lp gi tr cho ma trn hin thi t 16 gi tr c tr bi m (m l ma trn mt chiu hoc hai chiu) glMultMatrix{fd}(const TYPE *m); //Nhn ma trn c 16 gi tr c tr bi m vi ma trn hin thi, kt qu l ma trn hin thi mi glPushMatrix(); //Sao chp thm mt ma trn hin thi v a ln nh ca ngn xp glPopMatrix(); //Loi b ma trn hin thi khi ngn xp

41

Hnh 2.15 Sao chp v loi b ma trn hin thi Lnh glPushMatrix(); c hiu l "Ghi nh ta u" (remember where you are) v glPopMatrix(); c hiu l "Quay li v tr ta " (go back to where you were). y l hai cu lnh rt hu ch ca OpenGL. Vic t chc cc ma trn theo ngn xp l rt ph hp khi ta cn xy dng cc m hnh c s phn cp (hierarchical models) trong mt i tng phc tp c xy dng t nhng i tng n gin hn. c bit khi l mt hnh nh ng, s thay i trng thi ca mt b phn ko theo s thay i ca nhiu b phn khc. Gi s ta c on chng trnh nh sau m t chuyn ng mt cnh tay ca mt robot:
glTranslatef(); //Lnh T1 glRotatef(); //Lnh T2 glPushMatrix(); glTranslatef(); //Lnh T3 glRotatef(); //Lnh T4 gluCylinder(); //V cnh tay pha di glPopMatrix(); glScalef(); //Lnh T5 gluCylinder(); //V cnh tay pha trn

on chng trnh trn c th c th c din t bi s sau T1 T2 T5 Cnh tay pha trn T3 T4 Cnh tay pha di Mun bit nh hng ca cc cu lnh vi hai hnh lng tr ta duyt s trn theo th t ngc li. y l nhng g tc ng ln cnh tay pha trn: T5: Ko dn i tng
42

T2: Quay i tng quanh mt trc xuyn qua tm ca n T1: Tnh tin i tng y l nhng g tc ng ln cnh tay pha di: T4: Quay i tng quanh mt trc xuyn qua trng tm ca n T3: Tnh tin i tng T2: Quay i tng mt ln na, ln ny trc quay khng qua tm ca n T1: Tnh tin i tng mt ln na Nhn xt: - Php quay T2 tng ng vi ng tc quay ti khp vai v php quay T4 tng ong vi ng tc quay ti khuu tay - T3 v T4 nm gia hai lnh glPushMatrix() v glPopMatrix() ch tc ng ln cnh tay pha di - Lnh T1 v T2 tc ng ln cnh tay pha trn v ng nhin cng c tc ng n cnh tay pha di v khi cnh tay pha trn chuyn ng th cnh tay pha di cng chuyn ng theo.

Phn B. V d m phng
Phn v d ny, nhm S dng VC++ kt hp vi OpenGl m phng ng hc robot. Nhm em xin trnh by chi tit nh sau:

I. Mi trng lm vic trong VC++:


Trc ht ta khi ng VC++, chn New to mt ng dng mi:

43

Trong hp thoi ny ta chn MFC app Winzard(exe):to ng dng win32 vi th vin MFC. Sauk hi click OK ta c hp thoi bn di:

44

Sau khi nhn Finish, Winzard s to cho chng ta 5 lp c bn: CDIEUApp: y l lp dung ng k to mt ng dng CDIEUDoc: y l lp lu tr d liu CDIEUView: y l lp ci t nhng g th hin ln mn hnh ca ng dng CAboutDlg: y l lp qun l mt Dialog m mc ch ca Wizard cung cp cho chng ta hin th thng tin CmainFrame: dng qun l,khi to cc khung ng dng,cc ToolBar,Menu Ngoi ra chng ta cn c cung cp 3 th qun l d n: +Th Class View: dng qun l lp v cc hm t do nm trong d n +Th ResourceView: dng qun l cc ti nguyn ca d n +Th FileView:Qun l cc file nm trong d n. Thm th vin OpenGL cho ng dng v thm cc file khai bo v ci t(ST_SplitterWnd.CPP v ST_SplitterWnd.H) Vo Project/Add to Project/Files..

45

Khai bo v s dng lp ST_SplitterWnd: y l lp dung chia i khung ng dng khi chy chng trnh.Ta nhn p vo lp CMainFrame trong ClassView/file MainFrm.h Ta phi khai bo thm : #include"Splitter/ST_SplitterWnd.h" Cc bn cng phi nh l phi setting trong project nh:

46

Ngoi ra khi s dng th vin OpenGl th ta phi khai bo trong lp View

#include "OpenGL_LIB\InitOpenGL.h"
47

#include "OpenGL_LIB\ObjectsOpenGL.h" using namespace ObjectsOpenGL; ng thi khai bo cc bin con tr khi to thit b v v mi trng v:

Ta tin hnh thit lp mi trng ho OpenGL trong File DIEUView.CPP

II- S dng VC++ kt hp vi OpenGl m phng ng hc robot Tip theo ta s thm ti nguyn Dialog vo to ra c cc form hin th cng nh cc nt iu khin (<< >>) Ta setting cho c th link c th vin:

48

Sauk hi hp thoi hin ra th chn IDD_FORMVIEW th ta s thy hnh nh form design c thng qua control bar(c th t tn ca formview ny thnh 1 ci tn khc cho d qun l.( i vi vic chn cc biu tng nh biu tng trng hay hnh nh no cng lm tng t, ta ch vic i t chn IDD_FORMVIEW

49

thnh BITMAP thi.)).

T trn phn iu khin formview m ta va design, click chut phi v chn Class wizard, sau khi nhn OK n s ra bng sau: Ta nhp tn no vo( v d l CCTRPANEL), lp c s l CFormView.

50

Sau khi nhn OK th ta thm c lp CCTRPANEL vo.

51

Thm mt s thuc tnh vo lp CMainFrame chia i khung ng dng( nu khng th rt kh qun l v iu chnh). Tip theo, thm cc hm Oncreate, On Destroy, v Onsize vo c th thay i kch thc hay gi tr:

52

Nhn Ctrl+W. Sau chn lp CMainFrame trn class name, chn CMainFrame Object IDs, Bn hp messages chn OnCreateClient. Sau khi nhn edit code th hm BOOL CMainFrame:: OnCreateClient hin ra, edit li hm nh bn di:

53

Ch l nu t gi tr bin l 1( m_Splitter.Create(this,RUNTIME_CLASS(CCTRPANEL),RU NTIME_CLASS(CCNCView),pContext,1) th s chia i theo hang dc, cn 0 th chia i theo hng ngang. Tuy nhin khi bin dch chng trnh c th s xy ra hin tng li, iu ny c th xy ra khi ta s dng con tr *GetDocument() ca lp CCNCDoc m cha khai bo. Ta vo lp CCNCView.h sa li: Class CCNCDoc; vo.

Nh vy l cng tng i n ri, tip theo ta chnh sa trong project link th vin OpenGL vo d n. Tip theo ci t hm OnInitialUpdate() c th Update cc khu, khp cng nh nhng thay i ca robot:

54

Nh vy cng on cng gn hon thin, tip theo ta xy dng hm v vt th( Robot hay c cu my chng ta thit k sn trn Solids, Catia hay Inventor ri, sau ta lu nh dng cc file ny di dng *.STL), hm OnDraw ny s ch c nhim v l kt ni cc file ny vo v lp ghp chng theo s iu khin cat.Ta cn ch mt iu l khong cch cng nh gc quay n s c tnh theo khong cch ca tng chi tit (cc part bn thit k 3D) v c bt u lm mc t O(0,0,0). Nu ta t h ta a phng(coordinate) th ta s da vo thc hin hm tnh tin v hm quay. Tuy nhin, thng thng ngi ta s khng v trc tip trn hm OnDraw ny m dng hm OnDraw qun l hm paint(): void CPSKView::OnDraw(CDC* pDC) { CPSKDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc);
55

Paint(); } c c hm Paint() ta click chut phi vo lp CCNCView v chn Add Member Function v lm nh bn di:

Khi c hm Paint() th thit lp chng trnh v vt th trong . Phn bi en

56

chnh l phn m dng ci t mu ca tng chi tit.

Sau khi chnh sa, ta c c hnh nh ca robot thng qua ca s View. Vic tip theo ta ci t chng trnh tnh ton cho robot. Mun c iu ny ta phi c c bng thng s ng hc cng nh gii c phng trnh ng hc ngc. Khi c tt c nhng th trn ri, ta tip tc vo lp CCTRPANEL to ra hm Calculate()(Cch lm tng t hm paint()). Ta vit chng trnh tnh ton vo hm . Khi ta s thy c cc chuyn ng ca robot theo chng trnh tnh ton:

57

58

Ngoi ra, to cc hiu ng nh ko nh chut, r chut.. chng ta cng c th lm c bng cc hm nh OnLButtonDown() OnLButtonUp(), OnMouseMove(), OnMouseWheel() Mun c c cc hm ny hy nhn bn hnh v di:

59

Vy nhm em hng dn cch m phng chng trnh robot thng qua VC++. Tt nhin s phi sa nhiu chng trnh th mi chy c.Sau y l bonus mt s chng trnh hon thin:

60

61

62

63

TI LIU THAM KHO [1] http://www.videotutorialsrock.com/ [2] Lp trnh Opengl vi th vin AUX - Bi Minh Trng [3] The OpenGL Utility Toolkit (GLUT) Programming Interface - Mark J. Kilgard. [4] www.hua.edu.vn [5]. ti OpenGL cc kha trc .

64

You might also like