Tìm hiểu về bộ thư viện OpenGL cho lập trình 3D

171
MỤC LỤC Lời mở đầu PHẦN 1: TÌM HIỂU THƯ VIỆN ĐỒ HỌA OPENGL 1 Chương 1: Sơ lược về OPENGL 1 1.1. Lịch sử phát triển ........................................................................ 1 1.2. Khái niệm.................................................................................... 1 1.3. Thành phần ................................................................................. 5 Chương 2: Đồ họa hai chiều GDI 6 2.1. Tọa độ đề các và tọa độ màn hình................................................ 6 2.2. Định nghĩa vertex và kiểu dữ liệu hình dạng................................ 8 2.3. Các phép biến hình ...................................................................... 10 2.4. Sử dụng ma trận cho các phép biến hình...................................... 17 Chương 3: Đồ họa ba chiều GDI 25 3.1. Hệ tọa độ ba chiều ......................................................................... 25 3.2. Định nghĩa đối tượng ba chiều ....................................................... 25 3.3. Các phương pháp thể hiện hình 3-D lên màn hình .......................... 28 3.4. Biến hình đối tượng 3-D ................................................................ 31 Chương 4: Chương trình OpenGL tối thiểu 36 4.1. Các kiểu dữ liệu OpenGL .............................................................. 36 4.2. Ngữ cảnh biểu diễn ........................................................................ 36 4.3. Định dạng điểm vẽ ......................................................................... 38 4.4. Tạo ngữ cảnh biển diễn .................................................................. 44 4.5. Tổng kết: ....................................................................................... 48 Chương 5: Vẽ hình và sử dụng màu: 48 5.1. Cú pháp lnh OpenGL ................................................................... 48 5.2. Các trạng thái OpenGL .................................................................. 49 5.3. Xét một chương trình OpenGL tối thiểu ......................................... 50 5.4. Định nghĩa và vẽ điểm ................................................................... 53

description

Luận văn tìm hiểu về bộ thư viện openGL trong lập trình 3D, thư viện đồ họa openGL, openGL, bộ thư viện OpenGL,tìm hiểu về openGL

