Tài liệu Bài giảng Tạo bóng vật thể 3D: CHNG VIII 
TO BÓNG VT TH 3D 
8.1. KHÁI NIM 
 Khi biu din các i tng 3 chiu, mt y	u t không th b
 qua  tng tính thc 
c
a i tng ó là to bóng sáng cho vt th.  thc hin c iu này, chúng ta 
cn phi ln lt tìm hiu các dng ngun sáng có trong t nhiên, cng nh các tính 
cht c trng khác nhau c
a mi loi ngun sáng. T ó a ra các gii pháp k thut 
khác nhau nhm th hin s tác ng c
a các ngun sáng khác nhau lên i tng. 
8.2. NGUN SÁNG XUNG QUANH 
 Ánh sáng xung quanh là mc sáng trung bình, tn ti trong mt vùng không gian. 
Mt không gian lý tng là không gian mà ti ó mi vt u c cung cp mt 
lng ánh sáng lên b mt là nh nhau, t mi phía  mi ni. Thông th ng ánh sáng 
xung quanh c xác !nh v"i mt mc c# th gi là mc sáng xung quanh c
a vùng 
không gian mà vt th ó c ng#, sau ó ta cng v"i c ng  sáng có c t các 
ngun sáng khác  có c c ng  sáng cui cùng lên mt im hay mt mt c...
                
              
                                            
                                
            
 
            
                 18 trang
18 trang | 
Chia sẻ: hunglv | Lượt xem: 1312 | Lượt tải: 0 
              
            Bạn đang xem nội dung tài liệu Bài giảng Tạo bóng vật thể 3D, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
CHNG VIII 
TO BÓNG VT TH 3D 
8.1. KHÁI NIM 
 Khi biu din các i tng 3 chiu, mt y	u t không th b
 qua  tng tính thc 
c
a i tng ó là to bóng sáng cho vt th.  thc hin c iu này, chúng ta 
cn phi ln lt tìm hiu các dng ngun sáng có trong t nhiên, cng nh các tính 
cht c trng khác nhau c
a mi loi ngun sáng. T ó a ra các gii pháp k thut 
khác nhau nhm th hin s tác ng c
a các ngun sáng khác nhau lên i tng. 
8.2. NGUN SÁNG XUNG QUANH 
 Ánh sáng xung quanh là mc sáng trung bình, tn ti trong mt vùng không gian. 
Mt không gian lý tng là không gian mà ti ó mi vt u c cung cp mt 
lng ánh sáng lên b mt là nh nhau, t mi phía  mi ni. Thông th ng ánh sáng 
xung quanh c xác !nh v"i mt mc c# th gi là mc sáng xung quanh c
a vùng 
không gian mà vt th ó c ng#, sau ó ta cng v"i c ng  sáng có c t các 
ngun sáng khác  có c c ng  sáng cui cùng lên mt im hay mt mt c
a 
vt th. 
Ánh sáng t"i 
Ánh sáng phn 
x 
Ánh sáng phn x 
Ánh sáng t"i 
Vector pháp tuy	n c
a mt 
Hình 8.1. S phn x ca ánh sáng 
Chng VIII. To bóng v	t th
 3D 
105 
8.3. NGUN SÁNG NH H
NG 
 Ngun sáng !nh h"ng ging nh nh$ng gì mà mt tr i cung cp cho chúng ta. Nó 
bao gm mt tp các tia sáng song song, bt k c ng  c
a chúng có ging nhau hay 
không. Có hai loi k	t qu c
a ánh sáng !nh h"ng khi chúng chi	u 	n b mt là: 
khuy	ch tán và phn chi	u. N	u b mt phn x toàn b (ging nh mt gng) thì các 
tia phn x s% có h"ng ngc v"i h"ng c
a góc t"i (Hình 8.1). Trong tr ng hp 
ngc li, n	u b mt là không phn x toàn phn (có  nhám, xù xì) thì mt phn 
các tia sáng s% b! to i các h"ng khác hay b! hp th#, phn còn li thì phn x li, và 
lng ánh sáng phn x li này t& l v"i góc t"i. ' ây chúng ta s% quan tâm 	n hin 
tng phn x không toàn phn vì ây là hin tng ph( bi	n (vì ch) có nh$ng i 
tng c cu to t nh$ng mt nh mt gng m"i xy ra hin tng phn x toàn 
phn), và ng th i tìm cách tính c ng  c
a ánh sáng phn x trên b mt. 
 Trong hình 8.2 th hin s phn x ánh sáng không toàn phn.  m nét c
