KILOBOOKS.COM
MC LC
Li m đu
PHN 1: TÌM HIU TH VIN HA OPENGL 1
Chng 1: S lc v OPENGL 1
1.1. Lch s phát trin 1
1.2. Khái nim 1
1.3. Thành phn 5
Chng 2: ha hai chiu GDI 6
2.1. Ta đ đ các và ta đ màn hình 6
2.2. nh ngha vertex và kiu d liu hình dng 8
2.3. Các phép bin hình 10
2.4. S dng ma trn cho các phép bin hình 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. Các phng pháp th hin hình 3-D lên màn hình 28
3.4. Bin hình đi tng 3-D 31
Chng 4: Chng trình OpenGL ti thiu 36
4.1. Các 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 hình và s dng màu: 48
5.1. Cú pháp lnh OpenGL 48
5.2. Các trng thái OpenGL 49
5.3. Xét mt chng trình OpenGL ti thiu 50
5.4. nh ngha và v đim 53
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
KILOBOOKS.COM
5.5. nh ngha và v đng 56
5.6. nh ngha và v đa giác 61
5.7. Tng kt 74
Chng 6: Các phép binhình OpenGL 75
6.1. Xây dng đi tng 3-D t các đa giác 75
6.2. Phép chiu 77
6.3. Phép bin hình đi tng 79
6.4. Phép bin đi viewport 85
6.5. Tng kt 88
Chng 7: Chiu sáng đi tng 3-D 89
7.1. Các loi ngun sáng 89
7.2. nh ngha mt ngun sáng 90
7.3. nh ngha tích cht vt liu 92
7.4. nh ngha các pháp tuyn 95
7.5. Xác đnh kiu bóng và kích hot vic kim tra chiu sâu 97
7.6. nh ngha đèn chiu 98
7.7. Th hin đi tng 3-D đc chiu sáng 99
7.8. Bng màu logic 103
7.9. Tng kt 107
Chng 8: To cnh 3-D 108
8.1. S dng các phép bin hình OpenGL đ to cnh 3-D 108
8.2. S dng các stack ma trn 113
8.3. To o giác chuyn đng vi OpenGL 117
8.4. Tng kt 119
Chng 9: Anh và gán cu trúc 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. Gán cu trúc cho đa giác 139
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
KILOBOOKS.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 dùng display list 160
11.3. Các tính cht ca display list. 162
11.4. Các 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 thái trong display list 164
Chng 12: Quadric. 164
PHN 2: MÔ PHNG CÁC GII THUT HA 3 D VI OPENGL: 166
Chng 1: Tng quan: 166
1.1. Mt s khái nim liên quan: 166
1.2. Các phép biên đi: 167
Chng 2: Xây dng ng dng mô phng thut gii: 169
2.1. Xây dng ng dngOpenGL 169
2.2. Cách làm vic ca ng dng 172
2.3. Bng kê chng trình: 179
Li M u
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
KILOBOOKS.COM
Cú cõu rng mt hỡnh nh bng c nghỡn li núi . iu ú tht khụng th ph
nhn. V rừ rng l nu hin th thụng tin ch vi cỏc ký hiu, ch cỏi, ch s
khụng thụi thỡ khụng th hp dn v d hiu nh khi cú thờm biu din ha K
thut ho cng l cụng c khụng th thiu trong cỏc ngnh khoa hc k thut,
giỏo dc, ngh thut, gii trớ, qung cỏo( din t mỏy múc thit b, kin trỳc,
cu trỳc c th, thụng tin thiờn vn a lý, hỡnh nh minh ho ). Chớnh vỡ vy,
ha l mt vn c quan tõm trong ngnh cụng ngh thụng tin.
Cựng vi s phỏt trin ca tin hc, k thut ha trờn mỏy vi tớnh, ngy
cng tr nờn tinh xo. Giao din cỏc phn mm ngy nay tr nờn thõn thin, p
mt nh cỏc th hin ha. S h tr ca tin hc cho cỏc ngnh khỏc tr nờn c
lc hn nh kh nng ha vi tớnh. V th gii thc thỡ c biu din mt cỏch
sinh ng, linh hot, y mu sc bng khụng gian ba chiu.
Trong thnh cụng ca k thut ha ngy nay khụng th khụng núi n s phỏt
trin vt bc ca tc phn cng ln h iu hnh. Nhng bn thõn k thut
ha thỡ cú bc tin nhy vt t nhng phộp tớnh toỏn hc phc tp n nhng th
vin ha c to sn. Cỏc th vin ny cho phộp gim nh thi gian v cụng
sc ca ngi lp trỡnh; Bi vi chỳng, cú c mt tỏc phm ha khụng
ũi hi phi cú mt kin thc hựng hu v ng cong Bezier, B-spline, v hỡnh
hc, to búng, m ch ng dng cỏc hm to sn. Mt trong nhng th vin ú l
OpenGL, c xem l tiờu chun thit k cụng nghip cho ha ba chiu.
Mc tiờu ca lun vn ny l tỡm 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 cỏc gii thut ha ba chiu.
Tuy nhiờn, ti khụng th khụng trỏnh khi nhng hn ch v thiu sút, nờn rt
mong c s ch bo, gúp ý ca quý Thy Cụ v bn bố.
PHN 1:
TèM HIU TH VIN HA OPENGL
Chng1:S Lc v OPENGL
1.1.Lch S Phỏt Trin :
Nguyờn thy, GL do Silicon Graphics Incorporated (SGI) thit k dựng cho cỏc
trm lm vic (workstation) ha IRIS ca h. IRIS GL vi cỏc cu hỡnh phn cng
khỏc thỡ cú vn phỏt sinh.
OpenGL l kt qu n lc ca SGI nhm ci thin tớnh tng thớch ca IRIS GL.
Ngụn ng mi ny cú kh nng ca GL, ng thi m ngha l d dng tng thớch
vi cỏc lai cu hỡnh phn cng, cng nh cỏc h iu hnh khỏc nhau.
Version1.0 ca OPENGL c gii thiu vo ngy 01/7/1992.
bo m tớnh m , mi s nõng cp OpenGL phi thụng qua Uy Ban Xem Xột Kin
Trỳc OpenGL(OpenGL Architecture Review Board AEB) gm cỏc thnh viờn sỏng lp l
SGI, Digittal Equipment Corporation, IBM ,Intel v Microsoft.ARB hp mi nm hai ln.
THệ VIEN ẹIEN Tệ TRệẽC TUYEN
KILOBOOKS.COM
(Các cơng ty khác cng có th tham gia tho tun nhng khơng có quyn b phiu ).
Open GL version1.1 đc ARB thơng qua vào tháng 12/1995.
1.2. Khái Nim :
OpenGL đc đnh ngha là “giao din phn mm cho phn cng đ ha ”. Thc
cht, OpenGL là mt th vin các hàm đ ha, đc xem là tiêu chun thit k cơng
nghip cho đ ha ba chiu.
Vi giao din lp trình mnh m, OpenGL cho phép to các ng dng 3-D phc
tp vi đ tinh vi, chính xác cao, mà ngi thit k khơng phi đánh vt vi các núi cơng
thc tốn hc và các mã ngun phc tp. Và do OpenGL là tiêu chun cơng nghip, các
ng dng to t nó dùng đc trên các phn cng và h điu hành khác nhau.
Các mc sau s gii thiu cách nhìn tng qt v cách làm vic ca OpenGL:
- Các phn t đ ha c bn và lnh gii thiu v các phn t đ ha c bn
(primitive) và s thc hin lnh
- Cách làm vic ca OpenGL cho bit các lai thao tác đ ha mà OpenGL kim
sốt
- Mơ hình hot đng nói v mơ hình client/server cho vic thơng dch lnh
OpenGL
- Thao tác OpenGL c bn đa ra mt mơ t mc cao v cách OpenGL x lý d
liu và to ra hình nh tng ng lên b đim khung.
Các phn t đ ha c bn và lnh:
Primitive đc xác đnh bi nhóm ca mt hay nhiu vertex là đim trong khơng gian.
Mi vertex xác đnh mt đim, mt đu đon thng hay mt đnh đa giác. D liu (bao
gm ta đ vertex, màu sc, normal, texture và c xác đnh loi cnh) kt hi vi vertex.
Khi x lý primitive, mi cp vertex và d liu liên kt vi nó đc s lý đc lp vi các
cp khác, theo th t và cùng mt phng pháp. Ngoi l duy nht là trong trng hp
kh phn khut ca primirite(clipping). Khi đó, d liu vertex đc sa và các vertex
khác đc to ra. Loi clipping tu thuc loi primirite mà nhóm vertex biu din.
Các lnh ln ln đc x lý theo th t mà nó tip nhn, mt dù có s trì hỗn
khơng xác đnh trc khi lnh có hiu lc. Ngha là mi primirite đc v trn vn trc
khi lnh tip theo có hiu lc.
Cách làm vic ca OpenGL:
OpenGL là ngơn ng đ ha theo th tc ch khơng phi ngơn ng mơ t.Thay vì t
các cnh và cách chúng xut hin, OpenGL đa ra các bc cn thit đ có đc s th
hin hay hiu qu nht đnh. Các “bc”này là các li gi đn giao din lp trình ng
dng gm xp x 120 lnh và hàm. Chúng đc dùng đ v các phn t đ ha c bn
nh đim, đng và đa giác trong khơng gian ba chiu. Ngồi ra, OpenGL còn h tr
chiu sáng, tơ bóng, gán cu trúc, to o giác chuyn đng và các hiu qu đc bit khác.
OpenGL khơng có các chc nng qun lý ca s, tng tác vi ngi dùng hay
xut nhp file. Mơi trng ch (tc h điu hành) có các chc nng này và chu trách
nhim thc hin các bin pháp qun lý cho OpenGL.
Mơ hình hot đng:
Mơ hình thơng dch lnh OpenGL là client-server. Mã ng dng(vai trò client) đa ra
các lnh. Lnh đc thơng dch và s lý bi OpenGL (vai trò server). Server và client có
th là trên cùng mt máy tính khác nhau. Theo ngha này, OpenGL là network-transparent
THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN
KILOBOOKS.COM
(tm dch là mng trong sut). Server duy trì nhiu ng cnh OpenGL, mi ng cnh là
mt trng thái OpenGL. Client có th nói vi bt c ng cnh nào. Giao thc mng đc
s dng có th là đc lp hóa da trên giao thc mng hin có (tc OpenGL dùng trên
máy đc lp hay trên mơi trng mng). Khơng có lnh OpenGL nào tip nhn vic nhp
d liu trc tip t ngi dùng.
Cui cùng, h thng ca s kim sốt tác dng ca các lnh OpenGL trên b đm khung
qua các thao tác:
- Quyt đnh các phn ca b đm khung mà OpenGL có th truy xut ti thi đim cho
phép.
- Truyn đt cho OpenGL thơng tin v cu trúc các phn đó.
- Nh vy, khơng có lnh OpenGL nào đnh dng b đm khung hay khi to OpenGL.
S đnh dng b đm khung đc thc hin bên ngồi OpenGL trong s liên kt vi h
thng ca s. S khi to OpenGL đc tin hành khi h thng cp phát ca s cho vic
biu din.
Hình 1.1
Mơ hình hot
đng c bn
ca OpenGL
Lnh OpenGL
Phía Client
Phía Server
Thao tác OpenGL c bn:
S đ khi 1.2 tóm tt cách OpenGL x lý d liu. Các lnh đi vào phía trái s đ
và qua “đng ng x lý”. Mt s lnh xác đnh đi tng hình hc đc v, và s khác
kim sốt cách qun lý đi tng qua các giai đon s lý khác nhau.
OpenGL DLL
Server DLL
Video Driver
Win DLL
THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN
KILOBOOKS.COM
Hỡnh 1.2 S x lý d liu ca OpenGL:
Lnh
Cỏc giai on s lý khỏc nhau:
Danh sỏch hin th thay vỡ x lý lp tc ton b cỏc lnh, mt s lnh c gom li
trong mt danh sỏch x lý sau.
B c lng: c lng l quỏ trỡnh OpenGL sinh ra cỏc vertex v thụng s t cỏc
phng trỡnh Bộzier xỏc nh trc, cung cp mt phng cỏch hiu qu xp x hỡnh
hc cỏc b mt v ng cong bng cỏch ỏnh giỏ cỏc lnh a thc ca giỏ tr a vo.
Cỏc thao tỏc trờn vertex v s t hp ca primirite: OpenGL x lý cỏc primirite hỡnh
hc (im, on thng v a giỏc). Nhng primirite ny c biu din bi cỏc vertex.
Cỏc vertex c bin i, chiu sỏng, v cỏc primirite c kh cỏc cỏc phn khut theo
viewport chun b rasterze.
Raterization: giai on resterize to ra mt chui cỏc a ch b m khung v cỏc
giỏ tr liờn kt s dng hỡnh dng hai chiu ca im, on thng hay a giỏc. Cỏc
fragment to ra c cung cp cho quỏ trỡnh tip theo.
Cỏc thao tỏc trờn fragment: l cỏc thao tỏc cui cựng trờn d liu, trc khi lu tr
d liu di dng cỏc pixel trong b m khung.
Cỏc thao tỏc ny bao gm vic cp nht (cú iu kin) b m khung da trờn giỏ tr
lu tr v giỏ tr va cú, vic pha trn cỏc mu va cú v mu lu tr, cng nh thao tỏc
mask v cỏc thao tỏc logic khỏc trờn cỏc 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, dựng cho giai on rasterizatrion.
Hay rasterize, vi kt qu cỏc fragment c kt hp vo trong b m khung, nu
chỳng phỏt sinh t d liu hỡnh hc.
1.3. Thnh Phn:
OpenGL gm 5 b hm :
Danh
sỏch
B
c
lng
Thao tỏc trờn
vertex v
primitive
Rasteri
-
zation
Thao tỏc
trờn
fragme
B
m
khung
B nh
texture
Cỏc thao tỏc
pixel
THệ VIEN ẹIEN Tệ TRệẽC TUYEN
KILOBOOKS.COM
B ht nhõn cú 115 hm c bn. Tờn cỏc hm ny bt u bng GL. Windows
NT h tr 4 chng loi hm khỏc, bao gm th vin OpenGL utility(tờn hm bt u bng
GLU), th vin OpenGL auxiliary(tờn hm bt u bng AUX), b hmWGL (tờn hm
bt u bng WGL), v cỏc hm WIN32 API (tờn hm khụng cú tin t c bit).
B hm ht nhõn cho phộp thit k cỏc hỡnh dng khỏc nhau, to cỏc hiu qu
chiu sỏng, kt hp antialiasing v gỏn cu trỳc, thc hin bin i ma trn
Do cỏc hm c bn c th hin nhiu dng khỏc nhau tựy thuc vo loi d
liu m chỳng tip nhn, nờn trờn thc t cú hn 300 nguyờn mu (prototype) cỏc hm c
bn.
Th vin OpenGL utility gm cỏc hm cao cp. Cỏc hm ny n gin hoỏ vic
s dng hỡnh nh cu trỳc, thc hin vic bin i ta mc cao, h tr tesselation a
giỏc, v biu din cỏc i tng cú c s a giỏc nh hỡnh cu, hỡnh tr hỡnh da.
Th vin OpenGl auxiliary gm cỏc hm c bit dựng n gin húa cỏc vớ d
lp trỡnh trong sỏch ch dn lp trỡnh OpenGL. Cỏc hm ph thuc platform ny thc hin
cỏc nhim v nh qun ký ca s, iu khin xut/nhp, v cỏc i tng 3D nht nh.
Do cỏc hm ny cú mc ớch thit minh nờn khụng c dựng trong cỏc mó sn xut.
Cỏc hm WGLkt ni OpenGL vi WINdows NT, cho phộp ngi lp trỡnh
xõy dng v chn la cỏc ng cnh biu din, to cỏc bitmap font, cỏc hm ny ch dựng
trờn Windows NT.
Cui cựng, cỏc hm Win32 API c dựng gii quyt cỏc nh dng im nh v
to b m ụi.
Chng2: Ha Hai Chiu GDI
OpenGL cung cp nhiu hm mnh m, lm n gin cỏc vic v cỏc hỡnh nh
phc tp. Dự vy, hiu OpenGL, cn cú mt chỳt kin thc trong thc tin lp trỡnh
ha tiờu chun. Bc u tiờn v mc tiờu ú l tỡm hiu cỏch thao tỏc hỡnh nh hai chiu
GDI
Cỏc phn sau s gii thiu c s lp trỡnh ho 2-D :
- Ta cỏc v ta mn hỡnh
- S dng cỏc Vertex nh ngha mt hỡnh dng phng
- Tnh tin, co gión v quay
- S dng ma trn trong bin hỡnh 2-D
2.1.Ta Cỏc V Ta Mn Hỡnh:
k mt on thng trờn mn hỡnh, ta thng gi cỏc hm nh v im u, sau
ú v on thng. Vớ d cỏc hm MFC c gi l:
CclientDC dc(this)
dc.MoveTo(x,y)
dc.LineTo(x,y)
Mi quan tõm õy l vic biu din cỏc ta x,y.
Trong ta ca s, cng nh ta mn hỡnh, gc ta v trớ gúc trỏi trờn, chiu
tng ca ta x v phớa phi, chiu tng ta y i v phớa di (hỡnh 2.1)
Tuy nhiờn, i tng ha c xỏc nh bi ta cỏc Vertex ca nú trong h
cỏc (hỡnh2.2). Cỏc im khỏc bit gia hai ta ny l:
H cỏc xỏc nh chiu tng ta y l chiu i lờn.
THệ VIEN ẹIEN Tệ TRệẽC TUYEN
KILOBOOKS.COM
H đ các cho phép có ta đ âm.
Và nh vy, vn đ phát sinh khi biu din mt đi tng đc đnh ngha trong h đ
các. Trong ta đ màn hình, ta li nhn đc mt tam giác nh (hình 2.4), nu vi mã to
hình nh sau :
CCLientDC dc(this)
dc.MoveTo(2,5);
dc.LineTo(5,2);
dc.LineTo(2,2);
dc.LineTo(2,5);
Do s khác bit gia màn hình th hin và ta đ đ các, cn có mt phng pháp
chuyn đi gia chúng. Thut ng đ ha gi là mapping các đim trong ta đ đ các
sang ta đ màn hình đ th hin đi tng đúng v trí.
Hình 2.1 Ta đ màn hình Hình 2.2 Ta đ các
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
KILOBOOKS.COM
Hỡnh 2.3 Tam giỏc trong ta cỏc Hỡnh 2.4 v tam giỏc khụng cú s
chuyn i gia ta cỏc v
ta mn hỡnh
Nu b qua vn gớa tr õm, thỡ vic th hin im (x1,y1) trong ta cỏc
sang im (x2,y2) trong ta mn hỡnh ũi hi cụng thc sau:
X2=X1;
Y2=maxY Y1;
D nhiờn, thc hin cụng thc ny, trc ht cn bit kớch thc hin ti ca ca
s, bng cỏch gi hm GetClientRect(). Hm ny in y cu trỳc RECT vi kớch thc
ca s. S dng hm MFC, on mó sau v tam giỏc ó cho lờn ca s, mapping gia ta
cỏc v ta mn hỡnh:
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<3;++x)
{
newX = triangle[x*2];
newY = maxY triangle[x*2+1];
if(x = = 0)
{
dc. MoveTo(newX,newY);
startX = newX;
startY = newY;
}
else dc.LineTo(newX,newY);
}
dc.LineTO(startX,startY);
}
Dũng u tiờn ca on mó nh ngha mt móng chc cỏc ta cỏc tam
giỏc. Tip theo, on mó tỡm ng cnh dng c ca ca s v khai bỏo cỏc bin cc b.
Cỏc bin newX, newY chc cỏc ta mn hỡnh ca mt im, cũn startX, startY cha
ta mn hỡnh im u tiờn ca tam giỏc. Cu trỳc RECT, clientRect, cha kớch thc
ca s. Sau ú hm GetClientRect() c gi in y cu trỳc clientRect. thnh phn
bottom cha chiu cao ca s. Giỏ tr ny c gỏn cho bin maxY.
Vũng lp for lp i lp li mng ta tam giỏc. Trong thõn vũng lp cỏc ta
(x,y) c mapping gia ta cỏc v ta mn hỡnh .
im u tiờn l im bt u tam giỏc. Cỏc im tip theo c dựng v ng thng
tam giỏc. Li gi LienTo() bờn ngoi vũng lp ni im cui cựng vi im u tiờn.
THệ VIEN ẹIEN Tệ TRệẽC TUYEN
KILOBOOKS.COM
2.2. nh Ngha Vertex V Kiu D Liu Hỡnh Dng:
Mt hỡnh phng thỡ c xỏc nh bi mt tp hp cỏc vertex. Cỏc vertex ni vi nhau
bng cỏc on thng. Khi tt c vertex c ni thỡ hon thnh hỡnh dng.
qun lý cỏc kiu hỡnh dng khỏc nhau trong mt chng trỡnh c d dng,
cn nh ngha cp cu trỳc bao gm kiu d liu vertex.
Typedef struct vertex
{
int x, y; //Cu trỳc ny ch n gin l lu tr
}VERTEX; //cỏc ta cỏc vertex
V kiu d liu hỡnh phng
Typedef struct shape
{
int numVerts; //Gm mt s nguyờn ch s lng
VERTEX*vertices; //vertex trong hỡnh v mt con tr
}SHAPE; //tr n mng cu trỳc
Vi cỏc kiu d liu mi ny, ta cú th vit an mó v on thng tng quỏt 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<shape1.numVerts;++x)
{
newX shape1.vertices[x].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);
THệ VIEN ẹIEN Tệ TRệẽC TUYEN
KILOBOOKS.COM
}
Do DrawShape() đc tng quát hóa đ làm vic vi cu trúc SHAPE, hàm
này có th v mi loi hình phng.Ví d đ v mt hình 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 giác sáu cnh nh sau:
Hình 2.5
VERTEX shapeVerts[6]= {10,10,75,5,100,20,100,50,50,50,25};
SHAPE shape1 = {6,shapeVerts};
2.3.Các Phép Bin Hình:
Mt hình phng đc to bng cách đnh ngha vertex ca nó trong ta đ đ các,
mapping gia ta đ đ các và ta đ màn hình, ri v các đan thng nói các vertex.
Tuy nhiên, đây ch là s khi đu. v hình mi ni trên màn hình và theo mi
hng, hình nh cn đc thao tác theo nhiu cách khác nhau. Các thao tác nh vy
gi là các phép bin hình, bao gm tnh tuyn, co giãn và quay.
2.3.1.Phép Tnh Tin:
Tnh tin mt hình đn v trí mi ch đn gin là cng hoc tr ta đ ca
mi vertex vi mt giá tr. Tam giác trong hình 2.6 đc tnh tin 3 đn v theo
trc x và 2 đn v theo trc Y.
Hình 2.6: Tnh tin mt tam giác
Gi s cn tnh tin 20 đn v theo trc X vá 30 đn v theo trc y, mt tam giác có
đnh ngha nh sau:
VERTEX triangleVerts[3]= { 20,50,50,50,20,100};
SHAPE shape1 = {3,triangleVerts};
Công thc tnh tin mi vertex là :
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
KILOBOOKS.COM
X2 = X1 + xTranslation;
Y2 = Y1 + yTranslation;
Trong chng trỡnh ton b phộp 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<shape1.numVerts;++x)
{
newX shape1.vertices[x].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 Translate() cú cỏc i s l tham chiu n cu trỳc SHAPE, lng
tnh tin x v lng tnh tin y. Nú s dng vũng lp for gỏn lng tnh tin
trong ta (x,y) ca mi vertex.
2.3.2 .Phộp Co Gión:
THệ VIEN ẹIEN Tệ TRệẽC TUYEN
KILOBOOKS.COM
Thay vỡ cng hoc tr cỏc vertex vi mt giỏ tr nh khi tnh tin, co gión
mt hỡnh l nhõn cỏc vertex ca hỡnh ú vi mt h s co gión. Hỡnh 2.7 biu din
mt tam giỏc gión hai ln (h s co gión l 2).
Hỡnh 2.7: Co gión mt tam giỏc
Chỳ ý rng khụng ch riờng hỡnh, m ton b h ta co gión. Tc l, mt
im cú ta x l 2 n v, s l 4 n v khi co gión.
Gi s cn gión 4 ln (h s co gión l 4 ) mt tam giỏc cú nh ngha nh sau:
VERTEX triangleVerts[3]= { 20,50,50,50,20,100};
SHAPE shape1 = {3,triangleVerts};
Thỡ cụng thc co gión mi vertex l :
X2 = X1*scaleFactor;
Y2 = Y1*scaleFactor;
on mó phộp co gión 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<shape1.numVerts;++x)
{
newX shape1.vertices[x].x;
THệ VIEN ẹIEN Tệ TRệẽC TUYEN
KILOBOOKS.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ú cỏc i s l tham chiu n cu trỳc SHAPE v h s co
gión, thỡ h s co gión s nh hn 1. Chỳ ý rng cú th dựng h s co gión khỏc
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 gión, khụng nhn c hỡnh ng dng.
Hỡnh 2.8 biu din vic co gión mt tam giỏc, vi h s co gin trc x bng 1 , v
h s co gión trc y bng 2.
Hỡnh 2.8: Co gión mt tam giỏc vi hai h s co gión khỏc nhau
2.3.3.Phộp Quay:
Quay mt hỡnh thỡ rc ri hn tnh tin hay co gión, vỡ phi dựng n phộp
toỏn phc tp hn, phi tớnh toỏn sin, cosin. Tuy nhiờn õy ta ch ỏp dng cụng
thc quay, m khụng tỡm hiu ti sau, lm gỡ
Hỡnh2.9 biu din vic quay 45 mt tam giỏc quanh gc ta .
THệ VIEN ẹIEN Tệ TRệẽC TUYEN
KILOBOOKS.COM
Gi s cn quay mt tam giỏc 45
0
nh sau :
VERTEX triangleVerts[3]= { 20,50,50,50,20,100};
SHAPE shape1 = {3,triangleVerts};
Cỏc cụng thc sau c ỏp dng cho cỏc vertex trong tam giỏc:
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 giỏc quay sang phn õm ca
trc x. Giỏ tr õm c chp nhn trong ta cỏc, nhng khụng th biu din
lờn mn hỡnh. hin th tam giỏc cn tnh tin nú sang phn dng ca trc x .
Ton b phộp 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;
THệ VIEN ẹIEN Tệ TRệẽC TUYEN
KILOBOOKS.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<shape1.numVerts;++x)
{
newX shape1.vertices[x].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 Rotate( ) nhn tham s l tham chiu n cu trỳc SHAPE v gúc quay().
Cụng vic u tiờn ca nú l i sang radian, do radian l n v o m cỏc hm
sin( ), v hm cosin( ) ca visual c++ yờu cu. Vi gúc quay dng thỡ hỡnh s
quay ngc chiu kim ng h, v ngc li
Cng ging nh cỏc hm Translate( ) v Scale( ), hm Rotate( ) s dng vũng lp
for tớnh ta (x,y) cho tng vertex.
2.4. S Dng Ma Trn Trong Cỏc Phộp Bin Hỡnh:
Mt chng trỡnh ha thng thc hin tt c cỏc phộp tớnh toỏn trờn vertex ca
i tng trc khi th hin i tng ra mn hỡnh. Cú th gi cỏc hm Translate( ),
Scale( ), v Rotate( ) cho cỏc phộp tớnh ny. Tuy nhiờn, vic thc hin nhiu phộp tớnh
THệ VIEN ẹIEN Tệ TRệẽC TUYEN
KILOBOOKS.COM
nh vy cho nhiu vertex s tiêu phí thi gian. ó cng là lý do mà ma trn thng
đc dùng cho các phép bin hình.
Mt ma trn đn giãn là mt bng s sp xp trên các hàng và ct. Ging nh mng
trong lp trình, kích thc ma trn đc đnh ngha trên s hàng và ct mà nó có. ví d
ma trn 3*4 là ma trn có 3 hàng và 4 ct:
4 7 2 4
4 6 7 3
4 5 2 2
Trong chng trình ma trn đc trình bài 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 trình đ ha là có th trình bày nhiu phép bin hình
vi mt ma trn đn. Ngha là mi ma trn đn cha mi giá tr cn thit đ đng thi
dùng trong tnh tin, co giãn và quay mt hình. thc hin điu đó thì cn bit đt
giá tr nào vào ma trn và cn bit phép nhân ma trn.
2.4.1.Các Kiu D Liu Dùng Trong Ha 2-D:
ha 2-D dùng trong ma trn : 1*3 và 3*3.
Ma trn 1*3 là ma trn đc bit , gi là vector. Vector cha các 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 dùng đ đn giãn hóa thao tác ma trn, mt dù
OpenGL đôi khi s dng đt bit giá tr này.Trong hu ht các trng hp, w bng 1.
Ngha là vertex đc biu din bi vector có dng: x, y, z Ma trn 3*3 cha các giá tr
cn thit cho các phép bin hình 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.Các Ma Trn Bin Hình :
Bc đu tiên là cung cp các giá tr thích hp cho ma trn. Giá tr đc dùng và
v trí ca nó trong ma trn ph thuc kiu bin hình.
Ma trn dùng cho phép tnh tin có dng:
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
KILOBOOKS.COM
1 0 0
0 1 0
xTrrans yTrans 1
Vi các bin xTrans và yTrans tng ng là s đn v theo chiu ngang và dc
dùng cho phép tnh tin, (tng t nh khi dùng công thc tnh tin ). Trong chng trình
ma trn này đ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 dùng cho phép co giãn có dng:
XScaleFactor 0 0
0 yScaleFactor 0
0 0 1
Vi các bin xScaleFactor và yScaleFactor tng ng là đ co giãn theo chiu
ngang và dc. Trong chng trình, ma trn này đ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 cùng ma trn dùng cho phép quay có dng :
Cos(radians) sin(radians) 0
-sin(radians) cos(radians) 0
0 0 1
Vi bin radian là góc quay (đn v radian). Trong chng trình, ma trn này đ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 Các Phép Bin Hình :
mc trc, tng phép bin hình đc biu din bng các các ma trn riêng bit.
Tuy nhiên, nh đã nói, có th kt hp nhiu phép bin hình trong mt ma trn.
kt hp hai phép bin hình, ta nhân hai ma trn ca chúng vi nhau Kt hp phép
bin hình tip theo bng cách nhân ma trn ca nó vi ma trn nhn đc phép kt hp
trc. Hình 2.10 biu din các phép bin hình
Mt cách nhìn khác đc biu din hình 2.12, nhng kt qu ca tng phép kt hp các
ma trn không đc th hin .
Ma trn
kt
Các vector
Ca hình
Ma trn
Ma
Ma
Các vector
X
Hình đã đc
bin đi
=
X
X
X
=
Hình đã đc
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
KILOBOOKS.COM
nhân hai ma trn vi nhau, thì s ct trc phi bng s hàng ca ma trn sau.
Nh vy, ta có th nhân hai ma trn 1X3 v ma trn 3X3, hay nhân hai ma trn 3X3
vi nhau .
Hàm sau nhân 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;
}
}
Các tham s ca hàm trên bao gm mt ma trn cha kt qu nhân, và hai ma trn
tham gia phép nhân .Ví d v cách s dng hàm 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 báo ba ma trn 3X3 là m1, m2, m3. Sau đó khi to m1, m2, ri gi
hàm MulMatrix() đ nhân m1 vi m2, và lu tr kt qu trong m3. Do m1 là ma trn đn
v, kt qu cha trong m3 s có cùng giá tr nh trong m2.
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
KILOBOOKS.COM
Ma trn n v i cp n c nh ngha l loi ma trn ng chộo nXm chiu, vi cỏc
phn t ng chộo hỡnh n v:
I [
ik
], vi
ik
= 0 nu i k;
ik
= 1
nu i = k;
Trong lp trỡnh ha, ma trn n v thng c dựng khi to ma trn chớnh
l ma trn dựng kt hp cỏc phộp bin hỡnh. Vic khi to nh vy s chc chn khụng
tn ti giỏ tr l trong ma trn .
2.4.4.Thc Hin Bin Hỡnh:
Sau khi kt hp cỏc phộp bin hỡnh, ta nhn c mt ma trn chớnh cha cỏc giỏ tr
chớnh xỏc cn thit ng thi tnh tin, co gión v quay hỡnh. Cụng vic bin hỡnh bõy
gi ch n gin l nhõn ma trn chớnh vi cỏc vector ca hỡnh (xem hỡnh 2.10,2.11). V
nh vy cn mt hm khụng ch nhõn vector 1X3 vi ma trn 3X3, m nhõn ma trn vi
ton b danh sỏch vector:
Void Transform(SHAPE& shape, MATRIX3X3& m)
{
int transformedX,transformY;
for (int x= 0; x <shape.numverts; ++x)
{
transformX = (int) (shape.vertices[x].x*m[0][0] +
shape.vertices[x].y*m[1][0] + m[2][0]);
transformY = (int) (shape.vertices[x].y*m[0][0] +
shape.vertices[x].x*m[1][0] + m[2][0]);
}
}
Hm trờn cú cỏc i s l tham chiu n cỏc cu trỳc SHAPE v tham chiu n
móng MATRIX3X3.
2.4.5.Mt S Hm Ma Trn Tin ch:
Cú hai hm ma trn tin ớch thng c dựng lm d dng hn vic s dng
ma trn trong lp trỡnh. Chỳng gm:
- Hm khi to ma trn theo ma trn n v:
MATRIX3X m1,m2,m3;
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] = 0; m[2][1] = 0; m[2][2] = 1;
- Hm sao chộp ma trn:
Void intMatrix(MATRIX3X3& m)
{
for (int i=0; i <3; ++i)
for (int j=0; j <3; ++j)
THệ VIEN ẹIEN Tệ TRệẽC TUYEN
KILOBOOKS.COM
dst[i][j] = src [i][j];
}
2.4.6.Các Hàm Bin Hình Dùng Ma Trn:
- Hàm 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);
}
Hàm có đi s là tham chiu đn ma trn chính (cha trng thái hin ti ca phép bin
hình) và các giá tr tnh tin x, y. u tiên, nó to ma trn tnh tin ; Ri nhân ma trn tnh
tin vi ma trn chính, lu kt qu trong ma trn cc b m2; Cui cùng sao chép m2 tr
li ma trn chính.
- Hàm co giãn:
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);
}
- Hàm 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;
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
KILOBOOKS.COM
MultMatrix(m2,m1,m);
CopyMatrix(m,m2);
}
Hàm quay có các đi s là tham chiu đn ma trn chính và góc quay(đ). u tiên
nó kim tra góc quay có bng không hay không. Nu góc quay bng không, hàm kt thúc
đ loi tr, li chia cho 0. Nu khác không, hàm đi đ ra radians và tính sin, cosin. Tip
theo, Rotate khi to ma trn quay, nhân nó vi ma trn chính, lu kt qu vào ma trn
cc b m2. Cui cùng, sao chép m2 tr li ma trn chính.
Bây gi ta đã có mt b hàm dùng ma trn. Hãy xét cách dùng chúng trong
bin hình đ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 tiên đon mã khai báo mt ma trn bin hình 3X3 là m. Sau đó gi hàm
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 hàm Translate( ) kt hp m vi ma trn tnh tin cha các giá tr 10 và
15. Matrn bin hình m s là:
1.0000000000000 0.0000000000000 0.0000000000000
0.0000000000000 1.0000000000000 0.0000000000000
10.0000000000000 15.0000000000000 1.0000000000000
Sau khi gi hàm Scale( ), m cha các giá tr ca phép tnh tin và co giãn:
1.0000000000000 0.0000000000000 0.0000000000000
0.0000000000000 0.5000000000000 0.0000000000000
10.0000000000000 15.0000000000000 1.0000000000000
Cui cùng sau li gi hàm Rotate( ), m cha đy đ các phép tnh tin và quay:
0.35355339055702 0.3535533906295 0.0000000000000
-o.35355339062953 0.35355339055702 0.0000000000000
10.000000000000 15.000000000000 1.0000000000000
Li gi hàm Translate() áp dng ma trn cho mt vertex ca shape1. Sau đó
Drawshape() v hình đã bin hình lên màn hình.
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
KILOBOOKS.COM
Chng 3: Ha Ba Chiu GDI
Trong chng này, chúng ta s tìm hiu:
- H ta đ đ các ba chiu.
- nh ngha vertex cho đi tng 3-D.
- Phép chiu song song và phép chiu phi cnh.
- Chuyn đng đi tng 3-D.
3.1.H Ta Ba Chiu:
Mt đi tng ba chiu thì không th biu din trong h ta đ hai chiu ch gm hai
trc x và y. to h ta đ mi, ta ch đn gin thêm mt trc z vào mt phng đ các,
đ bin đi thành hình khi. Mt dù các 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 vào và ra màn
hình. ó là hng trc logic cho nhiu chng trình, xut phát t vic trc x và y chy
theo các phng tng ng vi ta đ màn hình.
3.2 .nh Ngha i Tng Ba Chiu:
Vic to mt hình hai chiu ch đn gin là đnh ngha tp vertex ca nó, ri nói các
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 xác đnh vic nói các vertex đ hình thành đúng đi
tng yêu cu. Do đó, đi vi chúng, không ch đnh ngha các vertex, mà còn phi đnh
ngha các cnh. Mt đi tng 3-D đc xây dng trên các vertex và cnh đc gi là
mt mô hình khung li (wireframe model).
đnh ngha mt mô hình khung li cn danh sách các vertex và cnh. Do đó, hin
nhiên là cn mt s kiu d liu mi.
-Trc tiên 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 thúc, sau đó ni chúng
li vi nhau. Kiu d liu đnh ngha cnh nh sau:
Typedef struct edge
{
UINT vertex1,vertex2;
}EDGE;
Vi vertex1 là đim xut phát cnh, và vertex2 cui.
- Kiu d liu ca mô hình khung li nh sau:
Typedef struct model
{
UINE numverts;
VERTEX* vertices;
UINE numEdges;
EDGE*edges;
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
KILOBOOKS.COM
}MODEL;
Nh vy, cu trúc MODEL bao gm hai s nguyên không du cha vertex và cnh
đi tng, mt con tr ch đn kiu d liu VERTEX cha đa ch ca danh sách vertex,
và m con tr ch đn kiu d liu EDGE cha đa ch ca danh sách cnh.
Hình 3.1Hình khi:
S dng các kiu d liu trên cho khi vuông,
vi s th t các đnh nh hình 3.1. Ta đ các
đ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 sách 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 màn hình .
Các ta đ dùng đnh ngha mt mô hình khung li, nh trong cu trúc cubeverts
trên, thì đc xem là các ta đ cc b. Ta đ cc b tr thành ta đ th gii khi
chng trình s dng các phép tnh tin co giãn hoc quay v bin mô hình. Cui cùng,
chng trình đ ha bin đi các ta đ th gii thành ta đ màn hình đ có th th hin
mô hình lên màn hình.
Danh sách cnh ca khi vuông trên 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,
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN