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 |
Chia sẻ: hunglv | Lượt xem: 1183 | 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