a các 
tia ánh sáng t"i th hin c ng  sáng cao,  mnh c
a các tia phn x th hin 
c ng  sáng thp. Nói chung, khi b mt là không phn x toàn phn thì c ng  
c
a ánh sáng phn x (hay tm gi là tia phn x) luôn bé hn so v"i c ng  c
a ánh 
sáng t"i (hay gi là tia t"i), và c ng  c
a tia phn x còn t& l v"i góc gi$a tia t"i 
v"i vector pháp tuy	n c
a b mt, n	u góc này càng nh
 thì c ng  phn x càng 
cao (hình II.2 (a)), n	u góc này l"n thì c ng  phn x rt thp (hình II.2 (b)). ' ây 
ta ch) quan tâm 	n thành phn ánh sáng khuy	ch tán và tm b
 qua hin tng phn 
Ánh sáng phn 
x 
Ánh sáng t"i 
Vector pháp tuy	n c
a mt 
Hình 8.2. S phn x không toàn phn ca ánh sáng 
Ánh sáng phn x 
Ánh sáng t"i 
Vector pháp tuy	n c
a mt 
(a) (b) 
Chng VIII. To bóng v	t th
 3D 
106 
x toàn phn.  cho tin trong vic tính toán ta tm (i h"ng c
a tia t"i thc s, vy 
bây gi h"ng c
a tia t"i c xem là h"ng ngc li c
a tia sáng t"i. 
 N	u gi * là góc gi$a tia t"i v"i vector pháp tuy	n c
a b mt thì Cos(*) ph# thuc 
vào tia t"i a và vector pháp tuy	n c
a mt n theo công thc: 
         
na
na
Cos
.
.
)( =θ   (8.1) 
 Trong công thc trên Cos(*) bng tích vô h"ng c
a a và n chia cho tích  l"n c
a 
chúng. N	u ta ã chu+n hoá  l"n c
a các vector a và n v 1 t tr"c thì ta có th 
tính giá tr! trên mt cách nhanh chóng nh sau: 
Cos() = tích vô hng ca a và n = a.x*n.x+a.y*n.y+a.z*n.z 
 Vì Cos(*) có giá tr! t +1 	n -1 nên ta có th suy ra công thc tính c ng  c
a 
ánh sáng phn x là: 
Cng  ánh sáng phn x = Cng  ca ánh sáng nh hng * [(Cos()+1)/2] (8.2) 
Trong ó [(Cos(*)+1)/2] có giá tr! trong khong t 0 	n 1. Vy qua công thc (8.1) và 
(8.2) chúng ta có th tính c c ng  c
a ánh sáng phn x trên b mt khi bi	t 
c c ng  c
a ánh sáng !nh h"ng cng nh các vector pháp tuy	n c
a mt và 
tia t"i. 
Cài t thu	t toán 
 D"i ây là phn trình bày các th
 t#c ph#c v# cho vic v% i tng 3D c li, 
theo thut toán chn lc mt sau có tính 	n vn  chi	u sáng c
a ngun sáng xung 
quanh và ngun sáng !nh h"ng. 
Function Cuong_Do_Anh_Sang_Dinh_Huong(v,n:Vector3D):real; 
{Th tc tính c	ng 
 ánh sáng phn x trên b m
t ca 
a giác khi bit 
c tia ti 
v và vector pháp tuyn n} 
var s,t:real; 
begin 
 s:=sqrt(v.x*v.x+v.y*v.y+v.z*v.z)*sqrt(n.x*n.x+n.y*n.y+n.z*n.z); 
 {Gán S bng tích ca |v|*|n|} 
Chng VIII. To bóng v	t th
 3D 
107 
 if s=0 then {Mt trong hai vector bng 0 do 
ó tm xem c	ng 
 sáng bng 1} 
 begin Cuong_Do_Anh_Sang_Dinh_Huong:=1;end 
 else 
 Begin t:=tich_vo_huong(v,n); {Tính tích vô hng ca v và n} 
 If t>0 then {N	u góc gi$a v và n nm trong khong t 0 	n 90  thì} 
 Cuong_Do_Anh_Sang_Dinh_Huong:=(T/s) 
 else 
 Cuong_Do_Anh_Sang_Dinh_Huong:=0; 
 end; 
end; 
Procedure DrawObj_FilterRearFace(Obj:Obj3D; Canvas:TCanvas; 
 Width,Height:integer; 
 Zoom:real; 
 AnhSangNen,AnhSangDinhHuong:real; 
 VectorChieuSang:vector3D; V:Vector3D); 
{V 
i tng 3D 
c li theo thut toán chn lc m
t sau có tính 
n vn 
 chiu 
sáng ca ngun sáng xung quanh và ngun sáng 
nh hng. 
Trong 
ó: 
 + Obj: cha 
i tng 3D cn v 
 + Canvas: Vi v (hay vùng 
m khung) 
 + Width, Height: Kích thc ca Canvas 
 + Zooom: H s t l khi v 
i tng (Hay h s thu phóng) 
 + V: Vector hng nhìn. Nu Obj 
ã 
c chuyn sang h to 
 quan sát O’UVN 
thì V=(0,0,-1) 
 + AnhSangNen: Giá tr c	ng 
 ca ánh sáng xung quanh mà 
i tng có th thu 
nhn 
c 
+ AnhSangDinhHuong: Giá tr c	ng 
 ca ánh sáng 
nh hng mà 
i 
tng có th thu nhn 
c 
 *Chú ý: AnhSangNen + AnhSangDinhHuong <=1.  
ây ta xem tng c	ng 
ca các ngun sáng to ra gii hn trong khong 0..1. T 
ó chúng ta có th 
iu 
ch nh c	ng 
 chiu sáng ca các ngun sáng bng cách t!ng h s c	ng 
 ca nó 
song v"n phi luôn luôn tho mãn tng ca chúng nh# hn hay bng 1. Khi mt m
t 
Chng VIII. To bóng v	t th
 3D 
108 
nhn 
c tng c	ng 
 sáng là 1 t các ngun sáng khác nhau cung cp thì m
t s 
cho màu thc ca nó. Nu tng c	ng 
 sáng mà nó thu 
c t các ngun sáng nh# 
hn 1 m
t s hi ti 
i. 
 + VectorChieuSang: $ây là vector biu di%n tia ti (chú ý nó có hng ngc vi 
hng ca ánh sáng chiu ti nh 
ã nói trong phn lý thuyt} 
Var i,k,P,cx,cy:integer; 
Poly:array of TPoint; 
CuongDoSang:Real; 
R,G,B:byte; 
Begin 
cx:=Width div 2;cy:=Height div 2; 
For k:=0 to Obj.SoMat-1 do 
 if Tich_vo_huong(v,Obj.Mat[K].PhapVT)>= 0 then 
 begin 
 {Thit lp 
a giác là hình chiu ca m
t xung m
t ph&ng OXY (có tnh tin và 
i 
hng trc Y)} 
 setlength(Poly,Obj.Mat[K].Sodinh); 
 For i:=0 to Obj.Mat[K].Sodinh -1 do 
 begin 
 P:=Obj.Mat[K].list[i]; 
 Poly[i].X:=round(Obj.dinh[P].x*zoom)+cx; 
 Poly[i].Y:=-round(Obj.dinh[P].y*zoom)+cy; 
{To 
 ca 
 nh sau khi chiu là (Obj.dinh[P].x,Obj.dinh[P].y), song 
c bin 
i t l vi h s là zoom ri 
i hng trc Y và tnh tin theo 
vector (cx,cy)} 
 end; 
{Tính c	ng 
 sáng mà m
t nhn 
c: bng tng c	ng 
 sáng do ngun 
sáng xung quanh (ánh sáng nn) và ngun sáng 
nh hng cung cp} 
CuongDoSang:=AnhSangNen + AnhSangDinhHuong * 
Cuong_Do_Anh_Sang_Dinh_Huong(VectorChieuSang,Obj.Mat[K].PhapVT); 
Chng VIII. To bóng v	t th
 3D 
109 
{ 
ây c	ng 
 sáng mà m
t nhn 
c do ngun sáng 
nh hng cung cp 
ph thuc không ch vào c	ng 
 sáng mà ngun phát ra, mà còn ph thuc 
vào hng 
ón ánh sáng ca m
t và 
c biu di%n b'i biu thc: 
AnhSangDinhHuon*Cuong_Do_Anh_Sang_Dinh_Huong(VectorChieuSang,Ob
j.Mat[K].PhapVT)} 
 R:=round(Obj.Mat[K].Color.R*CuongDoSang); 
 G:=round(Obj.Mat[K].Color.G*CuongDoSang); 
 B:=round(Obj.Mat[K].Color.B*CuongDoSang); 
{Thit lp màu s(c cho m
t bng cách: ly c	ng 
 màu s(c m
t 
nh ca m
t 
Obj.Mat[K].Color, nhân vi c	ng 
 sáng mà nó nhn 
c trong thc t tính 
toán 
c CuongDoSang. T 
ó ta thy, nu m
t nhn 
c 
y 
 ánh sáng 
(c	ng 
 sáng =1) thì m
t s có màu m
t 
nh ca nó (xác 
nh khi thit k 
i tng), ngc li thì m
t s có màu s(c ti hn. Nu m
t không 
c chiu 
sáng t các ngun sáng (c	ng 
 sáng =0) thì m
t s có màu 
en} 
canvas.Brush.Color :=rgb(R,G,B); 
 Canvas.Pen.Color:=canvas.Brush.Color; 
Canvas.Polygon(poly); 
{v 
a giác vi màu s(c 
ã 
c xác 
nh trc b'i bút tô (Brush.Color) và bút 
v (Pen.Color)} 
 end; 
setlength(poly,0); 
end; 
8.4. NGUN SÁNG IM 
 Ngun sáng !nh h"ng là tng ng v"i ngun sáng im t  vô tn. Nhng 
khi ngun sáng im c mang 	n gn i tng thì các tia sáng t nó phát ra không 
còn song song n$a mà c to ra theo mi h"ng theo dng hình cu. Vì th	, các tia 
sáng s% ri xung các im trên b mt d"i các góc khác nhau. Gi s, vector pháp 
tuy	n c
a mt là n=(xn, yn, zn), im ang xét có to  là (x0, y0, z0) và ngun sáng 
im có ta  là (plx, ply, plz) thì ánh sáng s% ri 	n im ang sét theo vector (x0-
plx, y0-ply, z0-plz), hay tia t"i: 
a = (plx - x0, ply - y0,plz - z0). 
Chng VIII. To bóng v	t th
 3D 
110 
 T ó c ng  sáng ti im ang xét s% ph# thuc vào Cos(*) gi$a n và a nh ã 
trình bày trong phn ngun sáng !nh h"ng. 
 Vy v"i ngun sáng !nh h"ng, chúng ta cn tính tia t"i cho mi im trên mt, t 
ó k	t hp v"i vector pháp tuy	n c
a mt  tính c c ng  sáng ti im ó, n	u 
tính toán trc ti	p thì có th mt khá nhiu th i gian do phi tính vector a và tính 
Cos(*) thông qua công thc (8.1) v"i tt c các im trên mt. Nên nh" rng trong tình 
h"ng ngun sáng im thì chúng ta buc lòng phi tính Cos(*) thông qua công thc 
(8.1) vì vector a s% thay (i khi mt hay ngun sáng thay (i (tr khi mt t-nh, song 
n	u mt t-nh và ngun sáng c !nh thì suy ra chúng ta ch) cn tính c ng  sáng 
mt ln). 
8.5. MÔ HÌNH BÓNG GOURAUD 
 Mô hình bóng Gouraud là mt phng pháp v% bóng, to cho i tng 3D có hình 
dáng cong có mt cái nhìn có tính thc hn. Phng pháp này t c s trên thc t	 
sau: i v"i các i tng 3D có b mt cong thì ng i ta th ng xp s) b mt cong 
c
a i tng bng nhiu mt a giác ph.ng, ví d# nh mt mt cu có th sp s) bi 
mt tp các mt a giác ph.ng có kích th"c nh
 s/p x	p li, khi s a giác xp x) tng 
lên (có ngh-a là din tích mt a giác nh
 li) thì tính thc c
a mt cu s% tng, s% cho 
ta cm giác mt cu trông tròn tr!a hn, m!n và cong hn. Tuy nhiên, khi s a giác 
xp x) mt mt cong tng thì khi lng tính toán và lu tr$ cng tng theo t& l thun 
theo s mt, iu ó d0n 	n tc  thc hin s% tr nên chm chp hn. Chúng ta hãy 
th, v"i mt ví d# sau:  mô ph
ng mt mt cu ng i ta xp x) nó bi 200 mt thì 
cho ta mt cm giác hi g gh, nhng v"i 450 mt thì ta thy nó m!n và tròn tr!a hn, 
song khi s mt là 16200 thì cho ta cm giác hình cu rt tròn và m!n (hình 8.3). Tuy 
hình nh mt cu v"i 16200 mt a giác thì m!n hn so v"i 200 mt, song lng tính 
toán phi thc hin trên mi a giác cng tng lên gp 16200/200= 81 ln. 
 Song vn  v0n còn ny sinh mt khi ta phóng l"n hay thu nh
 vt th. N	u ta 
phóng l"n thì rõ ràng là các a giác cng c phóng l"n theo cùng t& l, d0n 	n hình 
nh v các mt a giác li hin rõ và gây ra cm giác không c trn m!n. Ngc li, 
khi ta thu nh
 thì n	u s a giác xp x) l"n thì s% d0n 	n tình trng các a giác quá 
nh
, chng cht lên nhau không cn thi	t. 
Chng VIII. To bóng v	t th
 3D 
111 
200 mt 450 mt 16200 mt 
Hình 8.3 
  gii quy	t vn  trên, chúng ta có th ti	n hành theo phng pháp tô bóng 
Gouraud. Mô hình bóng Gouraud to cho i tng mt cái nhìn ging nh là nó có 
nhiu mt a giác bng cách v% mi mt không ch) v"i mt c ng  sáng mà v% v"i 
nhiu c ng  sáng khác nhau trên các vùng khác nhau, làm cho mt ph.ng nom nh 
b! cong. Bi thc cht ta cm nhn c  cong c
a các mt cong do hiu ng ánh 
sáng khi chi	u lên mt, ti các im trên mt cong s% có pháp vector khác nhau nên s% 
ón nhn và phn x ánh sáng khác nhau, t ó chúng ta s% cm nhn c các  
sáng khác nhau trên cùng mt mt cong. 
 Tô bóng th ng Tô bóng theo Gouraud 
Hình 8.4 
 Th ng thì mi mt a giác có mt vector pháp tuy	n, và nh phn trên ã trình 
bày, vector pháp tuy	n ó c dùng  tính c ng  c
a ánh sáng phn x trên b 
mt c
a a giác t ó suy ra c ng  sáng c
a mt. Tuy nhiên mô hình Gouraud li 
xem mt a giác không ch) có mt vector pháp tuy	n, mà mi )nh c
a mt a giác li 
có mt vector pháp tuy	n khác nhau, và t vector pháp tuy	n c
a các )nh chúng ta s% 
ni suy ra c vector pháp tuy	n c
a tng im trên mt a giác, t ó tính c 
c ng  sáng c
a im. Nh th	, các im trên cùng mt mt c
a a giác s% có c ng 
 sáng khác nhau và cho ta cm giác mt a giác không phi là mt phng mà là mt 
cong. 
Chng VIII. To bóng v	t th
 3D 
112 
Hình 8.5 
 Thc cht thì mi mt a giác ch) có mt vector pháp tuy	n, song phng pháp 
Gouraud tính toán vector trung bình ti mi )nh c
a a giác bng cách: ly trung bình 
cng các vector pháp tuy	n c
a các a giác có cha )nh ang xét. 
 Vic ni suy vector pháp tuy	n c
a tng im trên mt a giác c thc hin 
tng t nh vic ni suy  sâu trong gii thut “vùng m  sâu” ã c trình bày 
trong chng tr"c. 
Cài t thu	t toán 
 D"i ây là phn trình bày các th
 t#c ph#c v# cho vic v% i tng 3D c li và 
cong, theo thut toán chn lc mt sau có tính 	n vn  chi	u sáng c
a ngun sáng 
xung quanh và ngun sáng !nh h"ng, song mi a giác s% c tô bóng theo phng 
pháp Gouraud. 
{B/t u phn khai báo ph#c v# cho gii thut tô a giác theo phng pháp Gouraud} 
Type NutPolyGourand=record {1 
 nh ca 
a giác chiu (là nh ca m
t 
a giác xung m
t ph&ng OXY} 
 N:Vector3D; {Pháp vector ti 1 
 nh ca 
a giác} 
 x,y:Integer; {To 
 ca 
 nh} 
 end; 
Vector trung bình cng bng trung 
bình cng c
a các vector pháp 
tuy	n ln cn 
Chng VIII. To bóng v	t th
 3D 
113 
 PolygonGourand =array of NutPolyGourand; 
 {mng 
ng dùng 
 cha các 
 nh ca 
a giác chiu} 
 CanhCat=record {Mt cnh ca 
a giác 
c to ra nhm phc v cho 
 quá trình tính giao 
im nhanh} 
 y1,y2:Integer; 
 xGiao:real; 
 XStep:real; 
 NGiao:Vector3D; {Pháp vector ti 
 nh, song nó s 
c cha pháp 
 vector tai giao 
im vi 
	ng quét} 
 NStep:Vector3D; {
 bin thiên ca Pháp vector khi di chuyn dc 
 theo cnh, m)i ln y thay 
i 1 
n v thì pháp 
 vector thay 
i mt lng là NStep} 
 end; 
 DanhSachCanhCat=array of CanhCat; 
 GiaoDiem=record {Cu trúc cha giao 
im ca 
	ng quét ngang 
 vi cnh 
a giác chiu } 
 x,y:Integer; {To 
 giao 
im} 
 NGiao:Vector3D; {Pháp vector ti giao 
im} 
 ChiSoCanh:integer; {Ch s cnh 
ã to ra giao 
im} 
 end; 
 DanhsachGiaoDiem=array of GiaoDiem; 
Procedure DrawObjGouraud_FilterRearFace(Obj:Obj3D; 
 Canvas:TCanvas;Width,Height:integer;Zoom:real; 
 AnhSangNen,AnhSangDinhHuong:real; 
 VectorChieuSang:vector3D;V:Vector3D); 
{V 
i tng 3D 
c li và cong} 
Var i,j,k,Dem,P,Q,cx,cy:integer; 
 Poly:PolygonGourand; 
 DinhLinkMat:array of Record {Cha Danh sách các m
t có liên kt 
n mt 
inh} 
 SoMat:Integer; 
Chng VIII. To bóng v	t th
 3D 
114 
 A:array of integer; 
 end; 
 CMLD:array of integer; {S m
t có liên kt vi 
 nh th i} 
begin 
cx:=Width div 2;cy:=Height div 2; 
Setlength(DinhLinkMat,Obj.Sodinh); 
Setlength(CMLD,Obj.Sodinh); 
For i:=0 to obj.Sodinh-1 do CMLD[i]:=0; 
{Xác 
nh m)i 
 nh có bao nhiêu m
t liên kt 
n} 
For i:=0 to obj.SoMat -1 do 
 For j:=0 to obj.mat[i].Sodinh-1 do 
 begin 
 K:=obj.mat[i].List[j]; 
 CMLD[k]:=CMLD[k]+1; {S m
t liên kt 
n 
 nh th k 
c t!ng lên 
 khi có mt m
t có liên kt 
n nó } 
 end; 
{Thit lp danh sách các m!t liên kt 
n tng 
 nh ca 
i tng} 
For i:=0 to obj.Sodinh-1 do 
 begin 
 setlength(DinhLinkMat[i].A,CMLD[i]); {S m
t liên kt vi 
 nh i 
 là CMLD[i]} 
 DinhLinkMat[i].SoMat:=0; 
 end; 
{Quá trình xác 
nh rõ nh*ng m
t nào liên kt vi 
 nh i} 
