CHƯƠNG VIII
TO BÓNG VT TH 3D
8.1. KHÁI NIM
Khi biu din các đối tượng 3 chiu, mt yếu t không th b qua để tăng tính thc
ca đối tượng đó là to bóng sáng cho vt th. Để thc hin được điu này, chúng ta
cn phi ln lượt tìm hiu các dng ngun sáng có trong t nhiên, cũng như các tính
cht đặc trưng khác nhau ca 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 ca các ngun sáng khác nhau lên đối tượng.
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ý tưởng là không gian mà ti đó mi vt đều được cung cp mt
lượng ánh sáng lên b mt là như nhau, t mi phía mi nơi. Thông thường ánh sáng
xung quanh được xác định vi mt mc c th gi là mc sáng xung quanh ca vùng
không gian mà vt th đó cư ng, sau đó ta cng vi cường độ sáng có được t các
ngun sáng khác đểđưc cường độ sáng cui cùng lên mt đim hay mt mt ca
vt th.
Ánh sáng phn Ánh sáng ti
Ánh sáng phn x
Vector
p
p
tu
y
ến ca mt
Ánh sáng ti
Hình 8.1. S phn x ca ánh sáng
Chương VIII. To bóng vt th 3D
8.3. NGUN SÁNG ĐỊNH HƯỚNG
Ngun sáng định hướng ging như nhng gì mà mt tri cung cp cho chúng ta. Nó
bao gm mt tp các tia sáng song song, bt k cường độ ca chúng có ging nhau hay
không. Có hai loi kết qu ca á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 gương) thì các
tia phn x s có hướng ngược vi hướng ca góc ti (Hình 8.1). Trong trưng hp
ngược 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à
lượng ánh sáng phn x li này t l vi góc ti. đây chúng ta s quan tâm đến hin
tượng phn x không toàn phn vì đây là hin tượng ph biến (vì ch có nhng đối
tượng được cu to t nhng mt như mt gương mi xy ra hin tượng phn x toàn
phn), và đồng thi tìm cách tính cường độ ca ánh sáng phn x trên b mt.
Vector pháp tuyến ca mt
Vector pháp tuyến ca mt
Ánh sáng phn Ánh sáng ti
Ánh sáng phn x Ánh sáng ti
(a) (b)
Hình 8.2. S phn x không toàn phn ca ánh sáng
Trong hình 8.2 th hin s phn x ánh sáng không toàn phn. Độ đậm nét ca các
tia ánh sáng ti th hin cưng độ sáng cao, độ mnh ca 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 độ
ca ánh sáng phn x (hay tm gi là tia phn x) luôn bé hơn so vi cường độ ca ánh
sáng ti (hay gi là tia ti), và cường độ ca tia phn x còn t l vi góc gia tia ti
vi vector pháp tuyến ca 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 ln 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 tượng phn
105
Chương VIII. To bóng vt th 3D
x toàn phn. Để cho tin trong vic tính toán ta tm đổi hướng ca tia ti thc s, vy
bây gi hướng ca tia ti được xem là hướng ngược li ca tia sáng ti.
Nếu gi θ là góc gia tia ti vi vector pháp tuyến ca b mt thì Cos(θ) ph thuc
vào tia ti a và vector pháp tuyến ca mt n theo công thc:
na
na
Cos .
.
)( =
θ
(8.1)
Trong công thc trên Cos(θ) bng tích vô hướng ca a và n chia cho tích độ ln ca
chúng. Nếu ta đã chun hoá độ ln ca 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ô hướng ca an = a.x*n.x+a.y*n.y+a.z*n.z
Cos(θ) có giá tr t +1 đến -1 nên ta có th suy ra công thc tính cường độ ca
ánh sáng phn x là:
Cường độ ánh sáng phn x = Cường độ ca ánh sáng định hướng * [(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 độ ca ánh sáng phn x trên b mt khi biết
được cường độ ca ánh sáng định hưng cũng như các vector pháp tuyến ca mt và
tia ti.
Cài đặt thut toán
Dưới đây là phn trình bày các th tc phc v cho vic v đối tượng 3D đặc li,
theo thut toán chn lc mt sau có tính đến vn đề chiếu sáng ca 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 mt ca đa giác khi biết được tia ti
v và vector pháp tuyến 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|}
106
Chương VIII. To bóng vt th 3D
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ô hướng ca v và n}
If t>0 then {Nếu góc gia 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 tượng 3D đặc li theo thut toán chn lc mt sau có tính đến vn đề chiếu
sáng ca ngun sáng xung quanh và ngun sáng định hướng.
Trong đó:
+ Obj: cha đối tượng 3D cn v
+ Canvas: Vi v (hay vùng đệm khung)
+ Width, Height: Kích thước ca Canvas
+ Zooom: H s t l khi v đối tượng (Hay h s thu phóng)
+ V: Vector hướng nhìn. Nếu 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 tượng có th thu
nhn được
+ AnhSangDinhHuong: Giá tr cường độ ca ánh sáng định hướng mà đối
tượng 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
chnh cường độ chiếu sáng ca các ngun sáng bng cách tăng h s cường độ ca nó
song vn phi luôn luôn tho mãn tng ca chúng nh hơn hay bng 1. Khi mt mt
107
Chương VIII. To bóng vt th 3D
nhn được tng cường độ sáng là 1 t các ngun sáng khác nhau cung cp thì mt s
cho màu thc ca nó. Nếu tng cường độ sáng mà nó thu được t các ngun sáng nh
hơn 1 mt s hơi ti đi.
+ VectorChieuSang: Đây là vector biu din tia ti (chú ý nó có hướng ngược vi
hướng ca ánh sáng chiếu ti như đã nói trong phn lý thuyết}
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
{Thiết lp đa giác là hình chiếu ca mt xung mt phng OXY (có tnh tiến và đổi
hướng 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 chiếu là (Obj.dinh[P].x,Obj.dinh[P].y), song
được biến đổi t l vi h s là zoom ri đổi hướng trc Y và tnh tiến theo
vector (cx,cy)}
end;
{Tính cường độ sáng mà mt nhn được: bng tng cường độ sáng do ngun
sáng xung quanh (ánh sáng nn) và ngun sáng định hướng cung cp}
CuongDoSang:=AnhSangNen + AnhSangDinhHuong *
Cuong_Do_Anh_Sang_Dinh_Huong(VectorChieuSang,Obj.Mat[K].PhapVT);
108