Transcript of Tìm hiểu về bộ thư viện OpenGL cho lập trình 3D

  • MC LC

    Li m u

    PHN 1: TM HIU TH VIN HA OPENGL 1

    Chng 1: S lc v OPENGL 1

    1.1. Lch s pht trin ........................................................................ 1

    1.2. Khi nim.................................................................................... 1

    1.3. Thnh phn ................................................................................. 5

    Chng 2: ha hai chiu GDI 6

    2.1. Ta cc v ta mn hnh................................................ 6

    2.2. nh ngha vertex v kiu d liu hnh dng................................ 8

    2.3. Cc php bin hnh ...................................................................... 10

    2.4. S dng ma trn cho cc php bin hnh...................................... 17

    Chng 3: ha ba chiu GDI 25 3.1. H ta ba chiu ......................................................................... 25

    3.2. nh ngha i tng ba chiu ....................................................... 25

    3.3. Cc phng php th hin hnh 3-D ln mn hnh .......................... 28

    3.4. Bin hnh i tng 3-D ................................................................ 31

    Chng 4: Chng trnh OpenGL ti thiu 36

    4.1. Cc kiu d liu OpenGL .............................................................. 36

    4.2. Ng cnh biu din ........................................................................ 36

    4.3. nh dng im v ......................................................................... 38

    4.4. To ng cnh bin din .................................................................. 44

    4.5. Tng kt: ....................................................................................... 48

    Chng 5: V hnh v s dng mu: 48 5.1. C php lnh OpenGL ................................................................... 48

    5.2. Cc trng thi OpenGL .................................................................. 49

    5.3. Xt mt chng trnh OpenGL ti thiu ......................................... 50

    5.4. nh ngha v v im ................................................................... 53

  • 5.5. nh ngha v v ng ................................................................. 56

    5.6. nh ngha v v a gic ................................................................ 61

    5.7. Tng kt......................................................................................... 74

    Chng 6: Cc php binhnh OpenGL 75

    6.1. Xy dng i tng 3-D t cc a gic .......................................... 75

    6.2. Php chiu ..................................................................................... 77

    6.3. Php bin hnh i tng ............................................................... 79

    6.4. Php bin i viewport .................................................................. 85

    6.5. Tng kt......................................................................................... 88

    Chng 7: Chiu sng i tng 3-D 89

    7.1. Cc loi ngun sng ....................................................................... 89

    7.2. nh ngha mt ngun sng ........................................................... 90

    7.3. nh ngha tch cht vt liu .......................................................... 92

    7.4. nh ngha cc php tuyn ............................................................. 95

    7.5. Xc nh kiu bng v kch hot vic kim tra chiu su................ 97

    7.6. nh ngha n chiu ..................................................................... 98

    7.7. Th hin i tng 3-D c chiu sng ........................................ 99

    7.8. Bng mu logic .............................................................................. 103

    7.9. Tng kt ...................................................................................... 107

    Chng 8: To cnh 3-D 108

    8.1. S dng cc php bin hnh OpenGL to cnh 3-D ................... 108

    8.2. S dng cc stack ma trn .............................................................. 113

    8.3. To o gic chuyn ng vi OpenGL ........................................... 117

    8.4. Tng kt......................................................................................... 119

    Chng 9: Anh v gn cu trc 119

    9.1. Bitmap v nh OpenGL ................................................................. 120

    9.2. Bitmap ph thuc thit b v bitmap c lp vi thit b ................ 125

    9.3. nh dng DIB............................................................................... 125

    9.4. Gii thiu lp Cdib ........................................................................ 129

    9.5. Gn cu trc cho a gic ................................................................ 139

  • 9.6. Tng kt......................................................................................... 147

    Chng 10: Pha trn , gim hiu ng rng ca, v sng m 148 10.1. Pha trn ....................................................................................... 148

    10.2. Gim hiu ng rng ca ............................................................... 154

    10.3. Sng m ................................................................................... 157

    Chng 11: Display List 160

    11.1. nh ngha: .................................................................................. 160

    11.2. Ti sao phi dng display list ....................................................... 160

    11.3. Cc tnh cht ca display list. ....................................................... 162

    11.4. Cc trng hp c th s dng display list. .................................. 162

    11.5. Nhc im ca display list. ........................................................ 162

    11.6. To v thc thi mt display list. ................................................... 163

    11.7. Qun l bin trng thi trong display list ..................................... 164

    Chng 12: Quadric. 164

    PHN 2: M PHNG CC GII THUT HA 3 D VI OPENGL: 166

    Chng 1: Tng quan: 166

    1.1. Mt s khi nim lin quan: ........................................................... 166

    1.2. Cc php bin i: ......................................................................... 167

    Chng 2: Xy dng ng dng m phng thut gii: 169

    2.1. Xy dng ng dngOpenGL .......................................................... 169

    2.2. Cch lm vic ca ng dng .......................................................... 172

    2.3. Bng k chng trnh: .................................................................... 179

    Li M u

  • C cu rng mt hnh nh bng c nghn li ni . iu tht khng th ph nhn. V r rng l nu hin th thng tin ch vi cc k hiu, ch ci, ch s khng thi th khng th hp dn v d hiu nh khi c thm biu din ha K thut ho cng l cng c khng th thiu trong cc ngnh khoa hc k thut, gio dc, ngh thut, gii tr, qung co( din t my mc thit b, kin trc, cu trc c th, thng tin thin vn a l, hnh nh minh ho..). Chnh v vy, ha l mt vn c quan tm trong ngnh cng ngh thng tin.

    Cng vi s pht trin ca tin hc, k thut ha trn my vi tnh, ngy cng tr nn tinh xo. Giao din cc phn mm ngy nay tr nn thn thin, p mt nh cc th hin ha. S h tr ca tin hc cho cc ngnh khc tr nn c lc hn nh kh nng ha vi tnh. V th gii thc th c biu din mt cch sinh ng, linh hot, y mu sc bng khng gian ba chiu.

    Trong thnh cng ca k thut ha ngy nay khng th khng ni n s pht trin vt bc ca tc phn cng ln h iu hnh. Nhng bn thn k thut ha th c bc tin nhy vt t nhng php tnh ton hc phc tp n nhng th vin ha c to sn. Cc th vin ny cho php gim nh thi gian v cng sc ca ngi lp trnh; Bi vi chng, c c mt tc phm ha khng i hi phi c mt kin thc hng hu v ng cong Bezier, B-spline, v hnh hc, to bng, m ch ng dng cc hm to sn. Mt trong nhng th vin l OpenGL, c xem l tiu chun thit k cng nghip cho ha ba chiu. Mc tiu ca lun vn ny l tm hiu th vin ha ca OpenGL trong ha ba chiu, ng thi cng c gng a ra mt ng dng ca OpenGL trong vic minh ha cc gii thut ha ba chiu. Tuy nhin, ti khng th khng trnh khi nhng hn ch v thiu st, nn rt mong c s ch bo, gp ca qu Thy C v bn b.

    PHN 1: TM HIU TH VIN HA OPENGL

    Chng1:S Lc v OPENGL 1.1.Lch S Pht Trin : Nguyn thy, GL do Silicon Graphics Incorporated (SGI) thit k dng cho cc trm lm vic (workstation) ha IRIS ca h. IRIS GL vi cc cu hnh phn cng khc th c vn pht sinh.

    OpenGL l kt qu n lc ca SGI nhm ci thin tnh tng thch ca IRIS GL. Ngn ng mi ny c kh nng ca GL, ng thi m ngha l d dng tng thch vi cc lai cu hnh phn cng, cng nh cc h iu hnh khc nhau.

    Version1.0 ca OPENGL c gii thiu vo ngy 01/7/1992. bo m tnh m , mi s nng cp OpenGL phi thng qua Uy Ban Xem Xt Kin Trc OpenGL(OpenGL Architecture Review Board AEB) gm cc thnh vin sng lp l SGI, Digittal Equipment Corporation, IBM ,Intel v Microsoft.ARB hp mi nm hai ln.

  • (Cc cng ty khc cng c th tham gia tho tun nhng khng c quyn b phiu ). Open GL version1.1 c ARB thng qua vo thng 12/1995.

    1.2. Khi Nim : OpenGL c nh ngha l giao din phn mm cho phn cng ha . Thc

    cht, OpenGL l mt th vin cc hm ha, c xem l tiu chun thit k cng nghip cho ha ba chiu.

    Vi giao din lp trnh mnh m, OpenGL cho php to cc ng dng 3-D phc tp vi tinh vi, chnh xc cao, m ngi thit k khng phi nh vt vi cc ni cng thc ton hc v cc m ngun phc tp. V do OpenGL l tiu chun cng nghip, cc ng dng to t n dng c trn cc phn cng v h iu hnh khc nhau. Cc mc sau s gii thiu cch nhn tng qut v cch lm vic ca OpenGL:

    - Cc phn t ha c bn v lnh gii thiu v cc phn t ha c bn (primitive) v s thc hin lnh

    - Cch lm vic ca OpenGL cho bit cc lai thao tc ha m OpenGL kim sot

    - M hnh hot ng ni v m hnh client/server cho vic thng dch lnh OpenGL

    - Thao tc OpenGL c bn a ra mt m t mc cao v cch OpenGL x l d liu v to ra hnh nh tng ng ln b im khung.

    Cc phn t ha c bn v lnh: Primitive c xc nh bi nhm ca mt hay nhiu vertex l im trong khng gian. Mi vertex xc nh mt im, mt u on thng hay mt nh a gic. D liu (bao gm ta vertex, mu sc, normal, texture v c xc nh loi cnh) kt hi vi vertex. Khi x l primitive, mi cp vertex v d liu lin kt vi n c s l c lp vi cc cp khc, theo th t v cng mt phng php. Ngoi l duy nht l trong trng hp kh phn khut ca primirite(clipping). Khi , d liu vertex c sa v cc vertex khc c to ra. Loi clipping tu thuc loi primirite m nhm vertex biu din.

    Cc lnh lun lun c x l theo th t m n tip nhn, mt d c s tr hon khng xc nh trc khi lnh c hiu lc. Ngha l mi primirite c v trn vn trc khi lnh tip theo c hiu lc.

    Cch lm vic ca OpenGL: OpenGL l ngn ng ha theo th tc ch khng phi ngn ng m t.Thay v t cc cnh v cch chng xut hin, OpenGL a ra cc bc cn thit c c s th hin hay hiu qu nht nh. Cc bcny l cc li gi n giao din lp trnh ng dng gm xp x 120 lnh v hm. Chng c dng v cc phn t ha c bn nh im, ng v a gic trong khng gian ba chiu. Ngoi ra, OpenGL cn h tr chiu sng, t bng, gn cu trc, to o gic chuyn ng v cc hiu qu c bit khc.

    OpenGL khng c cc chc nng qun l ca s, tng tc vi ngi dng hay xut nhp file. Mi trng ch (tc h iu hnh) c cc chc nng ny v chu trch nhim thc hin cc bin php qun l cho OpenGL.

    M hnh hot ng: M hnh thng dch lnh OpenGL l client-server. M ng dng(vai tr client) a ra cc lnh. Lnh c thng dch v s l bi OpenGL (vai tr server). Server v client c th l trn cng mt my tnh khc nhau. Theo ngha ny, OpenGL l network-transparent

  • (tm dch l mng trong sut). Server duy tr nhiu ng cnh OpenGL, mi ng cnh l mt trng thi OpenGL. Client c th ni vi bt c ng cnh no. Giao thc mng c s dng c th l c lp ha da trn giao thc mng hin c (tc OpenGL dng trn my c lp hay trn mi trng mng). Khng c lnh OpenGL no tip nhn vic nhp d liu trc tip t ngi dng. Cui cng, h thng ca s kim sot tc dng ca cc lnh OpenGL trn b m khung qua cc thao tc: - Quyt nh cc phn ca b m khung m OpenGL c th truy xut ti thi im cho php. - Truyn t cho OpenGL thng tin v cu trc cc phn . - Nh vy, khng c lnh OpenGL no nh dng b m khung hay khi to OpenGL. S nh dng b m khung c thc hin bn ngoi OpenGL trong s lin kt vi h thng ca s. S khi to OpenGL c tin hnh khi h thng cp pht ca s cho vic biu din.

    Hnh 1.1 M hnh hot ng c bn ca OpenGL

    Lnh OpenGL Pha Client Pha Server

    Thao tc OpenGL c bn: S khi 1.2 tm tt cch OpenGL x l d liu. Cc lnh i vo pha tri s

    v qua ng ng x l. Mt s lnh xc nh i tng hnh hc c v, v s khc kim sot cch qun l i tng qua cc giai on s l khc nhau.

    OpenGL DLL

    Server DLL

    Video Driver

    Win DLL

  • Hnh 1.2 S x l d liu ca OpenGL:

    Lnh

    Cc giai on s l khc nhau: Danh sch hin th thay v x l lp tc ton b cc lnh, mt s lnh c gom li

    trong mt danh sch x l sau. B c lng: c lng l qu trnh OpenGL sinh ra cc vertex v thng s t cc

    phng trnh Bzier xc nh trc, cung cp mt phng cch hiu qu xp x hnh hc cc b mt v ng cong bng cch nh gi cc lnh a thc ca gi tr a vo. Cc thao tc trn vertex v s t hp ca primirite: OpenGL x l cc primirite hnh

    hc (im, on thng v a gic). Nhng primirite ny c biu din bi cc vertex. Cc vertex c bin i, chiu sng, v cc primirite c kh cc cc phn khut theo viewport chun b rasterze. Raterization: giai on resterize to ra mt chui cc a ch b m khung v cc

    gi tr lin kt s dng hnh dng hai chiu ca im, on thng hay a gic. Cc fragment to ra c cung cp cho qu trnh tip theo. Cc thao tc trn fragment: l cc thao tc cui cng trn d liu, trc khi lu tr

    d liu di dng cc pixel trong b m khung. Cc thao tc ny bao gm vic cp nht (c iu kin) b m khung da trn gi tr

    lu tr v gi tr va c, vic pha trn cc mu va c v mu lu tr, cng nh thao tc mask v cc thao tc logic khc trn cc gi tr pixel. D liu c th c a vo di dng cac pixel. Khi , sau giai on thao pixel,

    d liu pixel. Hoc c lu tr nh l b nh texture, dng cho giai on rasterizatrion. Hay rasterize, vi kt qu cc fragment c kt hp vo trong b m khung, nu

    chng pht sinh t d liu hnh hc. 1.3. Thnh Phn: OpenGL gm 5 b hm :

    Danh sch

    B c

    lng

    Thao tc trn vertex v primitive

    Rasteri- zation

    Thao tc trn

    fragme

    B m khung

    B nh texture

    Cc thao tc pixel

  • B ht nhn c 115 hm c bn. Tn cc hm ny bt u bng GL. Windows NT h tr 4 chng loi hm khc, bao gm th vin OpenGL utility(tn hm bt u bng GLU), th vin OpenGL auxiliary(tn hm bt u bng AUX), b hmWGL (tn hm bt u bng WGL), v cc hm WIN32 API (tn hm khng c tin t c bit).

    B hm ht nhn cho php thit k cc hnh dng khc nhau, to cc hiu qu chiu sng, kt hp antialiasing v gn cu trc, thc hin bin i ma trn

    Do cc hm c bn c th hin nhiu dng khc nhau ty thuc vo loi d liu m chng tip nhn, nn trn thc t c hn 300 nguyn mu (prototype) cc hm c bn.

    Th vin OpenGL utility gm cc hm cao cp. Cc hm ny n gin ho vic s dng hnh nh cu trc, thc hin vic bin i ta mc cao, h tr tesselation a gic, v biu din cc i tng c c s a gic nh hnh cu, hnh tr hnh da.

    Th vin OpenGl auxiliary gm cc hm c bit dng n gin ha cc v d lp trnh trong sch ch dn lp trnh OpenGL. Cc hm ph thuc platform ny thc hin cc nhim v nh qun k ca s, iu khin xut/nhp, v cc i tng 3D nht nh. Do cc hm ny c mc ch thit minh nn khng c dng trong cc m sn xut.

    Cc hm WGLkt ni OpenGL vi WINdows NT, cho php ngi lp trnh xy dng v chn la cc ng cnh biu din, to cc bitmap font, cc hm ny ch dng trn Windows NT.

    Cui cng, cc hm Win32 API c dng gii quyt cc nh dng im nh v to b m i.

    Chng2: Ha Hai Chiu GDI OpenGL cung cp nhiu hm mnh m, lm n gin cc vic v cc hnh nh

    phc tp. D vy, hiu OpenGL, cn c mt cht kin thc trong thc tin lp trnh ha tiu chun. Bc u tin v mc tiu l tm hiu cch thao tc hnh nh hai chiu GDI

    Cc phn sau s gii thiu c s lp trnh ho 2-D : - Ta cc v ta mn hnh - S dng cc Vertex nh ngha mt hnh dng phng - Tnh tin, co gin v quay - S dng ma trn trong bin hnh 2-D

    2.1.Ta Cc V Ta Mn Hnh: k mt on thng trn mn hnh, ta thng gi cc hm nh v im u, sau

    v on thng. V d cc hm MFC c gi l: CclientDC dc(this)

    dc.MoveTo(x,y) dc.LineTo(x,y)

    Mi quan tm y l vic biu din cc ta x,y. Trong ta ca s, cng nh ta mn hnh, gc ta v tr gc tri trn, chiu tng ca ta x v pha phi, chiu tng ta y i v pha di (hnh 2.1)

    Tuy nhin, i tng ha c xc nh bi ta cc Vertex ca n trong h cc (hnh2.2). Cc im khc bit gia hai ta ny l: H cc xc nh chiu tng ta y l chiu i ln.

  • H cc cho php c ta m. V nh vy, vn pht sinh khi biu din mt i tng c nh ngha trong h cc. Trong ta mn hnh, ta li nhn c mt tam gic nh (hnh 2.4), nu vi m to hnh nh sau :

    CCLientDC dc(this) dc.MoveTo(2,5); dc.LineTo(5,2); dc.LineTo(2,2); dc.LineTo(2,5);

    Do s khc bit gia mn hnh th hin v ta cc, cn c mt phng php chuyn i gia chng. Thut ng ha gi l mapping cc im trong ta cc sang ta mn hnh th hin i tng ng v tr.

    Hnh 2.1 Ta mn hnh Hnh 2.2 Ta cc

  • Hnh 2.3 Tam gic trong ta cc Hnh 2.4 v tam gic khng c s chuyn i gia ta cc v ta mn hnh

    Nu b qua vn ga tr m, th vic th hin im (x1,y1) trong ta cc sang im (x2,y2) trong ta mn hnh i hi cng thc sau:

    X2=X1; Y2=maxY Y1; D nhin, thc hin cng thc ny, trc ht cn bit kch thc hin ti ca ca

    s, bng cch gi hm GetClientRect(). Hm ny in y cu trc RECT vi kch thc ca s. S dng hm MFC, on m sau v tam gic cho ln ca s, mapping gia ta cc v ta mn hnh:

    Int triangle[6]={2,5,5,2,2,2,}; CCLientDC dc(this); Int newX,newY,startX,startY; RECT clientRect; GetClientRect(&clientRect);

    For (int x=0;x

  • 2.2. nh Ngha Vertex V Kiu D Liu Hnh Dng: Mt hnh phng th c xc nh bi mt tp hp cc vertex. Cc vertex ni vi nhau bng cc on thng. Khi tt c vertex c ni th hon thnh hnh dng.

    qun l cc kiu hnh dng khc nhau trong mt chng trnh c d dng, cn nh ngha cp cu trc bao gm kiu d liu vertex.

    Typedef struct vertex {

    int x, y; //Cu trc ny ch n gin l lu tr }VERTEX; //cc ta cc vertex

    V kiu d liu hnh phng Typedef struct shape {

    int numVerts; //Gm mt s nguyn ch s lng VERTEX*vertices; //vertex trong hnh v mt con tr

    }SHAPE; //tr n mng cu trc Vi cc kiu d liu mi ny, ta c th vit an m v on thng tng qut hn

    nh sau :

    VERTEX triangleVerts[3]= {2,5,5,2,2,2} SHAPE shape1 = {3,triangleVerts}; DrawShape(shape1); Void DrawShape(SHAPE& shape1) {

    CclientDC dc (this); Int newX,newY,startX,startY; RECT clientRect; GetClientRect(&clientRect); Int maxY = clientRect.bottom; For (int x =0 ;x

  • }

    Do DrawShape() c tng qut ha lm vic vi cu trc SHAPE, hm ny c th v mi loi hnh phng.V d v mt hnh ch nht, th shape1 c nh ngha nh sau:

    VERTEX rectangleVerts[4]= {10,10,10010, 100 ,50,10,50}; SHAPE shape1 = {4,rectangleVerts}; Hay i vi mt a gic su cnh nh sau:

    Hnh 2.5 VERTEX shapeVerts[6]= {10,10,75,5,100,20,100,50,50,50,25};

    SHAPE shape1 = {6,shapeVerts};

    2.3.Cc Php Bin Hnh: Mt hnh phng c to bng cch nh ngha vertex ca n trong ta cc,

    mapping gia ta cc v ta mn hnh, ri v cc an thng ni cc vertex. Tuy nhin, y ch l s khi u. v hnh mi ni trn mn hnh v theo mi hng, hnh nh cn c thao tc theo nhiu cch khc nhau. Cc thao tc nh vy gi l cc php bin hnh, bao gm tnh tuyn, co gin v quay.

    2.3.1.Php Tnh Tin: Tnh tin mt hnh n v tr mi ch n gin l cng hoc tr ta ca

    mi vertex vi mt gi tr. Tam gic trong hnh 2.6 c tnh tin 3 n v theo trc x v 2 n v theo trc Y.

    Hnh 2.6: Tnh tin mt tam gic

    Gi s cn tnh tin 20 n v theo trc X v 30 n v theo trc y, mt tam gic c nh ngha nh sau: VERTEX triangleVerts[3]= { 20,50,50,50,20,100}; SHAPE shape1 = {3,triangleVerts}; Cng thc tnh tin mi vertex l :

  • X2 = X1 + xTranslation; Y2 = Y1 + yTranslation; Trong chng trnh ton b php tnh tin nh sau:

    VERTEX triangleVerts[3]= { 20,50,50,50,20,100}; SHAPE shape1 = {3,triangleVerts}; DrawShape(shape1); Translate(shape1,20,30); Void Traslate(SHAPE& shape,intxTrans,int yTrans) {

    for(int x =0;x< shape.numVerts;++x) {

    shape.vertices[x].x+ xtrans; shape.vertices[x].y+ ytrans; }

    }

    Void DrawShape(SHAPE& shape1) {

    CclientDC dc (this); Int newX, newY, startX, startY; RECT clientRect;

    GetClientRect(&clientRect); Int maxY = clientRect.bottom; For (int x =0 ;x

  • Thay v cng hoc tr cc vertex vi mt gi tr nh khi tnh tin, co gin mt hnh l nhn cc vertex ca hnh vi mt h s co gin. Hnh 2.7 biu din mt tam gic gin hai ln (h s co gin l 2).

    Hnh 2.7: Co gin mt tam gic

    Ch rng khng ch ring hnh, m ton b h ta co gin. Tc l, mt im c ta x l 2 n v, s l 4 n v khi co gin. Gi s cn gin 4 ln (h s co gin l 4 ) mt tam gic c nh ngha nh sau:

    VERTEX triangleVerts[3]= { 20,50,50,50,20,100}; SHAPE shape1 = {3,triangleVerts};

    Th cng thc co gin mi vertex l : X2 = X1*scaleFactor;

    Y2 = Y1*scaleFactor; on m php co gin s nh sau:

    VERTEX triangleVerts[3]= { 20,50,50,50,20,100}; SHAPE shape1 = {3,triangleVerts}; Scale(shape1,4); DrawShape(shape1); Void Scale(SHAPE& shape,float scaleFactor) {

    for(int x =0;x< shape.numVerts;++x) {

    shape.vertices[x].x+=(int)(shape.xerticse[x]x*scaleFactor); shape.vertices[x].y+=(int)(shape.xerticse[x]y*scaleFactor);

    } }

    Void DrawShape(SHAPE& shape1) {

    CClientDC dc (this); Int newX,newY,startX,startY; RECT clientRect; GetClientRect(&clientRect); Int maxY = clientRect.bottom; For (int x =0 ;x

  • newY = maxY shape1.vertices[x].y; if(x = = 0) {

    dc.MoveTo(newX,newY); startX = newX; startY = newY;

    } else dc.LineTo(newX,newY);

    } dc.LineTo(startX,startY);

    }

    Hm Scale() c cc i s l tham chiu n cu trc SHAPE v h s co gin, th h s co gin s nh hn 1. Ch rng c th dng h s co gin khc nhau i vi 2 ta :

    Void Scale(SHAPE& shape, float xScale, float yScale) {

    for(int x =0;x< shape.numVerts;++x) {

    shape.vertices[x].x+=(int)(shape.xerticse[x]x*xScale); shape.vertices[x].y+=(int)(shape.xerticse[x]y*yScale); }

    } Trong trng hp ny, sau khi co gin, khng nhn c hnh ng dng.

    Hnh 2.8 biu din vic co gin mt tam gic, vi h s co gin trc x bng 1 , v h s co gin trc y bng 2.

    Hnh 2.8: Co gin mt tam gic vi hai h s co gin khc nhau

    2.3.3.Php Quay: Quay mt hnh th rc ri hn tnh tin hay co gin, v phi dng n php

    ton phc tp hn, phi tnh ton sin, cosin. Tuy nhin y ta ch p dng cng thc quay, m khng tm hiu ti sau, lm g.. Hnh2.9 biu din vic quay 45 mt tam gic quanh gc ta .

  • Gi s cn quay mt tam gic 450 nh sau :

    VERTEX triangleVerts[3]= { 20,50,50,50,20,100}; SHAPE shape1 = {3,triangleVerts};

    Cc cng thc sau c p dng cho cc vertex trong tam gic: RotatedX = x*cos(angle) y*sine(angle); RotatedY = y*cos(angle) x*sine(angle);

    t nhn c vertex sau: VERTEX triangleVerts[3]= { -21,49,0,70,-56,84};

    Ch rng trong c hai ta m, do tam gic quay sang phn m ca trc x. Gi tr m c chp nhn trong ta cc, nhng khng th biu din ln mn hnh. hin th tam gic cn tnh tin n sang phn dng ca trc x .

    Ton b php quay v tnh tin s nh sau:

    VERTEX triangleVerts[3]= { 20,50,50,50,20,100}; SHAPE shape1 = {3,triangleVerts}; Rotate(shape1,45); Translate(shape1,100,0); DrawShape(shape1); Void Rotate(SHAPE& shape,int degrees) { int rotatedX,rotatedY; double radians = 6.283185308/(360.0/degrees);

    double c = cos(radians); double c = sin(radians);

    for(int x =0;x< shape.numVerts;++x) {

    rotatedX = (int) (shape.verticse[x]x*c shape.vertices[x].y*s);

    rotatedY = (int) (shape.verticse[x]y*c shape.vertices[x].x*s);

    shape.vertices[x].x = rotatedX;

  • shape.vertices[x].y = rotatedY; }

    } Void Translate(SHAPE& shape1,int xtrans,int yTrans) {

    for(int x =0;x< shape.numVerts;++x) {

    shape.vertices[x].x += xTrans; shape.vertices[x].y += yTrans;

    } } Void DrawShape(SHAPE& shape1) {

    CClientDC dc (this); Int newX,newY,startX,startY; RECT clientRect;

    GetClientRect(&clientRect); Int maxY = clientRect.bottom; For (int x =0 ;x

  • nh vy cho nhiu vertex s tiu ph thi gian. cng l l do m ma trn thng c dng cho cc php bin hnh.

    Mt ma trn n gin l mt bng s sp xp trn cc hng v ct. Ging nh mng trong lp trnh, kch thc ma trn c nh ngha trn s hng v ct m n c. v d ma trn 3*4 l ma trn c 3 hng v 4 ct:

    4 7 2 4 4 6 7 3 4 5 2 2

    Trong chng trnh ma trn c trnh bi nh sau: Int matrix[3][4]= {

    4,7,2,4, 4.6.7.3. 4,5,2,2, };

    Thun li ca ma trn trong lp trnh ha l c th trnh by nhiu php bin hnh vi mt ma trn n. Ngha l mi ma trn n cha mi gi tr cn thit ng thi dng trong tnh tin, co gin v quay mt hnh. thc hin iu th cn bit t gi tr no vo ma trn v cn bit php nhn ma trn.

    2.4.1.Cc Kiu D Liu Dng Trong Ha 2-D:

    ha 2-D dng trong ma trn : 1*3 v 3*3. Ma trn 1*3 l ma trn c bit , gi l vector. Vector cha cc gi tr x,y v w th hin mt vertex. Vy kiu d liu vertex nh sau :

    Typedef struct vector {

    int x,y,w; }VECTOR;

    Trong ,w l gi tr thng dng n gin ha thao tc ma trn, mt d

    OpenGL i khi s dng t bit gi tr ny.Trong hu ht cc trng hp, w bng 1. Ngha l vertex c biu din bi vector c dng: x, y, z Ma trn 3*3 cha cc gi tr cn thit cho cc php bin hnh mt vertex (c biu din bng kiu d liu vector, tc cng l mt ma trn ) Kiu d liu ma trn 3*3 nh sau: Typedef double MATRIX3*3[3][3];

    2.4.2.Cc Ma Trn Bin Hnh : Bc u tin l cung cp cc gi tr thch hp cho ma trn. Gi tr c dng v

    v tr ca n trong ma trn ph thuc kiu bin hnh. Ma trn dng cho php tnh tin c dng:

  • 1 0 0 0 1 0 xTrrans yTrans 1

    Vi cc bin xTrans v yTrans tng ng l s n v theo chiu ngang v dc dng cho php tnh tin, (tng t nh khi dng cng thc tnh tin ). Trong chng trnh ma trn ny c khi to nh sau: MATRIX3*3 m;

    m[0][0] = 1.0; m[0][1] = 0.0; m[0][2] = 0.0; m[1][0] = 0.0; m[1][1] = 1.0; m[1][2] = 0.0; m[2][0] = xTrans; m[2][1] = yTrans; m[2][2] = 1.0;

    - Ma trn dng cho php co gin c dng: XScaleFactor 0 0

    0 yScaleFactor 0 0 0 1

    Vi cc bin xScaleFactor v yScaleFactor tng ng l co gin theo chiu

    ngang v dc. Trong chng trnh, ma trn ny c khi to nh sau : MATRIX3*3 m; m[0][0] = xScaleFactor; m[0][1] = 0.0; m[0][2] = 0.0; m[1][0] = 0.0; m[1][1] = xScaleFactor; m[1][2] = 0.0; m[2][0] = 0.0; m[2][1] = 0.0; m[2][2] = 1.0;

    - Cui cng ma trn dng cho php quay c dng : Cos(radians) sin(radians) 0

    -sin(radians) cos(radians) 0 0 0 1

    Vi bin radian l gc quay (n v radian). Trong chng trnh, ma trn ny c khi to nh sau :

    MATRIX3*3 m; m[0][0] = cos(radians); m[0][1] =sin(radians); m[0][2] = 0.2; m[1][0] = -sin(radians); m[1][1] = cos(radians); m[1][2] = 0.0 ; m[2][0] = 0.0; m[2][1] = 0.0; m[2][2] = 1.0; 2.4.3.Kt Hp Cc Php Bin Hnh :

    mc trc, tng php bin hnh c biu din bng cc cc ma trn ring bit. Tuy nhin, nh ni, c th kt hp nhiu php bin hnh trong mt ma trn. kt hp hai php bin hnh, ta nhn hai ma trn ca chng vi nhau Kt hp php bin hnh tip theo bng cch nhn ma trn ca n vi ma trn nhn c php kt hp trc. Hnh 2.10 biu din cc php bin hnh Mt cch nhn khc c biu din hnh 2.12, nhng kt qu ca tng php kt hp cc ma trn khng c th hin .

    Ma trn kt

    Cc vector Ca hnh

    Ma trn Ma Ma Cc vector

    X Hnh c bin i

    =

    X X X = Hnh c

  • nhn hai ma trn vi nhau, th s ct trc phi bng s hng ca ma trn sau. Nh vy, ta c th nhn hai ma trn 1X3 v ma trn 3X3, hay nhn hai ma trn 3X3 vi nhau .

    Hm sau nhn hai ma trn 3X3: Void MultMatrix(MATRIX3X3& product,

    MATRIX3X3& matrix1, MATRIX3X3& matrix2) {

    for (int x = 0; x < 3; ++y) {

    double sum = 0; for (int z = 0; z < 3; ++z) sum + = matrix1[x][z]*matrix2[z][y]; product[x][y] = sum;

    } } Cc tham s ca hm trn bao gm mt ma trn cha kt qu nhn, v hai ma trn

    tham gia php nhn .V d v cch s dng hm nh sau: MATRIX3X m1,m2,m3;

    m[0][0] = 1.0; m[0][1] = 0.0; m[0][2] = 0.0; m[1][0] = 0.0; m[1][1] = 1.0; m[1][2] = 0.0; m[2][0] = 0.0; m[2][1] = 0.0; m[2][2] = 1.0;

    m[0][0] = 9.0; m[0][1] = 8.0; m[0][2] = 7.0; m[1][0] = 6.0; m[1][1] = 5.0; m[1][2] = 4.0; m[2][0] = 3.0; m[2][1] = 2.0; m[2][2] = 3.0;

    MultiMatrix(m3,m1,m2); on m khai bo ba ma trn 3X3 l m1, m2, m3. Sau khi to m1, m2, ri gi

    hm MulMatrix() nhn m1 vi m2, v lu tr kt qu trong m3. Do m1 l ma trn n v, kt qu cha trong m3 s c cng gi tr nh trong m2.

  • Ma trn n v i cp n c nh ngha l loi ma trn ng cho nXm chiu, vi cc phn t ng cho hnh n v:

    I [ik], vi ik = 0 nu i k; ik = 1 nu i = k; Trong lp trnh ha, ma trn n v thng c dng khi to ma trn chnh l ma trn dng kt hp cc php bin hnh. Vic khi to nh vy s chc chn khng tn ti gi tr l trong ma trn .

    2.4.4.Thc Hin Bin Hnh:

    Sau khi kt hp cc php bin hnh, ta nhn c mt ma trn chnh cha cc gi tr chnh xc cn thit ng thi tnh tin, co gin v quay hnh. Cng vic bin hnh by gi ch n gin l nhn ma trn chnh vi cc vector ca hnh (xem hnh 2.10,2.11). V nh vy cn mt hm khng ch nhn vector 1X3 vi ma trn 3X3, m nhn ma trn vi ton b danh sch vector:

    Void Transform(SHAPE& shape, MATRIX3X3& m) {

    int transformedX,transformY; for (int x= 0; x

  • dst[i][j] = src [i][j]; }

    2.4.6.Cc Hm Bin Hnh Dng Ma Trn: - Hm tnh tin : Void Translate(MATRIX3X3& m,int xTrans,int yTrans) {

    MATRIX3X m1,m2;

    m[0][0] = 1; m[0][1] = 0; m[0][2] = 0; m[1][0] = 0; m[1][1] = 1; m[1][2] = 0; m[2][0] = xTrans; m[2][1] =yTrans0; m[2][2] = 1;

    MultMatrix(m2,m1,m); CopyMatrix(m,m2);

    } Hm c i s l tham chiu n ma trn chnh (cha trng thi hin ti ca php bin

    hnh) v cc gi tr tnh tin x, y. u tin, n to ma trn tnh tin ; Ri nhn ma trn tnh tin vi ma trn chnh, lu kt qu trong ma trn cc b m2; Cui cng sao chp m2 tr li ma trn chnh. - Hm co gin:

    Void Scale(MATRIX3X3& m,double xScale,double yScale) {

    MATRIX3X m1,m2;

    m[0][0] = xScale; m[0][1] = 0; m[0][2] = 0; m[1][0] = 0; m[1][1] = yScale; m[1][2] = 0; m[2][0] = 0; m[2][1] =0; m[2][2] = 1;

    MultMatrix(m2,m1,m); CopyMatrix(m,m2);

    }

    - Hm quay: Void Rotate(MATRIX3X3& m,int degrees) {

    MATRIX3X m1,m2; If (degrees = = 0) return; Double radians = 6.283185308/(360.0/ degrees); Double c = cos(radians); Double s = sin(radians); m[0][0] = c; m[0][1] = s; m[0][2] = 0; m[1][0] = -s; m[1][1] = c; m[1][2] = 0; m[2][0] = 0; m[2][1] =0; m[2][2] = 1;

  • MultMatrix(m2,m1,m); CopyMatrix(m,m2);

    }

    Hm quay c cc i s l tham chiu n ma trn chnh v gc quay(). u tin n kim tra gc quay c bng khng hay khng. Nu gc quay bng khng, hm kt thc loi tr, li chia cho 0. Nu khc khng, hm i ra radians v tnh sin, cosin. Tip theo, Rotate khi to ma trn quay, nhn n vi ma trn chnh, lu kt qu vo ma trn cc b m2. Cui cng, sao chp m2 tr li ma trn chnh.

    By gi ta c mt b hm dng ma trn. Hy xt cch dng chng trong bin hnh on m sau:

    MATRIX3X3 m; IntMatrix(m); Translate(m,10,15); Scale(m,0.5,0.5); Rotate(m,45); Transform(shape1,m); DrawShape(shape1);

    Trc tin on m khai bo mt ma trn bin hnh 3X3 l m. Sau gi hm IntMatrix() khi to m theo ma trn n v. M s l:

    1.0000000000000 0.0000000000000 0.0000000000000 0.0000000000000 1.0000000000000 0.0000000000000 0.0000000000000 0.0000000000000 1.0000000000000

    Li gi hm Translate( ) kt hp m vi ma trn tnh tin cha cc gi tr 10 v

    15. Matrn bin hnh m s l: 1.0000000000000 0.0000000000000 0.0000000000000 0.0000000000000 1.0000000000000 0.0000000000000 10.0000000000000 15.0000000000000 1.0000000000000

    Sau khi gi hm Scale( ), m cha cc gi tr ca php tnh tin v co gin: 1.0000000000000 0.0000000000000 0.0000000000000 0.0000000000000 0.5000000000000 0.0000000000000 10.0000000000000 15.0000000000000 1.0000000000000 Cui cng sau li gi hm Rotate( ), m cha y cc php tnh tin v quay: 0.35355339055702 0.3535533906295 0.0000000000000 -o.35355339062953 0.35355339055702 0.0000000000000 10.000000000000 15.000000000000 1.0000000000000

    Li gi hm Translate() p dng ma trn cho mt vertex ca shape1. Sau Drawshape() v hnh bin hnh ln mn hnh.

  • Chng 3: Ha Ba Chiu GDI Trong chng ny, chng ta s tm hiu: - H ta cc ba chiu. - nh ngha vertex cho i tng 3-D. - Php chiu song song v php chiu phi cnh. - Chuyn ng i tng 3-D.

    3.1.H Ta Ba Chiu: Mt i tng ba chiu th khng th biu din trong h ta hai chiu ch gm hai trc x v y. to h ta mi, ta ch n gin thm mt trc z vo mt phng cc, bin i thnh hnh khi. Mt d cc trc x, y, z c th hng theo mi phng, ta qui nh trc x theo chiu ngang, trc y theo chiu ng, trc z theo phng i vo v ra mn hnh. l hng trc logic cho nhiu chng trnh, xut pht t vic trc x v y chy theo cc phng tng ng vi ta mn hnh. 3.2 .nh Ngha i Tng Ba Chiu: Vic to mt hnh hai chiu ch n gin l nh ngha tp vertex ca n, ri ni cc vertex vi nhau. Nhng i vi i tng 3-D, vn c php tp hn, bi v s lng vertex l nhiu hn, i hi vic xc nh vic ni cc vertex hnh thnh ng i tng yu cu. Do , i vi chng, khng ch nh ngha cc vertex, m cn phi nh ngha cc cnh. Mt i tng 3-D c xy dng trn cc vertex v cnh c gi l mt m hnh khung li (wireframe model). nh ngha mt m hnh khung li cn danh sch cc vertex v cnh. Do , hin nhin l cn mt s kiu d liu mi.

    -Trc tin l kiu d liu nh ngha vertex ca i tng 3-D vi ba ta x, y, z nh sau:

    Typedef struct vertex { int x,y,z,w; }VERTEX;

    - v mt cnh, ta cn bit vertex khi u v vertex kt thc, sau ni chng li vi nhau. Kiu d liu nh ngha cnh nh sau:

    Typedef struct edge { UINT vertex1,vertex2;

    }EDGE; Vi vertex1 l im xut pht cnh, v vertex2 cui. - Kiu d liu ca m hnh khung li nh sau:

    Typedef struct model { UINE numverts; VERTEX* vertices; UINE numEdges; EDGE*edges;

  • }MODEL; Nh vy, cu trc MODEL bao gm hai s nguyn khng du cha vertex v cnh

    i tng, mt con tr ch n kiu d liu VERTEX cha a ch ca danh sch vertex, v m con tr ch n kiu d liu EDGE cha a ch ca danh sch cnh. Hnh 3.1Hnh khi:

    S dng cc kiu d liu trn cho khi vung, vi s th t cc nh nh hnh 3.1. Ta cc nh ln lc l (0,4,0), (4,4,0), (4,4,-4), (0,4,-4), (0,0,0,), (4,0,0), (4,0,-4),(0,0,-4).

    Danh sch vertex s nh sau : VERTEX cubeVerts[8] = {

    0,4,0, 4,4,0,

    4,4,-4, 0,4,-4,

    0,0,0, 4,0,0,

    4,0,-4, 0,0,-4,

    } Ch rng ta z ca i tng cho bng 0 hoc m, do chiu tng ta z

    hng ra khi mn hnh . Cc ta dng nh ngha mt m hnh khung li, nh trong cu trc cubeverts trn, th c xem l cc ta cc b. Ta cc b tr thnh ta th gii khi chng trnh s dng cc php tnh tin co gin hoc quay v bin m hnh. Cui cng, chng trnh ha bin i cc ta th gii thnh ta mn hnh c th th hin m hnh ln mn hnh. Danh sch cnh ca khi vung trn nh sau :

    EDGE cubeedges[12]= {

    1,2, 2,3,

    3,4, 4,1,

    5,6, 6,7,

    7,8, 8,5,

    5,1, 6,2,

  • 7,3, 8,4, };

    Bn cp ta u to thnh nh hnh khi. Bn cp ta tip theo hnh thnh y hnh khi. Bn cp to cui cng ni nh v y hnh khi vi nhau. Vi danh sch vertex v danh sch cnh c, khi vung trn hnh 3.1 c nh ngha nh sau:

    MODEL cube = {8,cubeVerts,12,cubeEdges};

    3.3.Cc Phng Php Th Hin 3-D Ln Mn Hnh: Mt i tng 3-D c xc nh bi cc ta x,y,z,nhng mn hnh th c

    biu din ch vi cc ta x, v y. Vy bng cch no c th biu din mt i tng 3-D ln mn hnh ? C hai phng php thc hin vn trn l php chiu song song v php chiu phi cnh.

    3.3.1.Php Chiu Song Song: Vi php chiu song song, mt i tng 3-D c th hin ln mn hnh bng cch b qua cc ta z. Kt qu l mt hnh 2-D n gin. Nh vy, vi trng hp khi vung, hnh nh th hin trn mn hnh ch l mt hnh vung. Hm v khi vung s dng php chiu song song nh sau :

    Void DrawModel (CDC* pDC, MODEL& mode) {

    int newX,int newY; RECT clientRect; GetClientRect (&clientRect); Int maxY = clientRect.bottom; For (UINT I=0; IMoveTo(newX,newY); vertNum = model.edges[i].vertex2; newX = model.vertices[vertNum 1].x;

    newY = maxY model.vertices[vertNum -1].y 1; pDC -> LineTo(newX,newY); }

    } Hm trn gi GetClientRect() xc nh ta Y ln nht ca ca s. Sau

    dng vng lp for v cc cnh ca i tng. Bn trong vng lp, hm tnh s hiu ca vertex dng lm im u ca cnh, ri dng s tm cc ta X, Y ca vertex. Cc ta ny c dng trong li gi n MoveTo() xc nh v tr im u. Cc ta X, Y, ca im th hai c tm bng cch tng t, sau dng trong hm gi n LineTo() v cnh:

  • 3.3.2 .Php Chiu Phi Cnh: Php chiu song song khng th s dng, nhng n khng mang li mt kt qu

    va , tr khi dng cho mt chng trnh phc tho. Mt yu t then cht ca hnh nh 3-D l chiu su nh. Ao gic m c to bng cch dng php chiu phi cnh, lm cho i tng xa c v nh hn i tng gn . V d hnh 3.2 biu din hnh chiu phi cnh ca khi vung, khi quan st t mt trc, gc di tri.

    Hnh 3.2 v khi vung vi php chiu phi cnh

    Cc cng thc dng cho php chiu phi cnh : Double t 1.0/(1.0 zCoord / eye); PerspX = (int) ( xCoord * t); PerspY = (int) ( yCoord * t);

    Bin t cha gi tr co gin cc ta X v Y trn c s ta Z . Ta Z cng nh (cng xa gc ta ), th tc dng co gin cng ln . Cc bin xCoord, yCoord v zCoord cha cc ta vertex. Cc bin perspX, prspY cha ta mn hnh ca vertex sau php chiu phi cnh. Bin eye xc nh mc tc ng ca php chiu trn m hnh. Khi quan st i tng cng gn (eye cng nh) th hiu qu php chiu cng ln . Hnh 3.3 Hnh chiu phi Hnh 3.4 Hnh chiu phi cnh

    cnh khi quan st gn(eye nh) khi quan st xa (eye ln)

    Hm gn php chiu phi cnh cho cc vertex ca mt m hnh khung li nh sau :

    Void PerspProject (MODEL& model, double eye) {

    for (UINT I =0; I

  • } }

    Hm trn c cc i s l tham chiu n cc cu trc MODEL v gi tr eye dng tnh ton t. PerspProject()dng vng lp for gn php chiu phi cnh cho tng vertex ca m hnh. on m v d sau cho thy cc nh ngha m hnh, gn php chiu v v i tng: VERTEX cubeVerts[8] =

    {0, 100, 0, 1, 100, 100, 0, 1, 100, 100, -100, 1, 0, 100, -100, 1, 0, 0, 0, 1, 100, 0, 0, 1, 100, 0, -100, 1, 0, 0, -100, 1];

    EDGE cubeEdges[12] = { 1,2, 2,3, 3,4,

    4,1, 5,6, 6,7, 7,8, 8,5, 5,1, 6,2, 7,3, 8,4}; MODEL cube; Cube.numVerts = 8; Cube.vertices = cubeVerts; Cube. numEdges = 12;

    PerspProject (cube, 200); DrawModel (pDC, cube);

    3.4.Bin Hnh i Tng 3-D: Nh vy v mt i tng 3-D th khng kh. Nhng vi gc nhn pha trc,

    gc di tri nh hnh 3.2 th cng khng p g. c mt gc nhn khc, ta cn bin hnh i tng . Vic bin hnh i tng 3-D khng khc my so vi bin hnh i tng 2-D, ch n gin l ch xt thm ta z . Ma trn bin hnh dng trong trng hp ny c kch thc 4x4, vi kiu d liu nh sau: Typedef double MATRIX4x4[4][4]; Cc hm InitMtrix(), CopyMatrix(), MultMatrix() by gi nh sau: Khi to ma trn:

  • Void InitMatrix(MATRIX4x4& m) {

    m[0][0] = 1; m[0][1] = 0; m[0][2] = 0; m[0][3] = 0; m[1][0] = 0; m[1][1] = 1; m[1][2] = 0; m[1][3] = 0; m[2][0] = 0; m[2][1] =0; m[2][2] = 1; m[2][3] = 0; m[3][0] = 0; m[3][1] = 0; m[3][2] = 0; m[3]3[] = 1;

    } Hm sao chp ma trn : Void CopyMatrix(MATRIX4x4& src) {

    for (int =0; I

  • Ma trn co gin: XFactor 0 0 0

    0 YFactor 0 0 0 0 ZFactor 0

    0 yTrans zTrans 1 Hm co gin: Void Scale(MATRIX4x4& m,double xScale,yScale,zScale) { MATRIX4x4 m1,m2; m[0][0] = xScale; m[0][1] = 0; m[0][2] = 0; m[0][3] = 0; m[1][0] = 0; m[1][1] = yScale; m[1][2] = 0; m[1][3] = 0; m[2][0] = 0; m[2][1] =0; m[2][2] = zScale; m[2][3] = 0; m[3][0] = 0; m[3][1] = 0; m[3][2] = 0; m[3]3[] = 1; MultMatrix(m2,m1,m); CopyMatrix(m,m2); }

    3.4.3. Php Quay 3-D: Khi quay mt hnh phng, thc cht l ta quay n quanh trc z. i vi i tng

    3-D, ta c th quay n quanh 3 trc x, y, z. Th nhng khng c mt ma trn n gin c th thc hin 3 php quay cng mt lc. Thay vo , mi php quay coi nh mt php bin hnh ring bit. a) Quay Quanh Trc Z: Ma trn quay quanh trc z: Cos(radians) sin(radians) 0 0 -sin(radians) cos(radians) 0 0 0 0 1 0 0 0 0 1 Hm quay quanh trc z: Void Rotate(MATRIX4x4& m,int zAngle) {

    if (zAngle = =0) return; double radians = 6.383185308 / (360.0 / zAngle); double c = cos(radians); double s = sin(radians);

    m[0][0] = c; m[0][1] = s; m[0][2] = 0; m[0][3] = 0; m[1][0] = -s; m[1][1] = c; m[1][2] = 0; m[1][3] = 0; m[2][0] = 0; m[2][1] = 0; m[2][2] = 1; m[2][3] = 0;

    m[3][0] = 0; m[3][1] = 0; m[3][2] = 0; m[3]3[] = 1; MultMatrix(m2,m1,m);

    CopyMatrix(m,m2); }

  • b) Quay Quanh Trc X: Ma trn quay quanh trc x:

    1 0 0 0 0 cos(radians) sin(radians) 0 0 -sin(radians) cos(radians) 0 0 0 0 1 Hm quay quanh trc X: Void Rotate(MATRIX4x4& m,int zAngle) {

    if (zAngle = =0) return; double radians = 6.383185308 / (360.0 / zAngle); double c = cos(radians); double s = sin(radians);

    m[0][0] = 1; m[0][1] = 0; m[0][2] = 0; m[0][3] = 0; m[1][0] = 0; m[1][1] = c; m[1][2] = s; m[1][3] = 0; m[2][0] = 0; m[2][1] =-s; m[2][2] = c; m[2][3] = 0; m[3][0] = 0; m[3][1] = 0; m[3][2] = 0; m[3]3[] = 1;

    MultMatrix(m2,m1,m); CopyMatrix(m,m2);

    }

    c) Quay Quanh Trc Y: Ma trn quay quanh trc y:

    cos(radians) 0 -sin(radians) 0 0 1 0 0 sin(radians) 0 cos(radians) 0 0 0 0 1 Hm quay quanh trc Y: Void Rotate(MATRIX4x4& m,int zAngle) {

    if (zAngle = =0) return; double radians = 6.383185308 / (360.0 / zAngle); double c = cos(radians); double s = sin(radians);

    m[0][0] = c; m[0][1] = 0; m[0][2] = -s; m[0][3] = 0; m[1][0] = 0; m[1][1] = 1; m[1][2] = 0; m[1][3] = 0; m[2][0] = s; m[2][1] = 0; m[2][2] = c; m[2][3] = 0;

    m[3][0] = 0; m[3][1] = 0; m[3][2] = 0; m[3]3[] = 1; MultMatrix(m2,m1,m); CopyMatrix(m,m2);

    Chng 4: Chng Trnh OpenGL Ti Thiu

  • Chng ny trnh by cch khi to ng dng OpenGL v cch kt hp OpenGL vo mt chng trnh MFC : _ Cc yu cu ca mt chng trnh OpenGL ti thiu . _ Cc kiu d liu v c php ca lnh OpenGL. _ Cch to ng cnh biu din v nh dng im v. _ Cch thit lp mt chng trnh MFC cho OpenGL . 4.1.Cc Kiu D Liu OpenGL :

    OpenGL nh ngha kiu d liu d dng thao tc trong chng trnh . Cc kiu d liu ny c trnh by trong bng 4.1.

    Bng 4.1 : Cc kiu d liu OpenGL & hu t tng ng ca lnh Kiu d liu OpenGL Kiu d liu tng ng

    trong C ngha

    Glbyte Signed char S nguyn 8 bit Glshort Short S nguyn 16 bit GLint,GLsizei Long S nguyn 16 bit Glfloat,GLclampf Float Du chm ng 32 bit Gldouble,Glclampd Double Du chm ng 64 bit Glubyte,Glboolean Unsigned char Char khng du 8 bit Glushort Unsigned short S nguyn khng du 16 bit Gluint, GLenum, Glbitfield

    Unsigned long S nguyn khng du 32 bit

    Glvoid Void Hm khng i s hoc khng tr v mt gi tr

    HGLRC HGDIOBJ Handle ca di tng GDI 4.2. Ng Cnh Biu Din :

    Mi chng trnh trn Windows u phi s dng ng cnh dng c (DC,Device Context), l cu trc d liu cha ng thng tin v cch m d liu ha c th hin trn ca s. Ng cnh dng c xc nh mu sc bt v v c, kiu v, ni dung bng mu, kiu mapping (kiu th hin cc phn t ca khng gian ta ngun ln khng gian ta ch), v cc thuc tnh khc m Windows cn bit th hin thng tin ha.

    OpenGL cng s dng ng cnh dng c nh mi chng trnh Windows khc. Nhng ng thi phi s dng ng cnh biu din (RC,Rendering Context). Ton b lnh OpenGL u phi qua ng cnh biu din. Mi thread thc hin li gi OpenGL phi c mt ng cnh biu din hin hnh. Ng cnh biu din kt ni OpenGL vo h thng ca s ca Windows NT va Windows95. ng dng s xc nh ng cnh dng c khi n to ng cnh biu din. Ng cnh biu din ny ph hp vi thut v trn cc ng dng ch nh bi ng cnh dng c. c bit l ng cnh biu din c cng nh dng im v (pixel format) nh ng cnh dng c . Mc d vy, Ng cnh biu din khng phi l ng cnh dng c . Ng cnh dng c cha cc thng tin thch hp i vi GDI ca Windows

  • NT v Windows. Cn ng cnh biu din cha cc thng tin thch hp i vi OpenGL . Mt li gi GDI phi xc nh r rng nh mt ng cnh dng c. V mt li gi OpenGL phi xc nh r rng mt ng cnh biu din .

    Mt thread thc hin li gi OpenGL phi c mt ng cnh biu din hin hnh. Nu ng dng tin hnh li gi OpenGL t mt thread khng c ng cnh biu din, th li gi khng hiu lc. Thng thng, ng dng to ng cnh biu din, gn ng cnh l ng cnh biu din hin hnh ca thread, ri gi hm OpenGL. Khi kt thc vic gi hm OpenGL, ng dng tho b ng cnh biu din khi thread, v xa n. Mt ca s cng mt lc c th c nhiu ng cnh biu din, nhng ch mt trong s hin hnh v c tc dng.

    Mt ng cnh biu din hin hnh th c mt ng cnh dng c kt hp. Ng cnh dng c khng cn phi l ng cnh dng c dng khi ng cnh biu din c to ra, nhng phi tham chiu n cng mt dng c v c cng nh dng im v.

    Mt thread c duy nht mt ng cnh biu din hin hnh.V mt ng cnh biu din l hin hnh cho mt thread duy nht .

    Mi li gi hm OpenGL tim n mt ng cnh biu din. Trong khi i vi ng cnh dng c, mi hm GDI cn mt handle, th i vi ng cnh biu din, ch cn handle khi to ng cnh biu din hin hnh.

  • Bng 4.2 : Cc hm WGL qun l ng cnh biu din Tn hm Chc nng WglCreateContext () To mt ng cnh biu din mi WglDeleteContext () Xa ng cnh biu din WglGetCurrentContext ()

    Tr handle v ng cnh biu din hin hnh

    WglGetCurrentDC () Ly handle ca ng cnh dng c lin kt vi ng cnh biu din hin hnh

    WglMakeCurrent () Thit lp ng cnh biu din hin hnh 4.3.nh dng im v :

    Trc khi to ng cnh biu din, chng trnh phi thit lp nh dng im v cha cc thuc tnh ca b mt v. Cc thuc tnh ny bao gm ch mu l RGBA hay ch mc, b m im v l n hay i, s lng cc bit dng trong b m chiu su v b m stencil, cng cc thng tin ha OpenGL khc .

    Bng 4.3 : Cc hm Win32 qun l cc nh dng im v

    Tn hm Chc nng ChoosePixelFormat () Tr v mt nh dng im v ph hp nht vi nh

    dng im v yu cu DescribePixelFormat () Ly thng tin v nh dng im v cho GetPixelFormat () Ly nh dng im v ca ng cnh dng c cho SetPixelFormat () Thit lp nh dng im v ca ng cnh dng c

    cho

    4.3.1.Cu Trc PIXELFORMATDESCRIPTOR: Mi thit b hin th OpenGL h tr mt s nh dng im v ring. D nhin, cc

    nh dng im v ny da trn kh nng thit b. Cc thuc tnh ca mt nh dng im v ring bit th c miu t bi cu trc PIXELFORMATDESCRIPTOR, gm 26 trng thng tin. Win32 nh ngha cu trc ny nh sau :

    Typedef struct tag PIXELFORMATDESCRIPTOR { WORD nSize;

    WORD nVersion; DWORD dwFlags; BYTE iPixelType; BYTE cColorBits; BYTE cRedBits; BYTE cRedShift; BYTE cGreenBits; BYTE cGreenShift; BYTE cBlueBits; BYTE cBlueShift;

  • BYTE cAlphaBits; BYTE cAlphaShift; BYTE cAccumBits; BYTE cAccumRedBits; BYTE cAccumGreenBits; BYTE cAccumBlueBits; BYTE cAccumAlphaBits; BYTE cDepthBits; BYTE cStencilBits; BYTE cAuxBuffer; BYTE iLayerType; BYTE bServered; DWORD dwLayerMask; DWORD dwVisibleMask; DWORD dwDamageMask;

    } PIXELFORMATDESCRIPTOR,* PPIXELFORMATDESCRIPTOR, FAR * LPPIXELFORMATDESCRIPTOR

    Khi thit lp nh dng im v ca ng cnh dng c, th cu trc PIXELFORMATDESCRIPTOR c in y, v a ch ca n c dng lm i s cho hm SetPixelFormat () .

  • Bng 4.4 :Cc thnh phn ca cu trc PIXELFORMATDESCRIPTOR Thnh phn M t Nsize Kch thc tnh bng byte ca cu trc . c th thit lp

    bng sizeof(PIXELFORMATDESCRIPTOR). Nversion S phin bn (version ) ca cu trc , hin bng 1. DwFlags Cc c c tnh cho nh dng im nh (bng 4.6) IpixelType M t d liu mu ca im v :

    - PFD_TYPE_RGBA :i vi ch mu RGBA - PFD_TYPE_INDEX i vi ch mu ch mc

    CColorBits S bit dng th hin mt mu . N quyt nh s mu th hin . V d 8 bit th hin c 256 mu . i vi ch mu RGBA, th khng tnh n alpha bitplane.i vi ch mu ch mc , cColorBits xc nh kch thc b m mu .

    cRedBits S bit trong b m mu RGBA cRedShift Tng di cc bitplane trong b m mu RGBA cGreenBits S bit xanh l trong b m mu RGBA cGreenShift Tng di cc bitplane xanh l trong b m mu

    RGBA cBlueBits S bit xanh dng trong b m mu RGBA cBlueShift Tng di cc bitplane xanh dng trong b m mu

    RGBA cAlphaBits S bit alpha trong b m mu RGBA . Khng dng trn

    microsoft windows cAlphaShift Tng di cc bitplane alpha trong b m mu RGBA.

    Khng dng trn microsoft windows cAccumBits S bitplane trong b m tch ly cAccumRedBits S bit trn mt pixel trong b m tch ly cAccumGreenBits S bit xanh l trn mt pixel trong b m tch ly cAccumBlueBits S bit xanh dng trn mt pixel trong b m tch ly cAccumAlphaBits S bit alpha trn mt pixel trong b m tch ly cDepthBits S bitplane trong b m chiu su cStencilBits S bitplane trong b m stencil cAuxBuffer S b m ph .khng dng trn microsoft windows iLayerType Xc nh kiu lp .trn Microsoft Windows l

    PFD_MAIN_PLANE . Ngoi ra cc kiu lp khc l FPD_OVERLAY_PLANE v PFD_UNDERLAY_PLANE

    bServered Dng d tr .thng bng 0 dwLayerMask Hai trng hp ny i i vi nhau xc nh mt lp

    che mt lp .Trn Microsoft Windows khng dng lp dwVisibleMask dwDamageMask Dng khi nhiu hn mt nh dng im v s dng

    chung b m khung. Nu bitwise AND ca cc thnh

  • vin dwDamageMask ca hai khung nh dng im v khc 0 , th chng s dng chung mt b m khung.

    Bng 4.5 :Cc c c tnh cho nh dng im nh

    C M t PFD_DRAW_TO_BITMAP B m c dng v vo bitmap b nh PFD_DRAW_TO_WINDOW B m c dng v vo ca s trn mn

    hnh hay thit b khc nh my in PFD_DOUBLEBUFFER Thit lp khi dng b m i.Khng dng

    cng vi c PFD_SUPPORT_GDI. PFD_GENERIC_FORMAT Thit lp khi chn nh dng im v tng

    qut ,l nh dng im nh c h tr bi phn cng hay trnh iu khin thit b

    PFD_NEED_PALETTE Thit lp khi dng bng mu logic PFD_NEED_SYSTEM_PALETTE Thit lp khi h thng s dng phn cng

    OpenGL ch c h tr bi mt bng mu phn cng duy nht . (Bng mu phn cng mapping mt_mt vi bng mu logic)

    PFD_STEREO Thit lp khi chn b m lp th.khng dng trn Microsoft Windows

    PFD_SUPPORT_GDI B m h tr cc hm ha GDI .Khng dng cng vi c PFD_DOUBLEBUFFER

    PFD_SUPPORT_OPENGL B m h tr cc hm ha OpenGL PFD_DOUBLE_BUFFER_DONTCARE

    nh dng c th dng b m n hay i ,khng u tien cho bt cho ring loai no

    PFD_STEREO_DONTCARE Cnh lp th hoc khng lp th, khng u tin cho ring loi no

    4.3.2 .Khi To PIXELFORMATDESCRIPTOR: Cu trc PIXELFORMATDESCRIPTOR l phc tp v c c mt kt qu

    mong mun, khi in vo cu trc cn c mt s hiu bit thc s v OpenGL v hoat ng ca n.Tuy nhin, c th dng gi tri mc nh cho hu ht cc thnh phn ca cu trc. Cc gi tr mc nh ny hot ng tt trn nhiu h thng.

    PIXELFORMATDESCRIPTOR pfd= {

    sizeof (PIXELFORMATDESCRIPTOR) //Kch thc cu trc. 1, //S version ca cu trc PFD_DRAW_TO_WINDOW | //V vo ca s

    PFD_SUPPORT_OPENGL, //H tr li gi OpenGL PFD_TYPE_RGBA, //Ch mu RGBA 24, //24 bit mu

  • 0,0,0,0,0,0, //khng lu chn 0,0,0,0,0,0,0, //cc ch 32, //b m chiu su 32 bit 0,0, //Khng dng b m stencil hay

    b m ph tr PFD_MAIN_PLANE, //Kiu lp ch yu 0, //Khng chn 0,0,0, //Khng chn

    }; vi khi to nh trn, cc c c tnh trong dwFlags cho php ng dng s dng cc hm OpenGL v vo ca s, trong khi c PFD_TYPE_DATA trong iPixelType chn ch mu RGBA. Trng cColorBits chn 24 mu th hin 16.7 triu mu (mu s khng n nh trn h thng 256 mu). Cc thnh phn t cRedBits n cBlueShift khng c chn. ng dng s khng dng cc b m alpha hay b m tch ly, do thit lp cc trng t cAccumBits dn cAccumAlphaBits bng 0. Trng cDepthBits chn b m chiu su 32 bit. Hai s 0 tip theo cho bit ng dng khng dng cc b m ph tr hay b m stencil. C PFD_MAIN_PLANE trong iLayerType l gi tr c duy nht dng cho kiu lp trong Microsoft Windows. Cui cng, cc thnh phn d tr v khng h tr c thit lp bng 0.

    4.3.3.Thit Lp nh Dng im V : Khi khi to cu trc PIXELFORMATDESCRIPTOR, ta c th thit lp nh

    dng im v, nh on sau : CclientDC clientDC(this); Int pixelFormat=ChoosePixelFormat(clientDC.m_hDC,&pfd); BOOL result=SetPixelFormat(clientDC.m_hDC,pixelFormat,&pfd); dng u tin, chng trnh ly DC cho vng client ca ca s ng dng. Sau

    , ChoosePixelFormat() ftrong dng th hai tm kim mt ch s cho nh dng v ph hp nht v yu cu nh dng.

    Hai i s ca handle di vi DC ( chn la nh dng im v ), v a ch ca cu trc PIXELFORMATDESCRIPTOR (gi thuc tnh ca nh dng im v yu cu). Nu vic gi hm khng thnh cng, ChoosePixelFormat() tr v gi tr 0. Nu thnh cng, n tr v ch s nh dng im v.

    Dng th 3 gi SetPixelFormat() thit lp nh dng im v. Ba i s ca hm ny l handle i v DC, ch s nh dng im v, v a ch cu trc PIXELFORMATDESCRIPTOR . Nu thnh cng , hm tr v gi tr TRUE, ngc li, n tr v gi tr FALSE

    4.3.4.Lit K nh Dng im V: Ch rng ChoosePixelFormat() tr v mt ch s nh dng im v ph hp vi

    yu cu nh dng .Thng thng, khng c vn y. Tuy nhin, lun lun phi kim tra nh dng ny trc khi chc chn n ph hp vi ng dng. Mt cch thc hin l xem xt mi nh dng c hiu lc, ri chn ra nh dng no c coi l tt nht cho ng dng. on m thc hin nh sau :

  • PIXELFORMATDESCRIPTOR pfd; CClientDC clientDC (this); Int numFormat = DescribePixelFormat(clientDC.m_hDC,1,sizeof(pfd),&pfd); For(int i= 0;I
  • Thun li ca phng php ny l chng trnh ch cn mt ln lm cho ng cnh biu din tr nn hin hnh. V vic lm cho ng cnh biu din tr nn hin hnh chim nhiu thi gian x l, nn phng php 1 cho php ng dng p ng thng bo WM_PAINT nhanh hn.

    im bt li l ch phi duy tr mt ng cnh dng c cho ton b thi gian chy chng trnh. Ngoi ra, vi cc chng trnh to ra bi AppWizard ca Visual C++, th phng php ny khng thch hp.

    4.4.2.Phng Php 2 : Vi phng php ny, chng trnh to v gii phng ng cnh dng c ca ca s

    cho mi ln v, nh vy khng cn duy tr ng cnh dng c cho ton b thi gian chy chng trnh.Tuy nhin, c mi ln to ng cnh dng c, chng trnh ng thi phi lm cho ng cnh biu din tr nn hin hnh .

    on m sau qun l ng cnh biu din theo phng php 2: IntOpenglView::OnCreate(LPCSREATESTRUCT lpCreateStruct) { if(Cview :: ONCreate(lpCreateStruct) = = -1) return -1; PIXELFORMATDESCRIPTOR pfd= {

    sizeof (PIXELFORMATDESCRIPTOR) //Kch thc cu trc. 1, //S version ca cu trc PFD_DRAW_TO_WINDOW | //V vo ca s PFD_SUPPORT_OPENGL, //H tr li gi OpenGL PFD_TYPE_RGBA, //Ch mu RGBA 24, //24 bit mu 0,0,0,0,0,0, //khng lu chn 0,0,0,0,0,0,0, //cc ch 32, //b m chiu su 32 bit 0,0, //Khng dng b m stencil hay b m ph tr PFD_MAIN_PLANE, //Kiu lp ch yu 0, //Khng chn 0,0,0, //Khng chn

    }; CClientDC clientDC(this); int pixelFormat=ChoosePixelFormat(clientDC.m_hDC,&pfd);

    BOOL success=SetPixelFormat(clientDC.m_hDC,pixelFormat,&pfd); m_hDC = wglCreateContext(client.m_hDC) return 0;

    } void OpenglView::OnDraw(CDC* pDC) {

    Copengl1Doc* pDoc=GetDocument();

  • ASSERT_VALID(pDoc);

    wglMakeCurrent(pDC->m_hDC,m_hRC); DrawWithOpenGL(); wglMakeCurrent(pDC->m_hDC,NULL);

    } void CopenglView ::ONDestroy() {

    wglDeleteContext(m_hRC); }

    Hm OnCreate() p ng thng bo WM_CREATE bng cch trc tin ly ng cnh dng c cho vng client ca ca s. Sau o, gi ChoosePixelFormat () tm ch s nh dng im v yu cu cho DC v gi hm SetPixelFormat () thit lp nh dng im v.

    Tip theo, OnCreate() gi wglCreateContext() to RC thch hp vi ng cnh dng c cho. i s ca hm ny l handle ca DC. Nu thnh cng, wglCreateContext() tr v mt handle RC. Nu khng thnh cng, hm tr v gi tr 0.

    Trong on trng trnh trn, OnCreate() ch to mt DC tm thi, ch c phm vi cc b, nn t ng hy khi tr v, Do DC b hy, n khng th lm cho RC tr nn hin hnh ti im ny trong chng trnh.

    n khi cp nht ni dung ca ca s ng dng, MFC gi hm OnDraw() ca lp view. Lc ny hm OnDraw() sc lm cho RC tr nn hin hnh, bng cch gi wglMakeCurrent() s dng handle ca i tng DC (DC bt v) c truyn cho hm. Hai i s ca OnDraw() l handle DC v handle ca RC. Nu thnh cng, wglMakeCurrent() tr v gi tr TRUE, ngc li n tr v gi tr FALSE. Sau khi lm cho RC tr nn hin hnh, OnDraw() gi cc b DrawWithOpenGL() v ln ca s. (Phi vit code cho hm ny)

    Li gi ln 2 n wglMakeCurrent(), vi thng s th hai l NULL lm cho ng cnh biu din tr nn khng hin hnh. (Vi mc ch ny, cng c th dng gi tr NULL cho c hai i s)

    Cui cng, khi kt thc ng dng, MFC gi hm OnDestroy() ca lp view. Trong OnDestroy(), chng trnh ch gi wglDeleteContext() xa ng cnh biu din . Thng s duy nht ca hm l handle ca ng cnh biu din. Nu thnh cng , th wglDeleteContext() ftr v gi tr l TRUE , tri li n tr v gi tri FALSE. Do ng cnh dng c c to v hy trong p ng cho thng bo WM_PAINT, nn khng c ng cnh dng c hy cui chng trnh. C hai iu bit thm l: - C th cng lc lm cho ng cnh biu din hin ti tr nn khng hin hnh, v mt

    ng cnh biu din mi tr nn hin hnh, bng cch s dng handle ca ng cnh biu din mi lm thng s th hai ca hm wglMakeCurrent ().

    - Mt ng cnh dng c khng th b xa khi cn rng but vi ng cnh biu din. Trc khi xa ng cnh dng c, phi gi wglMakeCurrent() vi gi tr ca i s th hai l NULL tch ng cnh dng c ra khi ng cnh biu din.

  • on m OnCreate() trn cho thy cch dng cc hm wglCreateContext(), wglDeleteContext(), wglMakeCurrent(). Cn cc hm wglGetCurrentContext(), wglGetCurrentDC(), dng tm kim thng tin v cc ng cnh biu din v dng c, th s dng nh sau : Li gi wglCurrentContext();

    HGLRC hRC = wglGetCurrentContext(); Nu thnh cng, hm tr v mt handle theo RC hin hnh, tri li n tr v ga tr

    NULL . Li gi wglCurrentDC()

    HDC Hdc = wglGetCurrentDC(); Nu thnh cng, hm tr v mt handle theo ng cnh dng c rng but vi ng

    cnh dng c hin hnh.Tri li n tr v NULL 4.5.TngKt:

    gi thnh cng cc hm OpenGL, chng trnh phi to ng cnh biu din l phin bng OpenGL ca ng cnh dng c- cho ca s m OpenGL s v vo. to ng cnh biu din, trc tin phi thit lp nh dng im v ca ca s. Khi sn sng dng cc hm OpenGL v, chng trnh phi lm cho ng cnh biu din tr nn hin hnh, ngha l rng but ng cnh biu din vi ng cnh dng c ca ca s. Trc khi kt thc chng trnh, ng cnh biu din phi c lm tr nn khng hin hnh v b xa

    Chng 5:V Hnh V S Dng Mu Chng ny trnh by : - Cch gi cch hm OpenGL - Cc trng thi OpenGL - Cch chn mu - Cch nh ngha hnh dng - Cc hnh dng c bn c h tr bi OpenGL

    5.1.C Php Lnh OpenGL: Qui c t tn hm OpenGL nh sau :

    g l C o l o r 3 f ()

    Th vin hm c bn s lng kiu d liu i s ca i s Cc bng 5.1, 5.2 tng kt cc tin t, hu t v ngha ca chng.

    Do th hin nhiu dng khc nhau, vi cc hu t khc nhau, ty thuc vo s lng v loi thng s m chng tip nhn, nn trn thc t s lnh mu (prototype hn s lnh c bn) nhiu hn s lnh c bn. Nh bao gm ht nhn OpenGL c hn 300 nguyn mu, trong khi ch gm 115 hm c bn:

  • V d lnh glVertex2f() c hu t l 2f , cho bit lnh c i s l 2 du chm ng . glVertex c n 24 dng: glVertex2d() glVertex2f() glVertex3d() glVertex3f() glVertex4d() glVertex4f() glVertex2i() glVertex2s() glVertex3i() glVertex3s() glVertex4i() glVertex4s() glVertex2dv() glVertex2fv() glVertex3dv() glVertex3fv() glVertex4dv() glVertex4fv() glVertex2iv() glVertex2sv() glVertex3iv() glVertex3sv() glVertex4iv() glVertex4sv() Ch rng c 12 lnh sau kt thc bng ch v, cho bit cc i s c cho di dng vector.

    Bng 5.1 : Cc tin t lnh OpenGL Th vin

    B ht nhn

    Utility Auxiliary WGL Win32 API

    Tin t gl glu Aux wgl Khng c tin t c bit 5.2.Cc Trng Thi OpenGL:

    Mi trng OpenGL c thit lp trong mi chng trnh duy tr mt trng thi ring bit.V d, khi thit lp mu v vi li gi glColor(), th mu ny s c tc dng cho n khi glColor() uc gi mt ln na thay i n. T tng ny rt quen thuc trong lp trnh trong Windows ,v ng cnh dng c lm vic tng t. Khi la chn 1 bt v, th mi ng thng s c b rng v mu ca bt v c chn. Tc dng ca bt s c duy tr cho n khi n c thay th.

    Bng 5.2 : Cc hu t lnh OpenGL Hu t Kiu d liu ca i s B Glbyte B GLdouble hay Glclampd F GLfloat hay Glclampf I GLint hay Glsizei S Glshort Ub GLubyte hay Glboonlean Ui GLuint, GLenum hay Glbitfield Us Glushort Bv GLbyte dng vector Dv GLdouble hay GLclampd dng vector Fv GLfloat hay GLclampf dng vector Iv GLint hay GLsizei dng vector Sv GLshort dng vector ubv GLubyte hay GLboolean dng vector uiv GLuint, GLenum hay Glbitfield dng vector usv GLushort dng vector

  • Cc thuc tnh khc nhau ca trng thi OpenGL c cha trong bin trng thi. d dng c tc dng 1 cch nhanh chng, mi bin trng thi c mt gi tr mc nh. Cc gi tr ny tn ti cho n khi cc hm tng ng c gi thay th thuc tnh. V d mu xa (bin trng thi tham chiu bi hng GL_COLOR_CLEAR_VALUE ) c gi tr mc nh l mu en, hay mu v (bin trng thi tham chiu bi hng GL_CURRENT_COLOR) c gi tr mc nh l mu trng , c gn 200 bin trng thi trong OpenGL. 5.3.Xt Mt Chng Trnh OpenGL Ti Thiu:

    Xt on m s dng cc hm OpenGL th hin 1 on thng en trng trn nn en

    void DrawWithOpenGL() { glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT); glColor(1.0f, 1.0f, 1.0f); glBegin(GL_LINE) glVertex2f(0.25f, 0.25f); glVertex2f(0.75f, 0.25f); glEnd(); glFlush(); }

    By gi ta xem xt k hn tng dng ca DrawWithOpenGL() 5.3.1.t mu xa: dng u tin, DrawWithOpenGL() gi hm glClearColor(), thit lp mu

    nn ch RGBA. Bn i s ca hm ny l cc gi tr c kiu d liu GLclampf, biu din cc thnh phn mu: , xanh l, xanh dng v alpha RGBA(red, green, blue, alpha) l ch mu kt hp h thng RGB vi alpha (l thnh phn dng iu khin vic trn mu) RGB(red, green, blue) l ch pha trn hay phng php th hin mu trn phng tin dng ngun sng nh mng hnh mu. RGB pha trn theo t l phn trm cc mu c bn l , xanh l v xanh dng to nn cc mu khc. H iu hnh windows nh ngha cc t l ny bng gi tr 8 bit, gi l gi tr RGB. Gi tr RGB(0,0,0), tc khng phn trm (cng thp nht) ca c 3 mu c bn, cho ra mu en. Gi tr RGB(255,255,255), tc 100 phn trm (cng cao nht) ca c 3 mu c bn, cho ra mu trng. Gi tr alpha =1 tng ng m c hon ton, gi tr alpha = 0 tng ng tnh trong sut hon ton OpenGL cn ch mu ch mc, l ch mu m mi mu c ch nh bi 1 ch s trong bng mu.

    5.3.2.Xa b m mu: Dng th hai trong DrawWithOpenGL() xa b m mu v mu xa hin hnh.

    Hm glClear() hiu i s ca n nh mt chui cc c bit cho bit b m no cn xa

    famvandaoRectangle

  • (hm khng tr v gi tr). B m mu (c biu th bi c GL_COLOR_BUFFER_BIT ) l vng b nh cha nh thc c th hin trn mn hnh. OpenGL s dng cc loi b nh khc, bao gm b m chiu su v b m stencil, gip n x l nh.

    5.3.3.t Mu V Hin Hnh: Li gi glColor3f() thit lp mu v hin hnh. Ba i s ca n (c cho bit bi

    hu t 3f) l cc gi tri GLfloat xc nh cc thnh phn mu : , xanh l, xanh dng. C 32 phin bn ca hm glColor().

    Sau khi t mu v, mi i tng c to bi cc li gi hm OpenGL s c v bng mu v chn. Nh bit, mu ny s duy tr tc dng cho n khi no b thay i bi li gi glColor() khc.

    C th tc ng mt cch su sc n mu ca cc i tng trn mn hnh nh vo cc thao tc ha nh chiu sng, to bng, lm m v pha trn.

    Tn h thng 256 mu, mu c chn c th khng th hin trn mn hnh nh mong mun. l v bng mu tiu chun ca Windows ch gm 20 mu, gy kh khn cho OpenGL trong vic th hin. K thut chiu sng (lighting) s ci thin vic kim sot mu ca OpenGL trn my 256 mu, bng cch to bng mu logic.

    5.3.4.nh Ngha Mt Hnh : Trc khi ra lnh cho OpenGL v mt hnh, ta phi cho OpenGL bit hnh ra sao.

    iu ny c thc hin bng cch nh ngha cc vertex i din cho i tng, tng t nh cc chng ha 2 chiu v ha 3 chiu. im khc bit l khng dng cc kiu d liu t nh ngha nh Vertex v Model. Thay vo , ta s dng cc lnh OpenGL glBegin(), glVertex(), glEnd().

    Trong DrawWithOpenGL(), glBegine(GL_LINES) bt u vi nh ngha mt hnh. Trong trng hp ny, hnh l ng thng, c biu th bng c GL_LINES. Cc c khc c th s dng v glBegin l GL_POINTS, GL_LINE_STRIP, GL_LOOP, GL_TRIANGLES, GL_TRIANGLES_STRIP, GL_TRIANGLES_FAN, GL_QUADS, GL_QUADS_STRIP, v GL_POLYGONS

    Do mt ng thng c 2 vertex, sau khi gi glBegin(), DrawWithOpenGL() gi hm glVertex2f() hai ln. Hm glVertex2f(), nh ngha mt vertex, dng cc gi tr i s kiu GLfloat m t ta X v Y ca vertex (Hm glVertex() c 24 phin bn)

    Ti sao 1 th vin 3-D nh OpenGL li nh ngha 1 i tng ch vi ta X v Y. Cn cc gi tr Z v W th sao. Thc ra, mc d glVertex2f() ch xc nh 2 gi tr X,Y ca vertex, nhng vn c gi tr z v x lin kt vi vertex. Chng mang cc gi tr mc nh 0.0 cho z, v1.0 cho w.

    Hnh cng phc tp cng dng nhiu li glVertex() nh ngha, c khi l mt danh sch di gia cp li gi glBegin(), glEnd(). V d, nh ngha 4 ng thng to nn hnh ch nht, cc li gi nh sau :

    glBegin(GL_LINES)

  • glVertex2f(-0.5f,-0.5f); glVertex2f(0.5f,-0.5f); glVertex2f(0.5f,-0.5f); glVertex2f(0.5f,0.5f); glVertex2f(0.5f,0.5f); glVertex2f(-0.5f,0.5f); glVertex2f(-0.5f,0.5f); glVertex2f(-0.5f,-0.5f); glEnd();

    Gi tr ca cc vertex trn da trn cc ta Decart mc nh thit lp trong

    OpenGL. Cc ta mc nh ny to nn mt khi vung 2x2x2, vi gc ta (0,0) ti tm khi vung. V vy, on m trn v mt hnh ch nht tm ca s, nh hnh 5.1 .

    Hnh 5.1: Hnh ch nht v bng OpenGL

    Hm glVertex() khng i s, lun lun kt thc danh sch glVertex(). Hm glVertex() ch l 1 trong 12 hm c th dng gia cp glBegin() v glEnd(). Cc hm l : glVertex(), glCallist(), glCallists(), glColor(), glEdgeFlag(), glEvalCoord(), glIndex(), glMaterial(), glNormal(), glTextCoord(),

    5.3.5.Bo m Cc Thao Tc V Hon Tt: Cho n y, chng trnh thit lp mu xa , xa nn, thit lp mu v, v nh

    ngha ng thng. Mc d lc ny, nh cui cng c l xut hin trn mng hnh, thng thng thao tc v c kt thc vi li gi glFlush(). Hm ny bo m rng mi lnh OpenGL ghi trong b m c thc hin (glFlush() khng c i s) Mt hm tng t l glFinish(),thc hin cng mt nhim v nh glFlush(), nhng tr v ch khi cc thao tc v hon tt. 5.4.nh Ngha V V im:

    Hm glBegin() khi u nh ngha mt hnh, i s n ca n l kiu hnh sp to. Cc hnh c i din bi cc hng GL_POINTS, GL_LINE_STRIP, GL_LOOP, GL_TRIANGLES, GL_TRIANGLES_STRIP, GL_TRIANGLES_FAN, GL_QUADS, GL_QUADS_STRIP, v GL_POLYGONS.

    famvandaoHighlight

    famvandaoUnderline

  • Nhiu hnh c v nh tn gi ca chng. V d, hnh to bi glBegin(GL_POINTS) l mt im trn mn hnh. Mt chui cc im c nh ngha nh sau:

    glBegin(GL_POINTS); glVertex2f(0.0f,0.0f); glVertex2f(0.75f,0.75f); glVertex2f(-0.75f,-0.75f); glVertex2f(-0.75f,0.75f); glVertex2f(0.75f,-0.75f); glEnd();

    y, mi nm glVertex() nh ngha mt im n. Ch rng on m trn nh ngha cc im trn mt phng Decart 2D, ch vi hai ta X,Y. Nhng nh bit , OpenGL t ng thit lp gi tr mt nh 0 v 1 cho cc bin tng ng z v w. Nu nh ngha cc im trong ta 3D, on m nh sau:

    glBegin(GL_POINTS); glVertex3f(0.0f,0.0f,0.0f); glVertex3f(0.75f,0.75f,1.0f); glVertex3f(-0.75f,-0.75f,1.0f); glVertex3f(-0.75f,0.75f,-1.0f); glVertex3f(0.75f,-0.75f,-1.0f);

    glEnd(); Trong on m ny, phin bn 3f ca glVertex() c dng nh ngha cc ta

    3-D X,Y,Z Vi mn hnh c phn gii cao hin nay, th s kh nhn ra mt im n trn

    mn hnh. Tht may, OpenGL c lnh glPointSize(), cho php v im vi bt k kch thc no. V d v 1 im vi kch thc l 4 pixel

    glPointSize(4f); i s n ca hm l gi tr GLfloat cho bit ng knh yu cu ca

    im. xc nh mt dy kch thc im (c h tr bi OpenGL), glGetFloatv() c dng nh sau

    glFloat ps[2]; glGetFloatv(GL_POINT_SIZE_RANGE,ps);

    Vi ps l 2 mng thnh phn c gi tr GLFloat cha kch thc im nh nht v im ln nht. Li gi glGetFloatv() i hi cc i s gm mt hng s cho bit gi tr cn t c v a ch mng glFloat cha cc gi tr . C gn 150 hng s c th dng vi cc dng khc nhau ca hm glGet().

    Cng c th t c kch thc im hin hnh vi cch tng t. glFloat ps; glGetFloatv(GL_POINT_SIZE_RANGE,&ps);

    Trong trng hp ny, ps l bin kiu glFloat cha kch thc im hin hnh. a ch bin ny c cho bi i s th hai trong hm glGetFloat().

    on m sau v cc im nh trn hnh 5.2: glClearColor(1.0f, 1.0f, 1.0f, 1.0f);

  • glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0f, 0.0f, 0.0f); glFloat ps[2];

    glGetFloatv(GL_POINT_SIZE_RANGE,ps); glPointSize(ps[1]); glBegin(GL_POINTS); glVertex2f(0.0f,0.0f); glVertex2f(0.75f,0.75f); glVertex2f(-0.75f,-0.75f); glVertex2f(-0.75f,0.75f); glVertex2f(0.75f,-0.75f); glEnd(); glFlush()

    Hnh 5.2: V cc im vi OpenGL.

    Ch rng mc d c th thit lp

    ng kch ca im, trn thc t kch thc im nh b nh hng bi antialiasing, l thao tc ha lm gim hoc loi tr hin tng bc thang ca ng thng trn mn hnh. iu ny cng ng cho cc hnh khc.

    5.5.nh Ngha V V ng: Mt ng c xc nh bi hai vertex xc nh im u v im cui ng

    glBegin(GL_LINES) glVertex2f(0.0f,0.0f); glVertex2f(1.0f,0.0f); glEnd();

    V c th nh ngha cng lc nhiu ng glBegin(GL_LINES)

    glVertex2f(0.0f,0.0f); glVertex2f(1.0f,0.0f);

    glVertex2f(0.0f,0.0f); glVertex2f(0.0f,1.0f);

    glEnd(); xc nh kch thc ng,ta dng hm glLineWidth() :

    glLineWidth(4.0f);

  • i s n ca hm ny l gi tr GLfloat cho bit b rng ca ng. xc nh di b rng ng (c h tr bi OpenGL), ta dng hm glGetFloatv()

    GLfloat lw[2]; glGetFloatv(GL_POINT_SIZE_RANGE,lw);

    Vi lw l mng hai thnh phn cc gi tr GLfloat cha b rng ng nh nht v ln nht. Cng c th dng glGetFloat() ly b rng hin hnh:

    GLfloat lw; glGetFloatv(GL_LIINE_WIDTH,&lw);

    V lw l bin kiu GLfloat cha b rng hin hnh ca ng. a ch bin ny c cho nh l i s th 2 trong hm glGetFloatv()

    on m sau th hin hnh hnh 5.3 glClearColor(1.0f, 1.0f, 1.0f, 1.0f);

    glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0f, 0.0f, 0.0f); glFloat lw[2];

    glGetFloatv(GL_POINT_SIZE_RANGE,lw); glLineWidth(lw[1]);

    glBegin(GL_LINES); glVertex2f(-0.75f,-0.75f); glVertex2f(0.75f,0.75f); glVertex2f(-0.75f,0.25f); glVertex2f(0.75f,0.25f); glVertex2f(-0.75f,-0.25f); glVertex2f(0.75f,-0.25f); glVertex2f(-0.75f,-0.75f); glVertex2f(0.75f,-0.75f); glEnd(); glFlush();

    Hnh5.3: V cc ng vi OpenGL

  • 5.5.1.V ng Chm: OpenGL c th v ng chm, l ng to nn bi cc im hay nt gch. Bc

    u tin v ng chm l gi glLineStipple() xc nh kiu v bng chm. V lm iu , cn nh ngha mu chm,bng cch to mt gi tr nh phn, vi 1 tng ng vi chm, 0 tng ng vi khng chm V d mu chm 0000000011111111 cho kt qu l mt ng to nn bi khong trng v nt gch xem k. Hay mu chm 0000111100001111 to mt ng ca cc nt gch ngn.

    s dng mu chm lm i s trong li gi glLineStipple(), phi chuyn n sang gi tr thp lc phn. v d trn, cc gi tr tng ng l 0x00FF, v 0x0F0F. Li gi glLineStipple() nh sau .

    glLineStipple(1,0x0F0F) Hai i s ca hm gm 1 gi tr GLint biu th h s lp mu (s ln lp cc im

    trong mu chm ), v mt gi tr GLushort cha mu chm. V d, vi h s lp bng 2, mu chm l 01010101, th ng chm c v l0011001100110011. C th hiu h s lp nh t l co gin theo phng ngang ca ng. Sau khi thip lp mu chm, glEnable() c gi cho php vic v bng chm:

    glEnable(GL_LINE_STIPPLE); Hm glEnable() c i s n ca l kh nng ca OpenGL m ta mun s dng.

    V d, hng GL_LINE_STIPPLE bt u kh nng v bng chm, GL_LIGHTING bt u kh nng chiu sng. C gn 50 hng s dng dvi cc hm glEnable() v glDisable().

    on m sau th hin nh hnh 5.4: glClearColor(1.0f, 1.0f, 1.0f, 1.0f);

    glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0f, 0.0f, 0.0f); glFloat lw[2];

    glGetFloatv(GL_POINT_SIZE_RANGE,lw); glLineWidth(lw[1]); glLineStipple(1,0x4444) glEnable(GL_LINE_STIPPLE); glBegin(GL_LINES);

    glVertex2f(-0.75f,-0.75f); glVertex2f(0.75f,0.75f); glVertex2f(-0.75f,0.25f); glVertex2f(0.75f,0.25f); glVertex2f(-0.75f,-0.25f); glVertex2f(0.75f,-0.25f); glVertex2f(-0.75f,-0.75f); glVertex2f(0.75f,-0.75f);

    glEnd(); glFlush();

  • Hnh5.4: V cc ng chm vi OpenGL 5.5.2.V Di ng: Di ng l mt lot ng ni vi nhau. Khi nh ngha di ng, cp vertex

    u tin nh ngha ng u tin, mi vertex sau nh ngha im k tip m OpenGL s v n. Tng t lnh MoveTo() vi 1 on lnh LineTo() theo sau. Trong trng hp ny, hng GL_LINE_STRIP lm i s cho hm glBegin().

    on m sau th hin nh hnh 5.5: glClearColor(1.0f, 1.0f, 1.0f, 1.0f);

    glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0f, 0.0f, 0.0f);

    glFloat lw[2]; glGetFloatv(GL_POINT_SIZE_RANGE,lw); glLineWidth(lw[1]/2); glLineStipple(1,0x4444) glBegin(GL_LINE_STRIPPLE);

    glVertex2f(-1.00f,0.75f); glVertex2f(1.00f,0.75f); glVertex2f(-1.00f,0.25f); glVertex2f(1.00f,0.25f); glVertex2f(-1.00f,-0.25f); glVertex2f(1,00f,-0.25f); glVertex2f(-1.00f,-0.75f); glVertex2f(1.00f,-0.75f);

    glEnd(); glFlush();

    Hnh5.5: V di ng vi OpenGL

  • 5.5.3.V ng Khp Kn: Tng t nh di ng, ng khp kn l 1 lot cc ng ni vi nhau, nhng

    vertex cui cng ni vi ng u tin. Khi nh ngha ng khp kn, hng GL_LINES_LOOP lm i s cho hm glBegin().

    on m sau th th hin nh hnh 5.6 : glClearColor(1.0f, 1.0f, 1.0f, 1.0f);

    glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0f, 0.0f, 0.0f); glFloat lw[2];

    glGetFloatv(GL_POINT_SIZE_RANGE,lw); glLineWidth(lw[1]/2); glBegin(GL_LINE_LOOP);

    glVertex2f(-1.00f,0.75f); glVertex2f(1.00f,0.75f); glVertex2f(-1.00f,0.25f); glVertex2f(1.00f,0.25f); glVertex2f(-1.00f,-0.25f); glVertex2f(1,00f,-0.25f); glVertex2f(-1.00f,-0.75f); glVertex2f(1.00f,-0.75f);

    glEnd(); glFlush();

    Hnh5.6: V ng kp kn Vi OpenGL.

    5.6.nh Ngha V V Cc a Gic: a gic l hnh c to bi cc ng ni (cnh) gia mt tp hp cc vertex.

    Mt a gic c t nht 3 cnh. Nh vy, a gic n gin nht l tam gic. OpenGL c th v a gic nh cc im, cc ng ngoi, hay i tng c bit. OpenGL cn c th in y cc a gic vi mu c nh ngha. Thm vo , mt a gic OpenGL c hai mt trc v sau c th v theo hai cch ring, v c th quay 1 a gic xem mt bn kia. Hm glPolygonMode() c dng v a gic:

    glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); Hai i s ca hm ny l l cc gi tri GLenum. i s u tin c th l hng

    GL_FRONT, GL_BACK, hay GL_FRONT_AND_BACK, cho bit mt aa gic m ta mun thit lp ch v l mt trc hay mt sau, hay c hai mt. i s th 2 cho bit ch v cho mt a gic chn. Cc ch v c th l GL_POINT (v im ti cc vertex ca a gic ), GL_LINE (v a gic vi cc cnh a gic khung li), GL_FILL (a gic c)

  • cho OpenGL bit mt no ca a gic l trc , v mt no l sau, ta dng th t khi nh ngha cc vertex to nn a gic. Mt a gic c xem l i-din-mt-trc, khi cc vertex ca n c nh ngha ngc chiu kim ng h. Tuy nhin c th thay i quan nim ca OpenGL bng cch gi glFontFace():

    glFontFace(GL_CW); Li gi ny cho OpenGL bit a gic i-din-mt-trc chn nh ngha theo

    chiu no. i s n ca hng l GL_CW khi chn chiu kim ng h, v GL_CCW khi chn chiu ngc chiu kim ng h(mc nh)

    nh ngha mt a gic cng d nh nh ngha 1 ng . Ch cn t nht 3 vertex, v phi nh ngha cc vertex ng chiu,(theo gi tr hin hnh c bin trng thi GL_FRONT_FACE). on m sau nh ngha mt hnh vung i-din-mt-trc:

    glBegin(GL_POLYGON); glVertex2f(-0.5f,0.5f); glVertex2f(-0.5f,-0.5f); glVertex2f(0.5f,-0.5f); glVertex2f(0.5f,0.5f); glEND();

    Trong an m trn, hng s GL_POLYGON c dng vi glBegin() nh ngha a gic. Sau , nh ngha cc vertex ca a gic theo chiu ngc chiu kim ng h (theo mc nh). Cui cng, nh thng l, kt thc vic nh ngha bng li gi glEND(). on m sau th hin nh hnh 5.7: glClearColor(1.0f, 1.0f, 1.0f, 1.0f);

    glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0f, 0.0f, 0.0f);

    glPolygonMode(GL_FRONT,GL_LINE); glPolygonMode(GL_BACK,GL_FILL); glFontFace(GL_CCW); glBegin(GL_POLYGON);

    glVertex2f(-0.5f,0.5f); glVertex2f(-0.5f,-0.5f);

    glVertex2f(0.5f,-0.5f); glVertex2f(0.5f,0.5f); glEnd(); glFlush();

    Hnh 5.7: V a gic vi OpenGL.

  • Trong on m trn, hai li gi glPolygonMode() yu cu mt trc a gic v

    theo ch khung li, mt sau theo ch a gic c.

    Hnh 5.8: V a gic i din mt sau.

    V a gic l i-din-mt-trc, nn ch mt

    trc c th hin. Nu thay i glFontFace(GL_CCW) bng glFontFace(GL_CW), bo cho OpenGL rng a gic l i-din-mt-sau, chng trnh s th hin nh hnh 5.8

    5.6.1.V a Gic Bng Chm: Ging nh khi v ng vi ng mu chm do ngi dng nh ngha, ta c th

    v a gic c in y vi 1 mu no , bc u tin thc hin l nh dng mu. Mu l bitmap 32x32, trong mi gi tr 1 th hin ra 1 im trn mn hnh,

    V d hnh 5.9 l 1 du chm dng a gic OpenGL . Mu c xy dng trong h thng ng k 32x32. Mi vung c in y trong mu th hin o mt bit c gi tr 1.

    Mu cn c chuyn i sang cc gi tr thp lc phn (mng gi tr GLubyte) c th dng trong chng trnh. Vic chuyn i ny bt u vi byte gc tri h thng ng k , ri dn theo hng phi v i ln. D liu ca mu hnh 5.9 nh sau:

    GLubyte pattern[]= {

    0xff,0x00,0xff,0x00, 0x0f,0xf0,0x0f,0xf0, 0x00,0xff,0x00,0xff, 0x0f,0xf0,0x0f,0xf0, 0xff,0x00,0xff,0x00, 0x0f,0xf0,0x0f,0xf0, 0x00,0xff,0x00,0xff, 0x0f,0xf0,0x0f,0xf0, 0xff,0x00,0xff,0x00, 0x0f,0xf0,0x0f,0xf0, 0x00,0xff,0x00,0xff, 0x0f,0xf0,0x0f,0xf0, 0xff,0x00,0xff,0x00, 0x0f,0xf0,0x0f,0xf0, 0x00,0xff,0x00,0xff, 0x0f,0xf0,0x0f,0xf0, 0xff,0x00,0xff,0x00,

  • 0x0f,0xf0,0x0f,0xf0, 0x00,0xff,0x00,0xff, 0x0f,0xf0,0x0f,0xf0, 0xff,0x00,0xff,0x00, 0x0f,0xf0,0x0f,0xf0, 0x00,0xff,0x00,0xff, 0x0f,0xf0,0x0f,0xf0, 0xff,0x00,0xff,0x00, 0x0f,0xf0,0x0f,0xf0, 0x00,0xff,0x00,0xff, 0x0f,0xf0,0x0f,0xf0, 0xff,0x00,0xff,0x00, 0x0f,0xf0,0x0f,0xf0, 0x00,0xff,0x00,0xff, 0x0f,0xf0,0x0f,0xf0,

    } Ch rng c 32 dng d liu trong mng trn. Mi dng d liu l mt dng trn

    mu hnh 5.9. Dng u tin trn trong mng l dng cui cng ca mu chm, v dng d liu cui cng l dng d liu u tin ca mu chm.

    Hm glPolygonStipple() c gi chuyn mu chm cho OpenGL: glPolygonStipple(pattern);

    i s ca hm l a ch d liu nh ngha mu chm. Vic tip theo l gi glEnable() cho php vic v bng chm:

    glEnable(GL_POLYGON_STIPPLE); Sau li gi ny mi a gic c trng c v in y bi mu chn. tr li

    vic v a gic thng thng, ta dng hm glDisable() : glDisable(GL_POLYGON_STIPPLE);

    on m sau th hin hnh 5.10 GLubyte pattern[]= {

    0xff,0x00,0xff,0x00, 0x0f,0xf0,0x0f,0xf0, 0x00,0xff,0x00,0xff, 0x0f,0xf0,0x0f,0xf0, 0xff,0x00,0xff,0x00, 0x0f,0xf0,0x0f,0xf0, 0x00,0xff,0x00,0xff, 0x0f,0xf0,0x0f,0xf0, 0xff,0x00,0xff,0x00, 0x0f,0xf0,0x0f,0xf0, 0x00,0xff,0x00,0xff, 0x0f,0xf0,0x0f,0xf0, 0xff,0x00,0xff,0x00, 0x0f,0xf0,0x0f,0xf0, 0x00,0xff,0x00,0xff, 0x0f,0xf0,0x0f,0xf0, 0xff,0x00,0xff,0x00, 0x0f,0xf0,0x0f,0xf0, 0x00,0xff,0x00,0xff, 0x0f,0xf0,0x0f,0xf0, 0xff,0x00,0xff,0x00, 0x0f,0xf0,0x0f,0xf0, 0x00,0xff,0x00,0xff, 0x0f,0xf0,0x0f,0xf0, 0xff,0x00,0xff,0x00, 0x0f,0xf0,0x0f,0xf0,

  • 0x00,0xff,0x00,0xff, 0x0f,0xf0,0x0f,0xf0, 0xff,0x00,0xff,0x00, 0x0f,0xf0,0x0f,0xf0, 0x00,0xff,0x00,0xff, 0x0f,0xf0,0x0f,0xf0,

    }; glClearColor(1.0f, 1.0f, 1.0f, 1.0f);

    glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0f, 0.0f, 0.0f);

    glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); glPolygonStipple(pattern); glEnable(GL_POLYGON_STIPPLE); glBegin(GL_POLYGON);

    glVertex2f(-0.5f,0.5f); glVertex2f(-0.5f,-0.5f);

    glVertex2f(0.5f,-0.5f); glVertex2f(0.5f,0.5f); glEND();

    glDisable(GL_POLYGON_STIPPLE); Hnh5.10: a gic chm v hnh ch nht mt cch hiu qu, OpenGL dng hm glRect(). Hm ny c tm phin bn.

    5.6.2.V a Gic Khung Li Li: OpenGL c 2 s hn ch trong vic v a gic: (hnh 5.11) - a gic khng c c cc cnh cho nhau. - a gic li, tc khng cha cc vng lm hay l bn trong Tuy vy, cc hn ch ny khng gy tr ngi no, bi v c th to hnh dng bt

    k t 2 hay nhiu a gic li. Vn l ch khi no to 1 a gic khng li dng khung li bng cch nh vy th hnh s cha nhng ng khng mong mun bn trong.

    kh chng, ta dng hm glEdgeFlag(). Khi gi glEdgeFlag(FALSE) trc khi nh ngha vertex, OpenGL s khng v cnh ni vertex vi vertex c nh ngha tip theo. Li gi glEdgeFlag(TRUE) s tr li vic v cnh bnh thng.

    Hnh 5.11 a gic li v khng li

  • a gic li a gic khng li

    Hnh 5.12 :To 1 a gic li t 2 a gic khng li Hnh 5.13 l a gic khng li ch L to bi ba hnh ch nht. on m sau to hnh tng t nhng khng cha cc hnh bn trong (Hnh 5.14).

    glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0f, 0.0f, 0.0f);

    glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); glBegin(GL_POLYGON);

    glEdgeFlag(TRUE); glVertex2f(-0.2f,0.3f);

    glEdgeFlag(FALSE); glVertex2f(-0.2f,-0.1f); glEdgeFlag(TRUE);

    glVertex2f(0.0f,-0.1f); glVertex2f(0.0f,0.3f);

    Hnh 5.13: To hnh ch L

    glEnd(); vi 3 hnh ch nht khung li glBegin(GL_POLYGON);

    glEdgeFlag(TRUE); glVertex2f(-0.2f,-0.1f); glVertex2f(-0.2f,-0.4f); glEdgeFlag(FALSE); glVertex2f(0.0f,-0.4f); glVertex2f(0.0f,-0.1f);

    glEnd(); glBegin(GL_POLYGON);

    glEdgeFlag(FALSE); glVertex2f(0.0f,-0.1f); glEdgeFlag(TRUE);

    glVertex2f(0.0f,-0.4f); glVertex2f(0.3f,-0.4f);

  • glVertex2f(0.3f,-0.1f); glEnd(); glFlush();

    Hnh 5.14 : V hnh ch L khng cha cc ng bn trong

    5.6.3.V tam gic: OpenGL h tr vic v nhiu a gic t bit, tam gic l 1 trong s , Vic nh

    ngha tam gic khng khc cc a gic khc, ngoi tr vic s dng i s GL_TRIANGLES cho hm glBegin(). Trong on m sau th hin tam gic nh hnh 5.15 :

    glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT);

    glColor3f(0.0f, 0.0f, 0.0f); glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); glBegin(GL_TRIANGLES);

    glVertex2f(-0.5f,0.3f); glVertex2f(-0.5f,-0.5f);

    glVertex2f(0.5f,-0.5f); glVertex2f(-0.5f,0.8f);

    glVertex2f(-0.5f,0.5f); glVertex2f(0.5f,0.5f);

    glEnd(); glFlush();

    Hnh 5.15: Tam Gic OpenGL

    5.6.4.V Di Tam Gic: Di tam gic l chui tam gic ni nhau, mi tam gic c chung mt cnh vi tam

    gic v trc n. Ngha l sau khi nh ngha 3 vertex cho tam gic u tin, th ch cn nh ngha mt vertex cho mi tam gic tip theo trong dy tam gic.

  • Th t nh ngha cc vertex ca 1 di tam gic l quan trng. Tam gic u tin ca di c cc vertex nh ngha nh hnh 5.16. Cnh dng chung vi tam gic th hai trong di c xc nh bi cc vertex 3 v 2 theo th t. Ngha l tam gic th 2 trong di l c xc nh bi cc vertex 3,2 v 4 (hnh 5.17). Tip theo, vertex 3 v 4 xc nh cnh dng chung ca tam gic th 2 v 3 trng hp minh ha ny, cc tam gic l i-din-mt-trc, nn vertex ca chng c nh ngha ngc chiu kim ng h.

    Bng tng kt th t cc vertex trong di tam gic: S th t tam gic Cnh 1 Cnh 2 Cnh 3 1 Vertex1 Vertex2 Vertex3 2 Vertex3 Vertex2 Vertex4 3 Vertex2 Vertex4 Vertex5 4 Vertex5 Vertex4 Vertex6 5 Vertex5 Vertex6 Vertex7 6 Vertex7 Vertex6 Vertex8 7 Vertex7 Vertex8 Vertex9

    Hnh 5.16 : Cc vertex Vertex1 ca tam gic u tin Vertex2 trong di tam gic

    Vertex3 Hnh 5.17 : Thm tam gic th hai vo di tam gic

    Hnh 5.18: Thm tam gic th 3 vo di tam gic

    glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT);

    glColor3f(0.0f, 0.0f, 0.0f); glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); glBegin(GL_TRIANGLE_TRIP);

    glVertex2f(-0.75f,0.25f); glVertex2f(-0.75f,-0.25f);

    glVertex2f(-0.25f,0.25f); glVertex2f(0.0f,-0.25f);

    glVertex2f(0.25f,0.5f);

  • glVertex2f(0.5f,0.3f); glVertex2f(0.75f,0.3f);

    glEnd(); glFlush();

    Hnh 5.19 : Di tam gic

    5.6.5.V qut tam gic: Qut tam gic, c th hin bi hng

    GL_TRIANGLE_FAN, l chui cc tam gic c chung 1 vertex. Vic nh ngha qut tam gic tng t nh vic nh ngha di tam gic. u tin, nh ngha 3 vertex cho tam gic th 1 trong qut. V cc tam gic k tip c 1 cnh dng chung vi tam gic trc, nn ch cn nh ngha thm 1 vertex. Hnh 5.20 cho thy th t nh ngha vertex ca 1 qut.

    Bng tng kt th t cc vertex trong qut tam gic: S th t tam gic Cnh 1 Cnh 2 Cnh 3 1 Vertex1 Vertex2 Vertex3 2 Vertex1 Vertex3 Vertex4 3 Vertex1 Vertex4 Vertex5 4 Vertex1 Vertex5 Vertex6 5 Vertex1 Vertex6 Vertex7 6 Vertex1 Vertex7 Vertex8 7 Vertex1 Vertex8 Vertex9

    on m sau th hin nh hnh 5.21. glClearColor(1.0f, 1.0f, 1.0f, 1.0f);

    glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0f, 0.0f, 0.0f);

    glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); glBegin(GL_TRIANGLE_FAN)

    glVertex2f(-0.25f,0.25f); glVertex2f(-0.25f,-0.25f);

    glVertex2f(0.25f,0.25f);

    glVertex2f(0.25f,0.5f); glVertex2f(-0.05f,0.7f); glVertex2f(-0.45f,0.5f);

    Hnh 5.20 :Th t nh ngha cc

  • ca mt qut tam gic glEnd(); glFlush();

    Hnh 5.21 : Qut tam gic

    5.6.6.V T Gic: nh ngha t gic, hng

    GL_QUADS c s dng lm i s cho hm glBegin(). Mi t gic c nh ngha bng 4 vertex. V c th nh ngha nhiu t gic gia 1 cp lnh glBegin() v glEnd(). on m sau th hin hnh 5.22

    glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT);

    glColor3f(0.0f, 0.0f, 0.0f); glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); glBegin(GL_QUADS) ;

    glVertex2f(-0.75f,0.75f); glVertex2f(-0.75f,0.25f);

    glVertex2f(-0.25f,0.0f); glVertex2f(0.0f,0.5f);

    glVertex2f(-0.55f,-0.25f); glVertex2f(-0.75f,-0.45f); glVertex2f(-0.25f,-0.7f);

    glVertex2f(0.5f,-0.25f); glVertex2f(0.5f,0.75f); glVertex2f(0.25f,0.1f); glVertex2f(0.75f,0.2f); glVertex2f(0.8f,0.65f);

    glEnd(); glFlush();

    Hnh 5.22 : v t gic

  • 5.6.7.V Di T Gic: Di t gic l chui cc t gic, trong mi cp t gic c chung vi nhau 2

    verrtex. nh ngha di t gic, ta dng GL_QUAD-STRIP vi hm glBegin(). Sau nh ngha 4 vertex cho t gic u tin ca di, vi mi t gic tip theo, ta nh ngha thm 2 vertex. Th t nh ngha vertex l rt quan trng. Hnh 5.23 cho thy th t nh ngha vertex ca 1 di t gic.

    Bng tng kt th t cc vertex trong di tam gic: S th t tam gic Cnh 1 Cnh 2 Cnh 3 Cnh 3 1 Vertex1 Vertex2 Vertex3 Vertex4 2 Vertex3 Vertex4 Vertex5 Vertex6 3 Vertex5 Vertex6 Vertex7 Vertex8 4 Vertex7 Vertex8 Vertex9 Vertex10 5 Vertex9 Vertex10 Vertex11 Vertex12 6 Vertex11 Vertex12 Vertex13 Vertex16 7 Vertex13 Vertex14 Vertex15 Vertex18

    on m sau th hin nh hnh 5.24 glClearColor(1.0f, 1.0f, 1.0f, 1.0f);

    glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0f, 0.0f, 0.0f);

    glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); glBegin(GL_QUAD_STRIP) ;

    glVertex2f(-0.75f,0.25f); glVertex2f(-0.65f,0.75f);

    glVertex2f(-0.55f,0.1f); glVertex2f(-0.25f,0.6f);

    Vertex2 Vertex4 Vertex6 Vertex8 glVertex2f(-0.15f,-0.2f);

    glVertex2f(0.0f,-0.45f);

    glVertex2f(0.25f,-0.7f); glVertex2f(0.5f,0.65f);

    Vertex1 Vertex3 Vertex5 Vertex7

    glVertex2f(0.75f,-0.3f); glVertex2f(0.85f,0.45f); glEnd(); glFlush();

  • Hnh 5.24 Di t gic

    5.7. Tng Kt :

    Mt s hm OpenGL c nhiu phin bn, ph thuc vo s lng v kiu d liu ca i s. Cc phin bn ny c phn bit bi hu t theo sau tn hm c bn.

    Cc hm OpenGL thng thay i gi tr ca bin trng thi OpenGl. Cc bin trng thi ny (v d mu v hin hnh) c hiu lc cho n khi b thay th. iu ny tng t cch Windows qun l DC.

    Mt chng trnh OpenGL n gin thng bt u bng vic thit lp mu xa v mu v, ri xa b m mu c vng trng dng v. Sau , nh ngha cc vertex ca hnh gia 1 cp hm glBegin() v glEnd(). i s n ca glBegin() quyt nh kiu hnh ang c nh ngha cc vertex.

    OpenGL c th v cc hnh nh im, ng, a gic, v tam gic. Thm vo , c th phi hp cc hnh ny vo di a gic, qut tam gic, ngg khp kn.v cc kiu hnh khc phc tp hn. Mc d OpenGL khng th qun l cc a gic khng li, vn c th to cc a gic ny bng cch rp nhiu a gic li li vi nhau.

  • Chng 6: Cc Php Bin Hnh OpenGL 6.1.Xy Dng i Tng 3D T Cc a Gic:

    Vic xy dng i tng 3D t cc a gic tng t nh gn cc mu giy c hnh dng khc nhau(a gic) thnh cc vt th 3D.

    V d ta c 6 mu giy hnh vung 1 (hnh 6.1), v ta mun gn chng li vi nhau c mt khi vung 1. Cho rng ta c mt khi vung 2 c to thnh t cc hnh vung 2 thuc h thng li Decart 3D. Hnh vung ln ny th hin th gii m ta s t hp cc mu giy v to nn i tng. Khi vung bng giy c to nn bng cch t cc mu giy vo v tr sao cho gc h ta Decart(0,0,0) s nm ti tm khi vung giy. Tc to l tm ca hai khi vung(hnh 6.2). chnh l cch xy dng i tng 3D trong OpenGL. Ta s cung cp cho OpenGL mt danh sch cc vertex, th hin cc ta ca i tng . Danh sch ny khng ch bo cho OpenGL cch v a gic, m cn cho bit v tr a gic trong h thng li Decart 3D.

    Hnh 6.1 : Su hnh vung dng to 1 khi vung

    Y Axis Hnh 6.2: T hp khi Z Axis X Axis vung

    OpenGL mc nh h thng li 3D l khi vung 2, vi gc ta ti tm. Ngha l cc ta X,Y,v Z l dy t 1.0 n 1.0. Cc gi tr trn trc X tng t tri sang phi, Cc gi tr trn trc Y tng t di ln trn, Cc gi tr trn trc Z tng t sau ra trc.

    Nh vy, hnh thnh khi vung nh hnh 6.2, on m sau c s dng xc nh vertex cho cc a gic.

    glBegin(GL_POLYGON) ;

    glVertex3f(-0.5f, 0.5f, 0.5f); glVertex3f(-0.5f, -0.5f, 0.5f);

    glVertex3f(0.5f, -0.5f, 0.5f); glVertex3f(0.5f, 0.5f, 0.5f);

    glEnd() glBegin(GL_POLYGON) ;

    glVertex3f(0.5f, 0.5f, 0.5f); glVertex3f(0.5f, -0.5f, 0.5f); glVertex3f(0.5f, -0.5f, -0.5f);

    glVertex3f(0.5f, 0.5f, -0.5f); glEnd()

    glBegin(GL_POLYGON) ;

  • glVertex3f(0.5f, 0.5f, -0.5f); glVertex3f(0.5f, -0.5f, -0.5f);

    glVertex3f(-0.5f, -0.5f, -0.5f); glVertex3f(-0.5f, 0.5f, -0.5f);

    glEnd() glBegin(GL_POLYGON) ;

    glVertex3f(-0.5f, 0.5f, -0.5f); glVertex3f(-0.5f, -0.5f, -0.5f);

    glVertex3f(-0.5f, -0.5f, 0.5f); glVertex3f(-0.5f, 0.5f, 0.5f);

    glEnd() glBegin(GL_POLYGON) ;

    glVertex3f(-0.5f, -0.5f, 0.5f); glVertex3f(-0.5f, -0.5f, -0.5f);

    glVertex3f(0.5f, -0.5f, -0.5f); glVertex3f(0.5f, -0.5f, 0.5f);

    glEnd() glBegin(GL_POLYGON) ;

    glVertex3f(-0.5f, 0.5f, -0.5f); glVertex3f(-0.5f, 0.5f, 0.5f);

    glVertex3f(0.5f, 0.5f, 0.5f); glVertex3f(0.5f, 0.5f, -0.5f);

    glEnd()

    on m trn trc ht nh ngha mt trc khi vung, k tip l cnh phi, pha sau, cnh tri, y, v cui cng l nh. Ch rng cc vertex c nh ngha theo cch mt trc cc a gic to nn bn ngoi khi vung, trong khi mt sau cc a gic pha trong khi vung. Ngha l, vertex ca cc a gic i-din-mt-trc (nh mt trc khi vung) c nh ngha theo chiu ngc chiu kim ng h, cn vertex ca a gic i-din-mt-sau (nh mt sau khi vung) c nh ngha theo chiu kim ng h.

    Vic nh ngha vertex cc a gic to nn i tng 3D i hi phi theo chiu thch hp. trng thi mc nh, cc vertex ca a gic i-din-mt-trc c nh ngha chiu ngc chiu kim ng h. Vic khng tun theo quy tc ny c th mang li cc kt qu khng mong mun. 6.2.Php Chiu:

    Nu a on m trn vo mt chng trnh OpenGl, kt qu nhn c s nh hnh 6.3. Do OpenGL s dng php chiu trc giao (php chiu song song) r th hin hnh khi cho.Vi php chiu ny, mt sau khi vung s khng nh hn, m l cng kch thc vi mt trc khi vung, do khng th thy c.