For i:=0 to obj.SoMat -1 do 
 For j:=0 to obj.mat[i].Sodinh-1 do 
 begin 
 K:=obj.mat[i].List[j]; 
 Dem:=DinhLinkMat[K].SoMat; 
 DinhLinkMat[K].A[Dem]:=i; 
 DinhLinkMat[K].SoMat:=DinhLinkMat[K].SoMat+1; 
 end; 
Chng VIII. To bóng v	t th
 3D 
115 
Setlength(CMLD,0); 
For k:=0 to Obj.SoMat-1 do 
 if Tich_vo_huong(v,Obj.Mat[K].PhapVT)>= 0 then 
 begin 
 setlength(Poly,Obj.Mat[K].Sodinh); 
 For i:=0 to Obj.Mat[K].Sodinh -1 do 
 begin 
 {thit lp các thuc tính ca 
 nh th i ca Poly (
a giác chiu) } 
 P:=Obj.Mat[K].list[i]; 
 Poly[i].X:=round(Obj.dinh[P].x*zoom)+cx; 
 Poly[i].Y:=-round(Obj.dinh[P].y*zoom)+cy; 
 {Tính Vector pháp tuyn ti 
 nh Poly bng cách tính tng ca các 
 vector pháp tuyn ca các m
t có liên kt vi 
 nh 
ó} 
 Poly[i].N.x :=0;Poly[i].N.y :=0;Poly[i].N.z :=0; 
 For j:=0 to DinhLinkMat[P].SoMat-1 do 
 begin 
 Q:=DinhLinkMat[P].A[j];//Mat ke voi dinh P 
 Poly[i].N.x:=Poly[i].N.x+obj.Mat[Q].PhapVT.x; 
 Poly[i].N.y:=Poly[i].N.y+obj.Mat[Q].PhapVT.y; 
 Poly[i].N.z:=Poly[i].N.z+obj.Mat[Q].PhapVT.z; 
 end; 
 end; 
 FillPolygonGourand(poly,VectorChieuSang,AnhSangNen, 
 AnhSangDinhHuong,CanVas,Obj.Mat[K].Color); 
{Tô 
a giác Poly theo thut toán tô 
a giác theo dòng quét, song có ni suy vector 
pháp tuyn cho m)i 
im, và tính c	ng 
 sáng ca m)i 
