lam game 3 d bang opengl

Upload: ngotuannghia1

Post on 06-Apr-2018

242 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/2/2019 Lam Game 3 d Bang Opengl

    1/171

    KIL

    OBO

    OKS

    .COM

    MC LC

    Li m u

    PHN 1: TM HIU TH VIN HA OPENGL 1Chng 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 .......................... 283.4. Bin hnh i tng 3-D ................................................................ 31

    Chng 4: Chng trnh OpenGL ti thiu36

    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: ....................................................................................... 48Chng 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

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    2/171

    KIL

    OBO

    OKS

    .COM

    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 binh nh OpenGL 75

    6.1. Xy dng i tng 3-D t cc a gic .......................................... 756.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 1199.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

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    3/171

    KIL

    OBO

    OKS

    .COM

    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

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    4/171

    KIL

    OBO

    OKS

    .COM

    C cu rng mt hnh nh bng c nghn li ni . iu tht khng th phnhn. V r rng l nu hin th thng tin ch vi cc k hiu, ch ci, ch skhng thi th khng th hp dn v d hiu nh khi c thm biu din ha Kthut 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, pmt nh cc th hin ha. S h tr ca tin hc cho cc ngnh khc tr nn clc hn nh kh nng ha vi tnh. V th gii thc th c biu din mt cchsinh 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 phttrin 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 thvin ha c to sn. Cc th vin ny cho php gim nh thi gian v cngsc ca ngi lp trnh; Bi vi chng, c c mt tc phm ha khngi hi phi c mt kin thc hng hu v ng cong Bezier, B-spline, v hnhhc, to bng, m ch ng dng cc hm to sn. Mt trong nhng th vin lOpenGL, 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 haba chiu, ng thi cng c gng a ra mt ng dng ca OpenGL trong vicminh ha cc gii thut ha ba chiu.

    Tuy nhin, ti khng th khng trnh khi nhng hn ch v thiu st, nn rtmong c s ch bo, gp ca qu Thy C v bn b.

    PHN 1:TM HIU TH VIN HA OPENGL

    Chng1:S Lc v OPENGL1.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 cngkhc 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 thchvi 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 KinTrc OpenGL(OpenGL Architecture Review Board AEB) gm cc thnh vin sng lp lSGI, Digittal Equipment Corporation, IBM ,Intel v Microsoft.ARB hp mi nm hai ln.

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    5/171

    KIL

    OBO

    OKS

    .COM

    (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 cngnghip cho ha ba chiu.

    Vi giao din lp tr nh mnh m, OpenGL cho php to cc ng dng 3-D phctp vi tinh vi, chnh xc cao, m ngi thit k khng phi nh vt vi cc ni cngthc ton hc v cc m ngun phc tp. V do OpenGL l tiu chun cng nghip, ccng 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 kimsot

    - M hnh hot ng ni v m h nh 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 (baogm 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 cccp khc, theo th t v cng mt phng php. Ngoi l duy nht l trong trng hpkh 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 trckhi 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 thhin hay hiu qu nht nh. Cc bcny l cc li gi n giao din lp trnh ngdng gm xp x 120 lnh v hm. Chng c dng v cc phn t ha c bnnh 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 trchnhim 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 cth l trn cng mt my tnh khc nhau. Theo ngha ny, OpenGL l network-transparent

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    6/171

    KIL

    OBO

    OKS

    .COM

    (tm dch l mng trong sut). Server duy tr nhiu ng cnh OpenGL, mi ng cnh lmt trng thi OpenGL. Client c th ni vi bt c ng cnh no. Giao thc mng cs dng c th l c lp ha da trn giao thc mng hin c (tc OpenGL dng trnmy c lp hay trn mi trng mng). Khng c lnh OpenGL no tip nhn vic nhpd 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 chophp.- 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 hthng ca s. S khi to OpenGL c tin hnh khi h thng cp pht ca s cho vicbiu din.

    Hnh 1.1M hnh hot

    ng c bnca OpenGL

    Lnh OpenGLPha 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 khckim sot cch qun l i tng qua cc giai on s l khc nhau.

    O enGL DLL

    Server DLL

    Video Driver

    Win DLL

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    7/171

    KIL

    OBO

    OKS

    .COM

    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 hnhhc 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 theoviewport 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 h nh dng hai chiu ca im, on thng hay a gic. Ccfragment 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 tcmask 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

    l ng

    Thao tc trn

    vertex v

    primitive

    Rasteri-

    zation

    Thao tc

    trn

    fragme

    B

    m

    khung

    B nh

    texture

    Cc thao tc

    pixel

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    8/171

    KIL

    OBO

    OKS

    .COM

    B ht nhn c 115 hm c bn. Tn cc hm ny bt u bng GL. WindowsNT h tr 4 chng loi hm khc, bao gm th vin OpenGL utility(tn hm bt u bngGLU), th vin OpenGL auxiliary(tn hm bt u bng AUX), b hmWGL (tn hmbt 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 h nh dng khc nhau, to cc hiu quchiu 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 dliu m chng tip nhn, nn trn thc t c hn 300 nguyn mu (prototype) cc hm cbn.

    Th vin OpenGL utility gm cc hm cao cp. Cc hm ny n gin ho vics dng hnh nh cu trc, thc hin vic bin i ta mc cao, h tr tesselation agic, 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 dlp trnh trong sch ch dn lp trnh OpenGL. Cc hm ph thuc platform ny thc hincc 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 trnhxy dng v chn la cc ng cnh biu din, to cc bitmap font, cc h m ny ch dngtrn Windows NT.

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

    Chng2: Ha Hai Chiu GDIOpenGL 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, chiutng 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.

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    9/171

    KIL

    OBO

    OKS

    .COM

    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 tohnh 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 phpchuyn i gia chng. Thut ng ha gi l mapping cc im trong ta ccsang ta mn hnh th hin i tng ng v tr.

    Hnh 2.1 Ta mn hnh Hnh 2.2 Ta cc

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    10/171

    KIL

    OBO

    OKS

    .COM

    Hnh 2.3 Tam gic trong ta cc Hnh 2.4 v tam gic khng c schuyn i gia ta cc vta mn hnh

    Nu b qua vn ga tr m, th vic th hin im (x1,y1) trong ta ccsang 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 cas, bng cch gi hm GetClientRect(). Hm ny in y cu trc RECT vi kch thcca 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

  • 8/2/2019 Lam Game 3 d Bang Opengl

    11/171

    KIL

    OBO

    OKS

    .COM

    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 nhaubng cc on thng. Khi tt c vertex c ni th hon thnh hnh dng.

    qun l cc kiu h nh 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 lngVERTEX*vertices; //vertex trong hnh v mt con tr

    }SHAPE; //tr n mng cu trcVi 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

  • 8/2/2019 Lam Game 3 d Bang Opengl

    12/171

    KIL

    OBO

    OKS

    .COM

    }

    Do DrawShape() c tng qut ha lm vic vi cu trc SHAPE, hmny c th v mi loi hnh phng.V d v mt hnh ch nht, th shape1 cnh 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.5VERTEX 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 mihng, hnh nh cn c thao tc theo nhiu cch khc nhau. Cc thao tc nh vygi 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 h nh 2.6 c tnh tin 3 n v theotrc 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 cnh ngha nh sau:

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

    Cng thc tnh tin mi vertex l :

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    13/171

    KIL

    OBO

    OKS

    .COM

    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

  • 8/2/2019 Lam Game 3 d Bang Opengl

    14/171

    KIL

    OBO

    OKS

    .COM

    Thay v cng hoc tr cc vertex vi mt gi tr nh khi tnh tin, co ginmt hnh l nhn cc vertex ca hnh vi mt h s co gin. Hnh 2.7 biu dinmt 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, mtim 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

  • 8/2/2019 Lam Game 3 d Bang Opengl

    15/171

    KIL

    OBO

    OKS

    .COM

    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 cogin, th h s co gin s nh hn 1. Ch rng c th dng h s co gin khcnhau 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 , vh s co gin trc y bng 2.

    Hnh 2.8: Co gin mt tam gic vi hai h sco 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 cngthc quay, m khng tm hiu ti sau, lm g..

    Hnh2.9 biu din vic quay 45 mt tam gic quanh gc ta .

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    16/171

    KIL

    OBO

    OKS

    .COM 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 catrc x. Gi tr m c chp nhn trong ta cc, nhng khng th biu dinln 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;

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    17/171

    KIL

    OBO

    OKS

    .COM

    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

  • 8/2/2019 Lam Game 3 d Bang Opengl

    18/171

    KIL

    OBO

    OKS

    .COM

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

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

    4 7 2 44 6 7 34 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 hnhvi mt ma trn n. Ngha l mi ma trn n cha mi gi tr cn thit ng thidng trong tnh tin, co gin v quay mt hnh. thc hin iu th cn bit tgi 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 dOpenGL i khi s dng t bit gi tr ny.Trong hu ht cc trng hp, w bng 1.Ngh a l vertex c biu din bi vector c dng: x, y, z Ma trn 3*3 cha cc gi trcn thit cho cc php bin h nh mt vertex (c biu din bng kiu d liu vector, tccng 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:

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    19/171

    KIL

    OBO

    OKS

    .COM

    1 0 00 1 0

    xTrrans yTrans 1Vi 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 trnhma 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 00 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 ckhi 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 phpbin hnh tip theo bng cch nhn ma trn ca n vi ma trn nhn c php kt hptrc. Hnh 2.10 biu din cc php bin hnhMt cch nhn khc c biu din hnh 2.12, nhng kt qu ca tng php kt hp ccma trn khng c th hin .

    Ma tr n

    k t

    Cc vector

    C a hnhX

    Hnh c

    bi n i=

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    20/171

    KIL

    OBO

    OKS

    .COM

    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 3X3vi 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 nv, kt qu cha trong m3 s c cng gi tr nh trong m2.

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    21/171

    KIL

    OBO

    OKS

    .COM

    Ma trn n v i cp n c nh ngha l loi ma trn ng cho nXm chiu, vi ccphn 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 khngtn 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 bygi ch n gin l nhn ma trn chnh vi cc vector ca hnh (xem hnh 2.10,2.11). Vnh vy cn mt hm khng ch nhn vector 1X3 vi ma trn 3X3, m nhn ma trn viton b danh sch vector:

    Void Transform(SHAPE& shape, MATRIX3X3& m)

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

  • 8/2/2019 Lam Game 3 d Bang Opengl

    22/171

    KIL

    OBO

    OKS

    .COM

    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 binhnh) v cc gi tr tnh tin x, y. u tin, n to ma trn tnh tin ; Ri nhn ma trn tnhtin vi ma trn chnh, lu kt qu trong ma trn cc b m2; Cui c ng sao chp m2 trli 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;

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    23/171

    KIL

    OBO

    OKS

    .COM

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

    }

    Hm quay c cc i s l tham chiu n ma trn chnh v gc quay(). u tinn kim tra gc quay c bng khng hay khng. Nu gc quay bng khng, h m kt thc loi tr, li chia cho 0. Nu khc khng, hm i ra radians v tnh sin, cosin. Tiptheo, Rotate khi to ma trn quay, nhn n vi ma trn chnh, lu kt qu vo ma trncc 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 trongbin 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 h nh 3X3 l m. Sau gi hmIntMatrix() khi to m theo ma trn n v. M s l:

    1.0000000000000 0.0000000000000 0.00000000000000.0000000000000 1.0000000000000 0.00000000000000.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.00000000000000.0000000000000 1.0000000000000 0.000000000000010.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.00000000000000.0000000000000 0.5000000000000 0.000000000000010.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.000000000000010.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.

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    24/171

    KIL

    OBO

    OKS

    .COM

    Chng 3: Ha Ba Chiu GDITrong 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 quinh trc x theo chiu ngang, trc y theo chiu ng, trc z theo phng i vo v ra mnhnh. l hng trc logic cho nhiu chng trnh, xut pht t vic trc x v y chytheo 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 ccvertex vi nhau. Nhng i vi i tng 3-D, vn c php tp hn, bi v s lngvertex l nhiu hn, i hi vic xc nh vic ni cc vertex h nh thnh ng itng yu cu. Do , i vi chng, khng ch nh ngha cc vertex, m cn phi nhngh a cc cnh. Mt i tng 3-D c xy dng trn cc vertex v cnh c gi lmt m hnh khung li (wireframe model).

    nh ngha mt m hnh khung li cn danh sch cc vertex v cnh. Do , hinnhin 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;

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    25/171

    KIL

    OBO

    OKS

    .COM

    }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 ccnh 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 khichng 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 hinm 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,

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    26/171

    KIL

    OBO

    OKS

    .COM

    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 h nh th c

    biu din ch vi cc ta x, v y. Vy bng cch no c th biu din mt i tng3-D ln mn hnh ?

    C hai phng php thc hin vn trn l php chiu song song v php chiuphi 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 cchb qua cc ta z. Kt qu l mt h nh 2-D n gin. Nh vy, vi trng hp khivung, hnh nh th hin trn mn hnh ch l mt h nh vung. Hm v khi vung sdng 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 cavertex dng lm im u ca cnh, ri dng s t m cc ta X, Y ca vertex.Cc ta ny c dng trong li gi n MoveTo() xc nh v tr im u. Ccta X, Y, ca im th hai c tm bng cch tng t, sau dng trong hm gin LineTo() v cnh:

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    27/171

    KIL

    OBO

    OKS

    .COM

    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 choi tng xa c v nh hn i tng gn . V d hnh 3.2 biu din hnh chiu phicnh ca khi vung, khi quan st t mt trc, gc di tri.

    Hnh 3.2 v khi vung vi phpchiu 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 cngnh (cng xa gc ta ), th tc dng co gin cng ln . Cc bin xCoord, yCoord vzCoord cha cc ta vertex. Cc bin perspX, prspY cha ta mn hnh ca vertexsau php chiu phi cnh. Bin eye xc nh mc tc ng ca php chiu trn mhnh. 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 cnhcnh 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 nhsau :

    Void PerspProject (MODEL& model, double eye){

    for (UINT I =0; I

  • 8/2/2019 Lam Game 3 d Bang Opengl

    28/171

  • 8/2/2019 Lam Game 3 d Bang Opengl

    29/171

    KIL

    OBO

    OKS

    .COM

    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

  • 8/2/2019 Lam Game 3 d Bang Opengl

    30/171

    KIL

    OBO

    OKS

    .COM

    Ma trn co gin:XFactor 0 0 0

    0 YFactor 0 00 0 ZFactor 00 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 cth thc hin 3 php quay cng mt lc. Thay vo , mi php quay coi nh mt phpbin 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 00 0 1 00 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);

    }

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    31/171

    KIL

    OBO

    OKS

    .COM

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

    1 0 0 00 cos(radians) sin(radians) 00 -sin(radians) cos(radians) 00 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) 00 1 0 0

    sin(radians) 0 cos(radians) 00 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

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    32/171

    KIL

    OBO

    OKS

    .COM

    Chng ny trnh by cch khi to ng dng OpenGL v cch kt hp OpenGLvo 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 ngtrong C

    ngha

    Glbyte Signed char S nguyn 8 bit

    Glshort Short S nguyn 16 bitGLint,GLsizei Long S nguyn 16 bitGlfloat,GLclampf Float Du chm ng 32 bitGldouble,Glclampd Double Du chm ng 64 bitGlubyte,Glboolean Unsigned char Char khng du 8 bitGlushort Unsigned short S nguyn khng du 16 bitGluint, GLenum,Glbitfield

    Unsigned long S nguyn khng du 32 bit

    Glvoid Void Hm khng i s hockhng 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 hintrn ca s. Ng cnh dng c xc nh mu sc bt v v c, kiu v, ni dung bngmu, kiu mapping (kiu th hin cc phn t ca khng gian ta ngun ln khnggian 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 tr nh Windows khc.

    Nhng ng thi phi s dng ng cnh biu din (RC,Rendering Context). Ton b lnhOpenGL u phi qua ng cnh biu din. Mi thread thc hin li gi OpenGL phi cmt ng cnh biu din hin hnh. Ng cnh biu din kt ni OpenGL vo h thng cas ca Windows NT va Windows95. ng dng s xc nh ng cnh dng c khi n tong 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 ngcnh dng c . Ng cnh dng c cha cc thng tin thch hp i vi GDI ca Windows

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    33/171

    KIL

    OBO

    OKS

    .COM

    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 giOpenGL 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, thli 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 gihm OpenGL, ng dng tho b ng cnh biu din khi thread, v xa n. Mt ca scng mt lc c th c nhiu ng cnh biu din, nhng ch mt trong s hin hnh vc tc dng.

    Mt ng cnh biu din hin hnh th c mt ng cnh dng c kt hp. Ng cnhdng 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 biudin 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 cnhandle khi to ng cnh biu din hin hnh.

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    34/171

    KIL

    OBO

    OKS

    .COM

    Bng 4.2 : Cc hm WGL qun l ng cnh biu din

    Tn hm Chc nngWglCreateContext () To mt ng cnh biu din mi WglDeleteContext () Xa ng cnh biu dinWglGetCurrentContext()

    Tr handle v ng cnh biu din hin hnh

    WglGetCurrentDC () Ly handle ca ng cnh dng c lin kt vi ng cnhbiu 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 tr nh 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 haych mc, b m im v l n hay i, s lng cc bit dng trong b m chiu su vb 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 nngChoosePixelFormat () Tr v mt nh dng im v ph hp nht vi nh

    dng im v yu cuDescribePixelFormat () Ly thng tin v nh dng im v choGetPixelFormat () Ly nh dng im v ca ng cnh dng c choSetPixelFormat () 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 imv ring bit th c miu t bi cu trc PIXELFORMATDESCRIPTOR, gm 26trng 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;

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    35/171

    KIL

    OBO

    OKS

    .COM

    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 * LPPIXELFORMATDESCRIPTORKhi 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 scho hm SetPixelFormat () .

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    36/171

    KIL

    OBO

    OKS

    .COM

    Bng 4.4 :Cc thnh phn ca cu trc PIXELFORMATDESCRIPTOR

    Thnh phn M tNsize 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 thhin . V d 8 bit th hin c 256 mu . i vi ch mu RGBA, th khng tnh n alpha bitplane.i vich mu ch mc , cColorBits xc nh kch thc bm mu .

    cRedBits S bit trong b m mu RGBA

    cRedShift Tng di cc bitplane trong b m mu RGBAcGreenBits S bit xanh l trong b m mu RGBAcGreenShift Tng di cc bitplane xanh l trong b m mu

    RGBAcBlueBits S bit xanh dng trong b m mu RGBAcBlueShift Tng di cc bitplane xanh dng trong b m mu

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

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

    Khng dng trn microsoft windowscAccumBits S bitplane trong b m tch lycAccumRedBits S bit trn mt pixel trong b m tch lycAccumGreenBits S bit xanh l trn mt pixel trong b m tch lycAccumBlueBits S bit xanh dng trn mt pixel trong b m tch lycAccumAlphaBits S bit alpha trn mt pixel trong b m tch lycDepthBits S bitplane trong b m chiu sucStencilBits S bitplane trong b m stencilcAuxBuffer S b m ph .khng dng trn microsoft windowsiLayerType Xc nh kiu lp .trn Microsoft Windows l

    PFD_MAIN_PLANE . Ngoi ra cc kiu lp khc lFPD_OVERLAY_PLANE vPFD_UNDERLAY_PLANE

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

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

    chung b m khung. Nu bitwise AND ca cc thnh

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    37/171

    KIL

    OBO

    OKS

    .COM

    vin dwDamageMask ca hai khung nh dng im vkhc 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 nhPFD_DRAW_TO_WINDOW B m c dng v vo ca s trn mnhnh hay thit b khc nh my in

    PFD_DOUBLEBUFFER Thit lp khi dng b m i.Khng dngcng vi c PFD_SUPPORT_GDI.

    PFD_GENERIC_FORMAT Thit lp khi chn nh dng im v tngqut ,l nh dng im nh c h trbi phn cng hay trnh iu khin thit b

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

    OpenGL ch c h tr bi mt bng muphn cng duy nht . (Bng mu phncng mapping mt_mt vi bng mulogic)

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

    PFD_SUPPORT_GDI B m h tr cc hm ha GDI.Khng dng cng vi cPFD_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 noPFD_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 hoatng ca n.Tuy nhin, c th dng gi tri mc nh cho hu ht cc thnh phn ca cutrc. 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 trcPFD_DRAW_TO_WINDOW | //V vo ca s

    PFD_SUPPORT_OPENGL, //H tr li gi OpenGLPFD_TYPE_RGBA, //Ch mu RGBA24, //24 bit mu

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    38/171

    KIL

    OBO

    OKS

    .COM

    0,0,0,0,0,0, //khng lu chn0,0,0,0,0,0,0, //cc ch 32, //b m chiu su 32 bit0,0, //Khng dng b m stencil hay

    b m ph trPFD_MAIN_PLANE, //Kiu lp ch yu

    0, //Khng chn0,0,0, //Khng chn

    };vi khi to nh trn, cc c c tnh trong dwFlags cho php ng dng s dng cc h mOpenGL 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 khngn nh trn h thng 256 mu). Cc thnh phn t cRedBits n cBlueShift khng cchn. ng dng s khng dng cc b m alpha hay b m tch ly, do thit lp cctrng t cAccumBits dn cAccumAlphaBits bng 0. Trng cDepthBits chn b mchiu 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 dngcho kiu lp trong Microsoft Windows. Cui cng, cc thnh phn d tr v khng h trc 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 phhp 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 cahm ny l handle i v DC, ch s nh dng im v, v a ch cu trcPIXELFORMATDESCRIPTOR . 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 viyu cu nh dng .Thng thng, khng c vn y. Tuy nhin, lun lun phikim tra nh dng ny trc khi chc chn n ph hp vi ng dng. Mt cch thc hinl xem xt mi nh dng c hiu lc, ri chn ra nh dng no c coi l tt nht chong dng. on m thc hin nh sau :

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    39/171

    KIL

    OBO

    OKS

    .COM

    PIXELFORMATDESCRIPTOR pfd;CClientDC clientDC (this);Int numFormat = DescribePixelFormat(clientDC.m_hDC,1,sizeof(pfd),&pfd);For(int i= 0;I

  • 8/2/2019 Lam Game 3 d Bang Opengl

    40/171

    KIL

    OBO

    OKS

    .COM

    Thun li ca phng php ny l chng trnh ch cn mt ln lm cho ng cnhbiu din tr nn hin hnh. V vic lm cho ng cnh biu din tr nn hin hnh chimnhiu thi gian x l, nn phng php 1 cho php ng dng p ng thng boWM_PAINT nhanh hn.

    im bt li l ch phi duy tr mt ng cnh dng c cho ton b thi gian chychng trnh. Ngoi ra, vi cc chng tr nh 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 chychng trnh.Tuy nhin, c mi ln to ng cnh dng c, chng trnh ng thi philm 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 trcPFD_DRAW_TO_WINDOW | //V vo ca sPFD_SUPPORT_OPENGL, //H tr li gi OpenGLPFD_TYPE_RGBA, //Ch mu RGBA

    24, //24 bit mu0,0,0,0,0,0, //khng lu chn0,0,0,0,0,0,0, //cc ch 32, //b m chiu su 32 bit0,0, //Khng dng b m stencil hay b m ph trPFD_MAIN_PLANE, //Kiu lp ch yu0, //Khng chn0,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();

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    41/171

    KIL

    OBO

    OKS

    .COM

    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 ngcnh dng c cho vng client ca ca s. Sau o, gi ChoosePixelFormat () tm ch snh dng im v yu cu cho DC v gi hm SetPixelFormat () thit lp nh dngim v.

    Tip theo, OnCreate() gi wglCreateContext() to RC thch hp vi ng cnhdng 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 vicc b, nn t ng hy khi tr v, Do DC b hy, n khng th lm cho RC tr nn hinhnh ti im ny trong chng trnh.

    n khi cp nht ni dung ca ca s ng dng, MFC gi hm OnDraw() ca lpview. Lc ny hm OnDraw() sc lm cho RC tr nn hin hnh, bng cch giwglMakeCurrent() s dng handle ca i tng DC (DC bt v) c truyn chohm. 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() vln ca s. (Phi vit code cho hm ny)

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

    Cui cng, khi kt thc ng dng, MFC gi hm OnDestroy() ca lp view. TrongOnDestroy(), chng tr nh ch gi wglDeleteContext() xa ng cnh biu din .Thng s duy nht ca hm l handle ca ng cnh biu din. Nu thnh cng , thwglDeleteContext() ftr v gi tr l TRUE , tri li n tr v gi tri FALSE. Do ng cnhdng 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 cnhbiu 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 thhai l NULL tch ng cnh dng c ra khi ng cnh biu din.

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    42/171

    KIL

    OBO

    OKS

    .COM

    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, ths 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 ngcnh 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 biudin tr nn hin hnh, ngha l rng but ng cnh biu din vi ng cnh dng c caca s. Trc khi kt thc chng trnh, ng cnh biu din phi c lm tr nn khnghin hnh v b xa

    Chng 5:V Hnh V S Dng MuChng 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 liui s ca i sCc 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, t y thuc vo slng v loi thng s m chng tip nhn, nn trn thc t s lnh mu (prototype hns lnh c bn) nhiu hn s lnh c bn. Nh bao gm ht nhn OpenGL c hn 300nguyn mu, trong khi ch gm 115 hm c bn:

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    43/171

    KIL

    OBO

    OKS

    .COM

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

    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 trngOpenGL 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 chon khi glColor() uc gi mt ln na thay i n. T tng ny rt quen thuc tronglp 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 sc duy tr cho n khi n c thay th.

    Bng 5.2 : Cc hu t lnh OpenGL

    Hu t Kiu d liu ca i sB GlbyteB GLdouble hay GlclampdF GLfloat hay GlclampfI GLint hay GlsizeiS GlshortUb GLubyte hay GlboonleanUi GLuint, GLenum hay GlbitfieldUs Glushort

    Bv GLbyte dng vectorDv GLdouble hay GLclampd dng vectorFv GLfloat hay GLclampf dng vectorIv GLint hay GLsizei dng vectorSv GLshort dng vectorubv GLubyte hay GLboolean dng vectoruiv GLuint, GLenum hay Glbitfield dng vectorusv GLushort dng vector

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    44/171

    KIL

    OBO

    OKS

    .COM

    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. Vd mu xa (bin trng thi tham chiu bi hng GL_COLOR_CLEAR_VALUE ) c gitr mc nh l mu en, hay mu v (bin trng thi tham chiu bi hngGL_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 nnen

    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 dngv alphaRGBA(red, green, blue, alpha) l ch mu kt hp h thng RGB vi alpha (l thnhphn dng iu khin vic trn mu)RGB(red, green, blue) l ch pha trn hay phng php th hin mu trn phng tindng ngun sng nh mng hnh mu. RGB pha trn theo t l phn trm cc mu c bnl , xanh l v xanh dng to nn cc mu khc. H iu hnh windows nh nghacc t l ny bng gi tr 8 bit, gi l gi tr RGB. Gi tr RGB(0,0,0), tc khng phntrm (cng thp nht) ca c 3 mu c bn, cho ra mu en. Gi trRGB(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 trongsut hon tonOpenGL cn ch mu ch mc, l ch mu m mi mu c ch nh bi 1 ch strong 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() hiui s ca n nh mt chui cc c bit cho bit b m n o cn xa

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    45/171

    KIL

    OBO

    OKS

    .COM

    (hm khng tr v gi tr). B m mu (c biu th bi cGL_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 bm 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 bihu 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 cv bng mu v chn. Nh bit, mu ny s duy tr tc dng cho n khi no b thayi bi li gi glColor() khc.

    C th tc ng mt cch su sc n mu ca cc i tng trn mn hnh nhvo 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 nhmong mun. l v bng mu tiu chun ca Windows ch gm 20 mu, gy kh khncho OpenGL trong vic th hin. K thut chiu sng (lighting) s ci thin vic kimsot 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 tnh cc chng ha 2 chiu v ha 3 chiu. im khc bit l khng dng cc kiud 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. Ccc 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() gihm glVertex2f() hai ln. Hm glVertex2f(), nh ngha mt vertex, dng cc gi tr is 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,Yca vertex, nhng vn c gi tr z v x lin kt vi vertex. Chng mang cc gi tr mcnh 0.0 cho z, v1.0 cho w.

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

    glBegin(GL_LINES)

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    46/171

    KIL

    OBO

    OKS

    .COM

    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 trongOpenGL. Cc ta mc nh ny to nn mt khi vung 2x2x2, vi gc ta (0,0) titm 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 vbng 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(). Cchm 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

    ngh a 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 milnh 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 vch 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.

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    47/171

    KIL

    OBO

    OKS

    .COM

    Nhiu hnh c v nh tn gi ca chng. V d, hnh to bi glBegin(GL_POINTS) lmt 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 trnnh 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. Nunh 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,ZVi 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 kchthc 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 caim. 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 vim ln nht. Li gi glGetFloatv() i hi cc i s gm mt hng s cho bit gi trcn t c v a ch mng glFloat cha cc gi tr . C gn 150 hng s c th d ngvi 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. ach bin ny c cho bii 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);

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    48/171

    KIL

    OBO

    OKS

    .COM

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

    Ch rng mc d c th thit lpng kch ca im, trn thc t kch thc im nh b nh hng bi antialiasing, lthao tc ha lm gim hoc loi tr hin tng bc thang ca ng thng trn mnhnh. 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);

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    49/171

    KIL

    OBO

    OKS

    .COM

    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 vln 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 nyc cho nh l i s th 2 trong hm glGetFloatv()

    on m sau th hin hnh hnh 5.3glClearColor(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 viOpenGL

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    50/171

    KIL

    OBO

    OKS

    .COM

    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 lmiu , cn nh ngha mu chm,bng cch to mt gi tr nh phn, vi 1 tng ng vichm, 0 tng ng vi khng chmV 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 gchngn.

    s dng mu chm lm i s trong li gi glLineStipple(), phi chuyn nsang 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 slp 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 btu kh nng chiu sng. C gn 50 hng s dng dvi cc hm glEnable() vglDisable().

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

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    51/171

    KIL

    OBO

    OKS

    .COM

    Hnh5.4: V cc ng chm viOpenGL

    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 mOpenGL s v n. Tng t lnh MoveTo() vi 1 on lnh LineTo() theo sau. Trongtrng 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

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    52/171

    KIL

    OBO

    OKS

    .COM

    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, hngGL_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 knVi 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 , mta gic OpenGL c hai mt trc v sau c th v theo hai cch ring, v c th quay 1 agic 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 tamun thit lp ch v l mt trc hay mt sau, hay c hai mt. i s th 2 cho bitch v cho mt a gic chn. Cc ch v c th l GL_POINT (v im ti ccvertex ca a gic ), GL_LINE (v a gic vi cc cnh a gic khung li), GL_FILL(a gic c)

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    53/171

    KIL

    OBO

    OKS

    .COM

    cho OpenGL bit mt no ca a gic l trc , v mt no l sau, ta dng tht 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 thayi 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 theochiu no. i s n ca hng l GL_CW khi chn chiu kim ng h, v GL_CCW khichn chiu ngc chiu kim ng h(mc nh)

    nh ngha mt a gic cng dnh 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 thiGL_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() nhngha a gic. Sau , nh ngha cc vertex ca a gic theo chiu ngc chiu kim ngh (theo mc nh). Cui cng, nh thng l, kt thc vic nh ngha bng li giglEND().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 viOpenGL.

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    54/171

    KIL

    OBO

    OKS

    .COM

    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 dinmt sau.

    V a gic l i-din-mt-trc, nn ch mttrc c th hin. Nu thay iglFontFace(GL_CCW) bng glFontFace(GL_CW), bo cho OpenGL rng a gicl 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 thv 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 trongh thng ng k 32x32. Mi vung c in y trong mu th hin o mt bit cgi 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 thngng 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,

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    55/171

    KIL

    OBO

    OKS

    .COM

    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 trnmu hnh 5.9. Dng u tin trn trong mng l dng cui cng ca mu chm, v dngd 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,

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    56/171

    KIL

    OBO

    OKS

    .COM

    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 h nh ch nht mt cch hiu qu, OpenGLdng 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 trongTuy 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 khungli 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 nghatip theo. Li gi glEdgeFlag(TRUE) s tr li vic v cnh bnh thng.

    Hnh 5.11a gic li v khng li

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    57/171

    KIL

    OBO

    OKS

    .COM

    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 h nh ch nht. on m sau to hnhtng 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 LglEnd(); 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);

    http://kilobook

    TH VIEN IEN TTRC TU

    http://kilobooks.com/http://kilobooks.com/http://kilobooks.com/showthread.php?t=2007http://kilobooks.com/http://kilobooks.com/
  • 8/2/2019 Lam Game 3 d Bang Opengl

    58/171

    KIL

    OBO

    OKS

    .COM

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

    glFlush();

    H