V. Mô hình bóng Gouraud
V.1. Căi đặt thuật toân
Dưới đđy lă phần trình băy câc thủ tục phục vụ cho việc vẽ đối tượng 3D đặclồivăcong,theothuậttoânchọnlọcmặtsaucótínhđếnvấn đềchiếusângcủa nguồn sâng xung quanh vă nguồn sâng định hướng xong mỗi đa giâc sẽ được tô bóngtheophươngphâpGouraud.
{Bắtđầuphầnkhaibâophụcvụcho giảithuật tôđagiâctheo phươngphâp
Gouraud}
NutPolyGourand=record {1 đỉnh của đa giâc chiếu (lă ảnh của mặt đa giâcxuốngmặtphẳngOXY}
N:Vector3D; {Phâpvectortại1đỉnhcủađagiâc} x,y:Integer; {Toạđộcủađỉnh}
end;
PolygonGourand=arrayofNutPolyGourand; {mảng động dùng để chứa câc đỉnh của đa giâc chiếu}
CanhCat=record {Một cạnh của đa giâcđược tạo ra nhằm phục vụchoquâtrìnhtínhgiaođiểmnhanh}
y1,y2:Integer; xGiao:real; XStep:real;
NGiao:Vector3D; {Phâp vector tại đỉnh, song nó sẽ được chứa phâpvectortaigiaođiểmvớiđườngquĩt} NStep:Vector3D; {độ biến thiín của Phâp vector khi di chuyển
dọc theo cạnh, mỗi lần y thay đổi 1 đơn vị thì phâpvectorthayđổimộtlượnglăNStep}
end;
DanhSachCanhCat=arrayofCanhCat;
GiaoDiem=record {Cấu trúc chứa giao điểm của đường quĩt ngangvớicạnhđagiâcchiếu}
Trang134
Chương 8: Các mô hình chiê
úu sáng - Nguyễn Hữu Tài
x,y:Integer; {Toạđộgiaođiểm}
NGiao:Vector3D; {Phâpvectortạigiaođiểm} ChiSoCanh:integer; {Chỉsốcạnhđêtạoragiao điểm} end; DanhsachGiaoDiem=array ofGiaoDiem; Procedure DrawObjGouraud_FilterRearFace(Obj:Obj3D;Canvas:TCanvas;Width,Height:inte ger;Zoom:real; AnhSangNen,AnhSangDinhHuong:real;VectorChieuSang:vector3D;V:Vector3D); {Vẽđốitượng3Dđặclồivăcong}
Vari,j,k,Dem,P,Q,cx,cy:integer; Poly:PolygonGourand;
DinhLinkMat:arrayofRecord {Chứa Danh sâch câc mặt có liín kết đến một đinh}
SoMat:Integer; A:arrayofinteger; end;
begin
cx:=Width div2;cy:=Heightdiv2; Setlength(DinhLinkMat,Obj.Sodinh); Setlength(CMLD,Obj.Sodinh);
Fori:=0toobj.Sodinh-1 doCMLD[i]:=0;
{Xâcđịnhmỗiđỉnhcóbaonhiíumặtliínkếtđến} Fori:=0toobj.SoMat-1do
Forj:=0toobj.mat[i].Sodinh-1do begin
K:=obj.mat[i].List[j];
CMLD[k]:=CMLD[k]+1; {Số mặt liín kết đến đỉnh thứ k được tăng lín khicómộtmặtcóliínkếtđếnnó}
end;
{Thiếtlậpdanhsâchcâcmătliínkếtđếntừngđỉnhcủađốitượng} Fori:=0toobj.Sodinh-1do
begin
setlength(DinhLinkMat[i].A,CMLD[i]); {Số mặt liín kết với đỉnh i lă CMLD[i]}
DinhLinkMat[i].SoMat:=0; end;
{Quâtrìnhxâcđịnhrõnhữngmặtnăo liínkếtvới đỉnhi} Fori:=0toobj.SoMat-1do
Trang135
Chương 8: Các mô hình chiê
úu sáng - Nguyễn Hữu Tài
Forj:=0toobj.mat[i].Sodinh-1do begin K:=obj.mat[i].List[j]; Dem:=DinhLinkMat[K].SoMat; DinhLinkMat[K].A[Dem]:=i; DinhLinkMat[K].SoMat:=DinhLinkMat[K].SoMat+1; end; Setlength(CMLD,0); Fork:=0toObj.SoMat-1do
ifTich_vo_huong(v,Obj.Mat[K].PhapVT)>= 0then {Nếumặtlăkhảkiến} begin
setlength(Poly,Obj.Mat[K].Sodinh); Fori:=0toObj.Mat[K].Sodinh-1do
begin
{thiếtlậpcâcthuộc tínhcủađỉnhthứicủaPoly(đagiâcchiếu)} 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 tuyến tại đỉnh Poly bằng câch tính tổng của câc vectorphâptuyếncủacâcmặtcóliínkếtvới đỉnhđó}
Poly[i].N.x:=0;Poly[i].N.y:=0;Poly[i].N.z:=0; Forj:=0toDinhLinkMat[P].SoMat-1do
begin
Q:=DinhLinkMat[P].A[j];//MatkevoidinhP 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,C anVas,Obj.Mat[K].Color);
{TôđagiâcPolytheothuậttoântô đagiâc theodòngquĩt, songcónộisuyvector phâp tuyến cho mỗi điểm,vă tính cường độ sâng củamỗi điểm trong đagiâc dựa văovectorphâptuyếntạiđiểmđó.}
end;
setlength(poly,0);
Fori:=0toobj.Sodinh-1do
setlength(DinhLinkMat[i].A,0); Setlength(DinhLinkMat,0); end; Procedure FillPolygonGourand(Poly:PolygonGourand;Vector_Chieu_Sang:Vector3D; Trang136
Chương 8: Các mô hình chiê
úu sáng - Nguyễn Hữu Tài
Anh_Sang_Nen,Anh_Sang_Chieu:real;Canvas:TCanvas;Color:RGBColor);
{TôđagiâcPolytheothuậttoântô đagiâc theodòngquĩt, songcónộisuyvector phâp tuyến cho mỗi điểm,vă tính cường độ sâng củamỗi điểm trong đagiâc dựa văovectorphâptuyếntạiđiểmđó.
Thủ tực năy tươngtự như thủtục tô đagiâc theothuật toân Z-Buffer song thay vì nội suy độ sđu z của mỗi điểm, thì thủ tục năy sẽ nội suy phâp vector của mỗi điểm, rồi dựa văo phâp vector của điểm đó mă tính ra cường độ sâng mă nó có được donguồnsângđịnhhướngcungcấp.}
varL,H,ND,NG,i,j,Y,MaxY,MinY:integer; {L,H:GioihanchisocuamangPoly
ND:SophantucuamangD:DanhSachCanhCat NG:SophantucuamangG:DanhsachGiaoDiem} D:DanhSachCanhCat; G:DanhsachGiaoDiem; ProcedureTaoDanhSachCanhCat; Vari,d1,d2,Dem,Kc,Cuoi:integer; begin If(Poly[L].x<>Poly[H].x)or(Poly[L].y<>Poly[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; end; Dem:=0;
Fori:=LtoCuoido begin
Ifi<Hthenj:=i+1elsej:=L; IfPoly[i].y<=Poly[j].ythen
begind1:=i;d2:=jend else
begind1:=j;d2:=iend;
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); IfKc<>0then Trang137
Chương 8: Các mô hình chiê
úu sáng - Nguyễn Hữu Tài
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; ProcedureTaoDanhSachGiaoDiem; Vari,Dy:integer; begin Setlength(G,ND);
NG:=0; fori:=0toND-1do 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; ProcedureSapXepVaLoc; Vari,j,C1,C2:integer; Tg:GiaoDiem; begin fori:=0toNG-2do Forj:=i+1toNG-1 do IfG[i].x>G[j].xthen begin Tg:=G[i];G[i]:=G[j];G[j]:=Tg; end; Trang138
Chương 8: Các mô hình chiê
úu sáng - Nguyễn Hữu Tài
i:=0;
{KhunhungGiaoDiemthua} Whilei<(NG-2)do
begin
IfG[i].x=G[i+1].xthen//Trungnhau
beginC1:=G[i].ChiSoCanh;C2:=G[i+1].ChiSoCanh; If((D[C1].y1<>D[C2].y1)and(D[C1].y2<>D[C2].y2))or
(D[C1].y1=D[C1].y2)or(D[C2].y1=D[C2].y2)then //Xoabobot1giaodiem
begin Forj:=itoNG-2doG[j]:=G[j+1]; NG:=NG-1; end; end; i:=i+1; end; end; ProcedureToMauCacDoan; Vari,x,K:integer;CuongDoSang,Dx,Dy,Dz:real;
Re,Gr,Bl,Cd:byte; begin
IfRed thenRe:=1else Re:=0; IfGreenthenGr:=1elseGr:=0; IfBluethenBl:=1elseBl:=0; i:=0; Whilei<NG-1do begin K:=G[i+1].x-G[i].x; Ifk<>0 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 else begin Dx:=0;Dy:=0;Dz:=0; end;
Forx:=G[i].x toG[i+1].xdo begin
CuongDoSang:=Anh_Sang_Nen+Anh_Sang_Chieu* Cuong_Do_Anh_Sang_Dinh_Huong(Vector_Chieu_Sang,G[i].NGiao);
{Cườngđộ sângtại mỗi điểm được tính bằng tổngcủa cường độ ânh sâng nềncộngvớicườngđộcóđược từ nguồn sâng định hướng,song để tínhđượccường độsângcóđược từnguồnđịnghướng cungcấpthì
Trang139
Chương 8: Các mô hình chiê
úu sáng - Nguyễn Hữu Tài
chúngtadựavăotiatới(Vector_Chieu_Sang)vă phâpvectorcủađiểm G[i].Ngiao.}
Cd:=round(255*CuongDoSang);
Canvas.Pixels[x,G[i].y]:=rgb(Cd*Re,Cd*Gr,Cd*Bl);
{NộisuyphâpvectorcủađiểmtiếptheovăgânvăoG[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; Fori:=L+1toHdo
ifMaxY<Poly[i].y then MaxY:=Poly[i].y else IfMinY>Poly[i].ythen MinY:=Poly[i].y; TaoDanhSachCanhCat; Fory:=MinYtoMaxY do
begin TaoDanhSachGiaoDiem; SapXepVaLoc; ToMauCacDoan; end; Setlength(D,0); Setlength(G,0); end;
VI. Băi tậpcuối chương
Băi 1: Xđy dựng một chương trìnhcho phĩp quan sât vậtthể 3D đặc lồi.Chương trình cho phĩp thay đổi vị trí quan sât,cho phĩp thể hiện tâcđộng của câcnguồn sângxungquanh văđịnhhướnglínđốitượng.
Nđng cao: Chothĩp thayđổi cường độ của câc nguồn sâng,cũng như thay đổihướngchiếucủanguồnsângđịnhhướng.
Băi 2: Hêy xđy dựng chương trình với câc chức năng như Băi 1 song sử dụng phươngphâptôbóngGouraud.
Băi3:Hêytổnghợpcâckiếnthứcđêbiếtđểxđydựngmột chươngtrìnhmôphỏng thếgiớithựctrongđócó nhiềuđốitượngkhâcnhauvậnđộng.
Trang140
Chương 8: Các mô hình chiê
Trang141
Mục Lục
Ch
ươngI: Câcyếut ốcơsởc ủ ađồho ạ...2
I. Câckhâiniệmcơbản...2
I.1. Thi ếtbịđồho ạvăđ iểmảnh(Pixel)...2
I.2. Đ iểmvăĐ oạnthẳngtrongmặtphẳng...2
II. Câcthuậttoânvẽđ oạnth ẳng...3
II.1. Vẽđ oạnthẳngdựavăophươngtrình...3
II.2. Vẽđ oạnthẳngdựavăothuậttoânBresenham...5
II.2.a. TómtắtthuậttoânBresenham:...9
II.2.b. Víd ụ :...9
II.2.c. Hướngdẫnchocâctrườnghợphệs ốgócngoăikhoảng[0,1]...11
II.2.d. Căiđặtthuậttoân...12
III. Câcthuậttoânvẽđườngtròn...12
III.1. ThuậttoânvẽđườngtrònMidPoint...13
III.1.a. TómtắtthuậttoânvẽđườngtrònMidPoint:...15
III.1.b. Căiđặt...16
III.2.a. TómtắtthuậttoânvẽđườngtrònBresenham:...18
III.2.b. Căiđặt...19
IV. ThuậttoânvẽEllipse...19
IV.1. ThuậttoânBresenhamchovẽhìnhEllipse...20
IV.1.a. TómtắtthuậttoânBresenhamchovẽEllipse:...22
IV.1.b. CăiđặtthuậttoânBresenhamchodựngEllipse...23
V. Băitậpcu ố ichương...25
Ch ươngII: Câchệmău&cơchết ổchứcb ộnhớCardmănhình...26
I. Đ ôinĩtvềcấutrúcmănhìnhmău...26
II. Câchệmău...28
II.1. HệRGB...28
II.2. HệmăuCMY...29
II.3. HệmăuHSV...30
III. Cơchết ổchứcb ộnhớCardmănhình...35
III.1. Cơchếhoạtđộ ngc ủ achếđộmănhình320x200x256mău...35
III.1.a. Căiđặt...36
III.2. Cơchếhoạtđộ ngc ủ amănhìnhtheochuẩnVesa...49
Ch ươngIII: Câcphĩpxĩnhình&tômău...50
I. Tr ườnghợpFlăm ộ ttậphữuhạnđ iểm...51
II. Tr ườnghợpxĩnm ộ tđ oạnthẳngvăom ộ tvùnghìnhchữnhậtc ủ aR2...51
II.1. Khicóm ộ tcạnhc ủ ahìnhchữnhậtsongsongvớitr ụ ctoạđộ...51
II.1.a. ThuậttoânCohen-Sutherland...52
II.1.a.i. Kếtthúcgiảithuật...55
II.1.a.ii. Sauđ đylăm ộ thămtínhmê...55
II.1.a.iii. Căiđặtthuậttoân...56
II.1.b. ThuậttoânChianhịphđn...56
II.1.b.i. Căiđặtthuậttoân...57
II.1.c. ThuậttoânLiang-Barsky...57
II.1.c.i. Căiđặtthuậttoân...58
II.2. Khi1cạnhc ủ ahìnhchữnh ậttạovớitr ụ choănhm ộ tgócα:...58
Trang142 Chương 8: Các mô hình chiê úu sáng - Nguyễn Hữu Tài III. Clipping ộ tm đ agiâcvăom ộ tvùnghìnhchữnhật...59
III.1. Gi ảithuậtSutherland–Hodgman...59
III.1.a. Căiđặtthuậttoân...60
III.1.b. Nh ượcđ iểmthuật ảgi iSutherland-Hodgmanvăcâchkhắcph ục...60
IV. M ộ ts ốthuậttoântômău...60
IV.1. Gi ảithuậtvếtdầuloang...60
IV.1.a. Ph ươngphâpđệquy...61
IV.1.a.i. Căiđặtthuậttoân...62
IV.1.b. Ph ươngphâpkhôngđệquy...63
IV.1.b.i. Căiđặtthuậttoân...63
IV.2. Thuậttoântômăuđ agiâctheodòngquĩt(Scan-lineAlgorithm)...65
IV.2.a. Căiđặtthuậttoân...68
V. Băitậpcu ố ichương...68
Ch ươngIV: Câcphĩpbiếnđổ ihìnhh ọc...69
I. Câcphĩpbiếnđổ iAffine2D(2-chiều)...69
I.1. Phĩptị nhti ến...69
I.2. Phĩp ngđồ dạng...70
I.3. Phĩp iđố xứng...70
I.5. Phĩpbiếndạng(Twist Transformation)...71
I.6. Toạđộthuầnnhất(HomogeneousCoordinates)...71
I.7. T ổ nghợpcâcphĩpbiếnđổ iAffine...71
I.8. Phĩpquayquanhđ iểmbấtk ỳ...73
I.9. Câcvíd ụminhh ọ a...73
I.9.a. Víd ụ1:...73
I.9.b. Víd ụ2:...74
I.10. Bi ến iđổ hệtr ụ ct ọ ađộ(haybiếnđổ ing ược)...75
I.11. Căiđặt...77
II. Câcphĩpbiếnđổ iAffine3D...77
II.1. Câchệtr ụ ct ọ ađộ...77
II.2. Câccôngthứcbiếnđổ i...78
II.2.a. Phĩptị nhti ến...78
II.2.b. Phĩpbiếnđổitỉlệ...78
II.2.c. Phĩp iđố xứng...78
II.2.d. Phĩpquay...79
III. Câcphĩpchiếuvậtthểtrongkhônggianlínmặtphẳng...79
III.1. Phĩpchiếuph ố icảnh(Perspective)...79
III.2. Phĩpchiếusongsong...81
IV. Quansâtvậtthể3D&Quayhệquansât...81
IV.1. Phĩpchiếuph ố icảnh...85
IV.2. Phĩpchiếusongsong...85
IV.3. Căiđặt...86
IV.4. Víd ụminhh ọa...86
V. Băitậpcu ố ichương...86
Ch ươ ngV: Câcphươngphâpdựngđườngcongvămặtcong...87
I. ĐườngcongBezier&mặtcongBezier...87
I.1. ThuậttoândeCasteljau:...88
I.2. DạngBERNSTEINc ủ acâcđườngcongBEZIER...88
I.3. Dạngbiểudiễnmatrậnc ủ ađườngBezier...89
I.4. Câctínhchấtc ủ ađườngcongBEZIER...90
Trang143 Chương 8: Các mô hình chiê úu sáng - Nguyễn Hữu Tài I.4.a. N ộ isuyđượccâcđ iểmđầ uvăđ iểmcu ố i:...90
I.4.b. TínhbấtbiếnAffine:...90
I.4.c. Tínhchấtc ủ abaol ồi...91
I.4.d. Độchínhxâctuyếntính:...91
I.4.e. Bấtbiếnvớinh ữngphĩpbiếnđổ iAffine:...92
I.4.f. Đạohămc ủ acâcđườngBezier:...92
I.5. Đ ânhgiâcâcđườngcongBezier&sựkhâcbiệtc ủ acâcđườngcongSpline: 92 II. ĐườngcongSplinevăB-Spline:...93
Ch ươngVI: MôhìnhWireFrame...96
I. MôhìnhWireframe:...97
II. Vẽhìnhdựatríndữli ệukiểuWireFramevớicâcphĩpchiếu...99
II.1. Phĩpchiếutr ựcgiaođơngi ản...99
II.2. Phĩpchiếuph ố icảnhđơngiản...99
II.2.a. Căiđặtthuậttoân...100
III. Băitậpcu ố ichương...103
Ch ươngVII: Môhìnhcâcmặtđ agiâc&Vấnđềkhửmặtkhuất...106
I.1. Cấutrúcvậtthểbằngmôhình"câc m ặ tđ a giâc"...106
II. Câcphươngphâpkhửmặtkhuất...109
II.1. Gi ảithuậtng ườithợsơnvăsắpxếptheochiềusđu(Depth-Sorting)...109
II.2. Thuậttoânchọ nl ọ cmặtsau...112
II.3. Thuậttoânvùngđệmđộsđu(Z-Buffer)...114
II.3.a. Căiđặtminhhoạchothuậttoân“vùngđệmđộsđu”...116
III. Băitậpcu ố ichương...123
Ch ươngVIII: Câcmôhìnhchiếusâng...125
I. Khâiniệm...125
II. Nguồ nsângxungquanh...125
III. Nguồ nsângđịnhhướng...125
III.1. Căiđặtthuậttoân...127
IV. Nguồ nsângđ iểm...129
V. MôhìnhbóngGouraud...130
V.1. Căiđặtthuậttoân...134
VI. Băitậpcu ố ichương...140
M ụ c ụ cL ... 142