im trong 
a giác da vào 
vector pháp tuyn ti 
im 
ó.} 
 end; 
setlength(poly,0); 
For i:=0 to obj.Sodinh-1 do 
 setlength(DinhLinkMat[i].A,0); 
Setlength(DinhLinkMat,0); 
Chng VIII. To bóng v	t th
 3D 
116 
end; 
Procedure FillPolygonGourand(Poly:PolygonGourand; 
 Vector_Chieu_Sang:Vector3D; 
 Anh_Sang_Nen,Anh_Sang_Chieu:real; 
 Canvas:TCanvas;Color:RGBColor); 
{Tô 
a giác Poly theo thut toán tô 
a giác theo dòng quét, song có ni suy vector 
pháp tuyn cho m)i 
im, và tính c	ng 
 sáng ca m)i 
im trong 
a giác da vào 
vector pháp tuyn ti 
im 
ó. 
Th tc này tng t nh th tc tô 
a giác theo thut toán Z-Buffer song thay vì ni 
suy 
 sâu z ca m)i 
im, thì th tc này s ni suy pháp vector ca m)i 
im, ri 
da vào pháp vector ca 
im 
ó mà tính ra c	ng 
 sáng mà nó có 
c do ngun 
sáng 
nh hng cung cp.} 
var L,H,ND,NG,i,j,Y,MaxY,MinY:integer; 
{L,H:Gioi han chi so cua mang Poly 
 ND: So phan tu cua mang D:DanhSachCanhCat 
 NG:So phan tu cua mang G:DanhsachGiaoDiem} 
