Bài giảng Tạo bóng vật thể 3D

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  t ng tính th c c a i tng ó là to bóng sáng cho vt th.  th c 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...

pdf18 trang | Chia sẻ: hunglv | Lượt xem: 1120 | Lượt tải: 0download
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  t ng tính th c c a i tng ó là to bóng sáng cho vt th.  th c 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 th c 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 {M t 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 i u 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 m t 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 n n) 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 thu c không ch vào c ng sáng mà ngun phát ra, mà còn ph thu c 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 tr c 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 th c hn. Phng pháp này t c s trên th c 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) t ng lên (có ngh-a là din tích mt a giác nh li) thì tính th c c a mt cu s% t ng, 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 t ng thì khi lng tính toán và lu tr$ cng t ng theo t& l thun theo s mt, iu ó d0n  n tc  th c 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 th c hin trên mi a giác cng t ng 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 th c 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 Th c 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 th c 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 {M t 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 m t 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 m t 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ó m t 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 thu c 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ó n i 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ó n i 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ì n i suy sâu z ca m)i im, thì th tc này s n i 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 c ng 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 d ng 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 d ng chng trình v"i các chc n ng 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 d ng mt chng trình mô ph ng th gi"i th c trong ó có nhiu i tng khác nhau vn ng.

Các file đính kèm theo tài liệu này:

  • pdf_giaotrinhlythuyetdohoach8.pdf