D:DanhSachCanhCat; 
G:DanhsachGiaoDiem; 
Procedure TaoDanhSachCanhCat; 
Var i,d1,d2,Dem,Kc,Cuoi:integer; 
begin 
 If (Poly[L].xPoly[H].x)or(Poly[L].yPoly[H].y) then 
 begin 
 ND:=H-L+1; 
 setlength(D,ND); 
 Cuoi:=H; 
 end 
else 
 begin 
 ND:=H-L; 
 setlength(D,ND); 
 Cuoi:=H-1; 
Chng VIII. To bóng v	t th
 3D 
117 
 end; 
Dem:=0; 
For i:=L to Cuoi do 
 begin 
 If i<H then j:=i+1 else j:=L; 
 If Poly[i].y<=Poly[j].y then 
 begin d1:=i;d2:=j end 
 else 
 begin d1:=j;d2:=i end; 
 D[dem].y1:=Poly[d1].y;D[dem].y2:=Poly[d2].y; 
 D[dem].xGiao:=Poly[d1].x; 
 D[dem].NGiao:=Poly[d1].N; 
 Kc:=(Poly[d2].y-Poly[d1].y); 
 If Kc0 then 
 begin 
 D[dem].XStep:=(Poly[d2].x-Poly[d1].x)/Kc; 
 D[dem].NStep.x:=(Poly[d2].N.x-Poly[d1].N.x)/Kc; 
 D[dem].NStep.y:=(Poly[d2].N.y-Poly[d1].N.y)/Kc; 
 D[dem].NStep.z:=(Poly[d2].N.z-Poly[d1].N.z)/Kc; 
 end 
 else 
 begin 
 D[dem].XStep:=0; 
 D[dem].NStep.x:=0; 
 D[dem].NStep.y:=0; 
 D[dem].NStep.z:=0; 
 end; 
 Dem:=Dem+1; 
 end; 
end; 
Procedure TaoDanhSachGiaoDiem; 
Var i,Dy:integer; 
Chng VIII. To bóng v	t th
 3D 
118 
begin 
Setlength(G,ND); 
NG:=0; 
for i:=0 to ND -1 do 
 begin 
 If (D[i].y1<=y)and(y<=D[i].y2) then 
 begin 
 Dy:=y-D[i].y1; 
 G[NG].x:=round(D[i].xGiao+D[i].XStep*Dy); 
 G[NG].y:=y; 
 G[NG].NGiao.x:=D[i].NGiao.x+D[i].NStep.x*Dy; 
 G[NG].NGiao.y:=D[i].NGiao.y+D[i].NStep.y*Dy; 
 G[NG].NGiao.z:=D[i].NGiao.z+D[i].NStep.z*Dy; 
 G[NG].ChiSoCanh:=i; 
 NG:=NG+1; 
 end; 
 end; 
end; 
Procedure SapXepVaLoc; 
Var i,j,C1,C2:integer; 
Tg:GiaoDiem; 
begin 
 for i:=0 to NG-2 do 
 For j:=i+1 to NG-1 do 
 If G[i].x>G[j].x then 
 begin 
 Tg:=G[i];G[i]:=G[j];G[j]:=Tg; 
 end; 
 i:=0; 
 {Khu nhung Giao Diem thua} 
 While i<(NG-2) do 
 begin 
Chng VIII. To bóng v	t th
 3D 
119 
 If G[i].x=G[i+1].x then //Trung nhau 
 begin 
 C1:=G[i].ChiSoCanh; 
 C2:=G[i+1].ChiSoCanh; 
 If ((D[C1].y1D[C2].y1)and(D[C1].y2D[C2].y2)) 
 or (D[C1].y1=D[C1].y2)or(D[C2].y1=D[C2].y2) then 
 //Xoa bo bot 1 giao diem 
 begin 
 For j:=i to NG-2 do G[j]:=G[j+1]; 
 NG:=NG-1; 
 end; 
 end; 
 i:=i+1; 
 end; 
end; 
Procedure ToMauCacDoan; 
Var i,x,K:integer;CuongDoSang,Dx,Dy,Dz:real; 
Re,Gr,Bl,Cd:byte; 
begin 
 If Red then Re:=1 else Re:=0; 
 If Green then Gr:=1 else Gr:=0; 
 If Blue then Bl:=1 else Bl:=0; 
 i:=0; 
 While i<NG-1 do 
 begin 
 K:=G[i+1].x - G[i].x; 
 If k0 then 
 begin 
 Dx:=(G[i+1].NGiao.x-G[i].NGiao.x)/K; 
 Dy:=(G[i+1].NGiao.y-G[i].NGiao.y)/K; 
 Dz:=(G[i+1].NGiao.z-G[i].NGiao.z)/K; 
 end 
Chng VIII. To bóng v	t th
 3D 
120 
 else 
 begin 
 Dx:=0;Dy:=0;Dz:=0; 
 end; 
 For x:=G[i].x to G[i+1].x do 
 begin 
 CuongDoSang:=Anh_Sang_Nen + Anh_Sang_Chieu* 
 Cuong_Do_Anh_Sang_Dinh_Huong(Vector_Chieu_Sang, 
 G[i].NGiao); 
{C	ng 
 sáng ti m)i 
im 
c tính bng tng ca cng  ánh sáng 
nn cng vi c	ng 
 có 
c t ngun sáng nh hng, song 
 tính 
c c	ng 
 sáng có 
c t ngun 
ng hng cung cp thì chúng ta 
da vào tia ti (Vector_Chieu_Sang) và pháp vector ca 
im 
G[i].Ngiao.} 
 Cd:=round(255*CuongDoSang); 
 Canvas.Pixels[x,G[i].y]:=rgb(Cd*Re,Cd*Gr,Cd*Bl); 
 {Ni suy pháp vector c
a im ti	p theo và gán vào G[i].NGiao} 
 G[i].NGiao.x:=G[i].NGiao.x+dx; 
 G[i].NGiao.y:=G[i].NGiao.y+dy; 
 G[i].NGiao.z:=G[i].NGiao.z+dz; 
 end; 
 i:=i+2; 
 end; 
end; 
Begin 
 L:=low(Poly); H:=High(Poly); 
 MaxY:=Poly[L].y;MinY:=MaxY; 
 For i:=L+1 to H do 
 if MaxY<Poly[i].y then MaxY:=Poly[i].y 
 else If MinY>Poly[i].y then MinY:=Poly[i].y; 
 TaoDanhSachCanhCat; 
 For y:=MinY to MaxY do 
Chng VIII. To bóng v	t th
 3D 
121 
 begin 
 TaoDanhSachGiaoDiem; 
 SapXepVaLoc; 
 ToMauCacDoan; 
 end; 
 Setlength(D,0); 
 Setlength(G,0); 
end; 
BÀI TP 
1. Xây dng mt chng trình cho phép quan sát vt th 3D c li. Chng trình cho 
phép thay (i v! trí quan sát, cho phép th hin tác ng c
a các ngun sáng xung 
quanh và !nh h"ng lên i tng. 
 Nâng cao: Cho thép thay (i c ng  c
a các ngun sáng, cng nh thay (i 
h"ng chi	u c
a ngun sáng !nh h"ng. 
2. Hãy xây dng chng trình v"i các chc nng nh Bài 1 song s, d#ng phng pháp 
tô bóng Gouraud. 
3. Hãy t(ng hp các ki	n thc ã bi	t  xây dng mt chng trình mô ph
ng th	 
gi"i thc trong ó có nhiu i tng khác nhau vn ng. 
            Các file đính kèm theo tài liệu này:
 _giaotrinhlythuyetdohoach8.pdf _giaotrinhlythuyetdohoach8.pdf