Câc phương phâp khử mặt khuất

Một phần của tài liệu giáo trình lý thuyết đồ họa (Trang 113 - 129)

II.1. Giải thuậtngười thợsơnsắp xếptheo chiềusđu(Depth- Sorting)

Người thợ sơn (hay Depth-sorting) lă tín của một thuật giải đơn giảnnhất trong số câc thuật toân vẽ ảnh thực 3 chiều. Nếu để ý người thợ sơn lăm việc, chúngta sẽ thấyanh tasơn bứctranh từtrong rangoăi, vớicâccảnhvậttừ xađến gần. Chúngtacó thểâpdụng mộtcâch tươngtựđể vẽcâcđa giâc trongdanhsâch câcđa giâc. Song cómột vấn đề cầnphảichọnlựa, đólămột đa giâc tồntạitrong không gian 3 chiều có tới 3 bốn đỉnh, vă những đỉnh năy có thể có câc giâ trị z ( giâ trịđộsđu ) khâcnhau.Chúng tasẽ khôngbiết chọngiâ trị năotrong số chúng.

Trang109

Chương 7: Mô hình các mặt đa giác & Vâ

ún đề khử mặt khuất - Nguyễn Hữu Tài

Từnhữngkinhnghiệmtrong thựctế,ngườita chorằngnín sửdụng giâtrịztrung bìnhsẽchokếtquảtốttronghầuhếtcâctrườnghợp.

sau đóvẽ câcmặt từxa trước, rồivẽ câcmặt ở gần sau,như thếthì câcmặt ở gần sẽ không bịche khuất bởicâc mặtở xa,mă chỉcó câc mặt ở xa mới có thểbị câc mặt ở gần che khuất, do câc mặt ở gần vẽ sau nín có thể được vẽ chồng lín hình ảnhcủacâcmặtxa.

Như vậy, thuật giải Depth-Sorting được thực hiện một câch dễ dăng khi chúngta xâc địnhmột giâtrị độsđu (lă giâtrị ztrong hệ toạ độ quansât) đại diện cho cả mặt.Câc mặtdựavăo độsđuđạidiệncủamìnhđể so sânhrồisắpxếp theo một danh sâch giảm dần (theo độ sđu đại diện). Bướctiếp theo lă vẽ câc mặt lín mặtphẳngtheothứtựtrongdanhsâch.

Giảithuậtcònmộtsốvướngmắcsau:

Khihaimặtlăcắtnhauthìthuậtgiải năychỉthểhiệnnhưchúngchồnglín nhau.

Hìnhảnhthật Khivẽbằnggiảithuậttrín

(HìnhII.1)

Khi hai mặt lă ở trong cùng một khoảng không gian về độ sđu vă hình chiếu của chúng lín mặt phẳng chiếu lă chồng lín nhau (hay chồng một phần lín nhau).Vídụ:

MặtB Mắtnhìn

MặtA

(HìnhII.2)

Từnhững vídụ trín chúngtacó thểthấy rằng,có nhữngtrường hợpcâcđa giâc được sắp xếp sai dẫn đến kết quả hiển thị không đúng. Liệu chúng ta có thể

Trang110

Chương 7: Mô hình các mặt đa giác & Vâ

ún đề khử mặt khuất - Nguyễn Hữu Tài

khắc phục được vấn đề năy không? Cđu trả lời dĩ nhiín lă được nhưng cũng có nghĩa lăchúngtasẽ phảixử lýthímrấtnhiều câctrườnghợpvă lămtăngđộ phức

tạptínhtoân.

PhĩpkiểmtraphầnkĩodăiZ

Phĩp kiểm tra năy nhằm xâc địnhphần kĩo dăi zcủa haiđa giâc có gối lín nhau hay không? Nếu câc phần kĩo dăi Z lă gối lín nhau rấtcó thể câc đa giâc năy cần được hoân đổi. Vì thế phĩp kiểm tra tiếp theophải đượcthựchiện.

PhĩpkiểmtraphầnkĩodăiX

Phĩp kiểm tra năy tương tựnhư phĩp kiểmtra trước, nhưngnósẽ kiểm tra phần kĩo dăiX của hai đa giâc có gối lín nhau hay không? Nếu có, thì rất có thể câc đa giâc năy cần được hoân đổi. Vì thế phĩp kiểm tra tiếptheophảiđượcthựchiện.

PhĩpkiểmtraphầnkĩodăiY

Phĩp kiểm tra năy kiểm tra phần kĩo dăi Y của hai đa giâc có gối lín nhau hay không? Nếu có, thì rất có thể câc đa giâc năy cần được hoân đổi.Vìthếphĩpkiểmtratiếptheophảiđượcthựchiện.

Phĩpkiểmtracạnhxa

Giả sử A vă B lă haiđa giâc măsau khisắp xếp theo độsđu trung bình thì A đứng trước B. Song qua 3 phĩp kiểm tra trín mă vẫn không xâc định được liệu trật tự trín lă đúng hay chưa. Lúc năy chúng phải tiến hănh phĩp kiểmtra cạnh xa. Phĩpkiểm tra cạnh xa nhằm xâc địnhxem đa giâcB cónằmphíasaucạnhxa củađa giâcA haykhông?Nếu cóthì trậttựnăylăđúng,ngượclạithìphảiquabướckiểmtra tiếptheo.

Để kiểmtra đa giâcB có nằmsaucạnhxa của đa giâcA haykhông, chúng ta thực hiện việc kiểm tra mỗi đỉnh của đa giâc B. Nếu câc đỉnh năy đều nằm về cùng một phía của đa giâc A theo chiều trục Z hay không,nếuđúngthìkếtquảtrậttựtrínlăđúng.Ngượclại, cóthểxảyra một trong hai tình huống như hình (II.1) vă (II.2), để xâc định được ta phảitiếptụcsangbướckiểmtratiếptheo.

Phĩpkiểmtracạnhgần

Phĩp kiểm tra cạnh gần nhằm xâcđịnh xem đa giâc A có nằmphía sau cạnhgần củađagiâc Bhaykhông? Nếucó thìtrậttựxâcđịnhtrướcđđy khôngđúng,chúngta cầnphảihoânđổilạitrậttự.Ngược lạithì rõrăng hai đa giâc đang cắt nhau (như hình II.1) hoặc chĩo văo nhau, lúc năy chúngta phảitiếnhănh chia nhỏhai đagiâc A văB thănh 3(hoặc 4)đa giâc con,đườngchiacắtchính lăđườnggiao cắtcủa2đagiâc.Sauphĩp chia chúngtatiếnhănhsắpxếplạicâcđagiâccon.

Trang111

Chương 7: Mô hình các mặt đa giác & Vâ

ún đề khử mặt khuất - Nguyễn Hữu T

II.2. Thuậttoân chọnlọc mặtsau

SẽrấtđơngiảnnếutadùngVectorphâptuyếnđểkhửcâcmặtkhuấtcủa mộtđốitượng3Dđặcvălồi.Tasẽtínhgócgiữa vĩctơhướngnhìnVvăphâp vectorNcủamặt,nếugócnăylălớnhơn90othìmặtlăkhôngnhìnthấy (bịkhuất), ngượclạithìmặtlăkhảkiến.

Dấucủatíchvôhướngcủa2vector lădươngnếugócgiữachúngnhỏhơn haybằng90o.Vậythuậttoân đểxĩtmộtmặtbịkhuấthaykhôngchỉđơngiảnlă:

If V.N>= 0 then Mặt thấy

Else Mặtkhông thấy(mặt khuất)

Mắtnhìn

α Vectorhướngnhìn

Vìα<90onínmặt quansâtđược

Trang112

Chương 7: Mô hình các mặt đa giác & Vâ

ún đề khử mặt khuất - Nguyễn Hữu T

II.2.1Căiđặtminhhoạchothuậttoân chọnlọc mặtsau

Function Tich_vo_huong(v,n:Vector3D):real; {Tínhtíchvôhướngcủa2vector}

Begin

Tich_vo_huong:=v.x*n.x+v.y*n.y+v.z*n.z; End;

ProcedureDrawObj_FilterRearFace(Obj:Obj3D;Canvas:TCanvas; Width,Height:integer; Zoom:real;V:Vector3D);

{Vẽđốitượngtheothuậttoânchọnlọcmặtsau. Trongđó:

+Obj:chứađốitượng3Dcầnvẽ

+Canvas:Vảivẽ(hayvùngđệmkhung) +Width,Height:KíchthướccủaCanvas

+Zooom:Hệsốtỷlệkhivẽđốitượng(Hayhệsốthuphóng)

+ V: Vector hướng nhìn.NếuObj đêđược chuyểnsang hệ toạđộ quansât O’UVN thìV=(0,0,-1)}

Vari,k,P,cx,cy:integer;

Chương 7: Mô hình các mặt đa giác & Vâ

ún đề khử mặt khuất - Nguyễn Hữu Tài

Poly:arrayofTPoint; begin

cx:=Width div2;cy:=Heightdiv2;

{Duyệtquatấtcảcâcmặtcủađốitượng} Fork:=0toObj.SoMat-1do

ifTich_vo_huong(v,Obj.Mat[K].PhapVT)>= 0then {Mặt khảkiến}

begin

setlength(Poly,Obj.Mat[K].Sodinh); {Thiết lập độ dăi của mảng Poly bằngsốđỉnhcủađagiâc}

Fori:=0toObj.Mat[K].Sodinh-1do

{ĐưatoạđộcâcđỉnhcủađagiâcvăoPoly} 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; end;

{Thiếtlậpmăuchobúttôtrướckhitô} canvas.Brush.Color

=rgb(Obj.Mat[K].Color.R,Obj.Mat[K].Color.G,Obj.Mat[K].Color.G); Canvas.Polygon(poly); {Tôđagiâcvới măuđêđượcthiếtlập} end;

setlength(poly,0); end;

Rõrăng,thuậttoânrấtđơngiảnvă độphứctạptínhtoânkhôngcao.Song khisửdụngphảiluônđảm bảorằngđốitượngcó đặttínhlă“đặc vă lồi”,nếuđối tượngkhôngthoảmênđiệu kiệnđóthìchúngtaphảiâpdụngmộtthoậttoânkhâc haycónhữngsửađổicầnthiếtđểtrânhsựthểhiệnsailạc.

II.3. Thuậttoânvùngđệmđộsđu(Z-Buffer)

Bằngcâchtínhgiâtrịđộsđu(lă giâtriZtronghệtoạđộquansât)củamỗi điểmtrongtấtcảcâcmặtđagiâc,tạimỗi điểmtrínmặtphẳngchiếucó thểcóảnh củanhiềuđiểmtrínnhiềumặtđagiâc khâcnhau,songhìnhvẽchỉđượcthểhiện hìnhảnhcủađiểmcóđộsđuthấpnhất(tứclăđiểmởgầnnhất).Vớicâchthực hiện năygiảithuậtcóthểkhửđượctấtcảcâctrườnghợpmăcâcgiảithuậtkhâc mắc phải.

Giới hạn của phương phâp năy lă đòi hỏi nhiều bộnhớ vă thực hiện nhiều tính toân. Z_Buffer lămột bộđệm dùng đểlưuđộsđucho mỗi pixeltrín hìnhảnh của vậtthể,thôngthường ta tổ chức nólă một matrận hìnhchữ nhật.Nếu dùng1 byteđể biểu diễn độsđu củamộtpixel, thìmột vậtthểcó hìnhảnhtrín mặtphẳng chiếu lă 100x100 sẽ cần 10000 byte dùng để lăm Depth Buffer, vă khi đó vùng đệm độ sđu sẽ cho phĩp ta phđn biệt được 256 mức sđu khâc nhau, điều năy có nghĩa lă nếu có 257 pixel ở 257 độ sđu khâc nhau thì khi đó buột ta phải quy 2

Trang114

Chương 7: Mô hình các mặt đa giác & Vâ

ún đề khử mặt khuất - Nguyễn Hữu Tài

pixel năo đóvề cùngmột độsđu. Nếuta dùng4 byteđể biểu diễn độsđu củamột pixel, thìkhi đóvùngđệm độ sđusẽcho phĩpta phđnbiệt được4294967296(232) mức sđu khâc nhau, song lúc đó sẽ phải cần 40000 byte cho một bộ đệm kích thước100x100.Dotínhchất2mặtnăyníntuỳvăotình huốngvăyíucầumătacó thểtănghaygiảm sốbyteđểlưugiữđộ sđucủa 1pixel.Văthôngthườngngườita dùng4byteđểlưugiữđộsđucủamộtđiểm,khiđóthìđộchínhxâcrấtcao.

Một cđuhỏi có thể đặt rală lăm sao có thể tính độ sđu của mỗi điểmtrong đa giâc.Ởđđycó2phươngphâp:phươngphâptrựctiếpvă phươngphâpgiântiếp.

Ph

ươ ng phâp tr c ti ế p: sẽtính độsđu củamỗi điểm dựavăo phươngtrình mặt phẳng chứa đa giâc. Với phương phâp năy chúng ta cần duyệt qua tất câcđiểm củađa giâc(tấtnhiín chỉhữuhạn điểm),bằngcâchcho câcthănh phần x vă y, nếu cặp giâ trị (x,y) thoả trong miền giới hạn của đa giâc thì chúngtasẽ tìmthănh phầnthứ3lăzbằngcâch thaythếxvăyvăo phương trình mặt phẳng để tính ra thănh phần z. Vềmặt toân học thì phương phâp trực tiếp rõ răng lă rất khoa học, song khi âp dụng ta sẽ gặp phải một số vướngmắcđólă:

Cần phải tính bao nhiíu điểm để hình ảnh thể hiện của đa giâc lín mặt phẳngchiếuđủmịnvă cũngkhôngbịtình trạngquâmịn(tứclăvẽrấtnhiều điểm chồng chất lín nhau không cần thiết mă lại gđy ra tình trạng chậm chạp vă tăngđộ phứctạptính toân. Cũng nín nhớrằngkhi thểhiệnmột đa giâc línmặtphẳngchiếuthìảnhcủanócóthểđược phóngtohaythunhỏ).

Ph

ươ ng phâp giân ti ế p: Chúng ta sẽ tính độ sđu của một điểm giân tiếp thông qua độ sđu của câc điểm lđn cận. Để thực hiện chúng ta tiến hănh theocâcbướcsau:

Gọi G lă một mặt đa giâc được biểudiễn bởitập câc điểm P1, P2, …Pn vă G’ lă hình chiếu của G xuống mặt phẳng chiếu vớitập câc đỉnh P1’,P2’,… Pn’.

Đểthểhiệnhìnhảnh củaGlínmặtphẳngchiếuthìrõrăng lăchúngta phải tiến hănhtô đa giâcG’.Song nhưthuật toân đêphâtbiểu, chúngta cầnxâc định xem mỗi điểm M’ bất kỳ thuộc G’ lă ảnh của điểm M năo trín G vă dựa văo độ sđu của M để so sânh vớiđộ sđu đê có trong z-buffer để quyết định lă có vẽ điểm M’ hay không. Nếu ta gân thím cho câc điểm ảnh một thănh phần nữa,đólăgiâ trịđộ sđu của điểmtạo ảnh(tức lăđiểmđê tạo ra điểm ảnhsau phĩpchiếu)thìlúcnăy takhông cầnthiết phảixâc địnhMđể tínhđộsđu,mătacóthểtínhđượcgiâtrịđộsđunăyquacôngthức sau:

NếuM’nằmtrínđoạnthẳngP’Q’vớitỷlệlă:P’M’/P’Q’=t

Vă biết được độsđu của P’ vă Q’ lần lượt lă z(P’) vă z(Q’) thì độ sđu mă điểmảnhM’nhậnđượclă

z(M’)=z(P’)+(z(Q’)-z(P’))t (II.3.1)

Ta có thể sử dụng được công thức trín với tất cả câc phĩp chiếu có bảo toăn đường thẳng. Từ đó ta có thể xâc định quy trình vẽ đa giâc G’lăảnhcủaGnhưsau:

Trang115

Chương 7: Mô hình các mặt đa giác & Vâ

ún đề khử mặt khuất - Nguyễn Hữu Tài

+ Gân thím cho mỗi điểm đỉnh của đa giâc G’ một thănh phần z có giâ trị bằngđộsđucủađiểmtạoảnh.CónghĩalăP’1sẽchứathímgiâtrịz(P1),P’2

sẽ chứathím giâ trị z(P2), hay một câch tổng quât P’i sẽ chứa thím giâ trị z(Pi)vớii=1..n.

Tiến hănh tô đa giâc G’ theo một quy trình tương tự như thuật toân tô đa giâc theo dòng quĩt. Đó lă ta cho một dòng quĩt chạy ngang qua đa giâc từ đỉnh đến đây đa giâc, tạimỗi vị trí bất kỳ của dòng quĩt, chúng ta tiến hănh tìm tậpcâc giaođiểm của dòng quĩtvớiđa giâc. Gọi {xm} lă tập câc giao điểm, một điều cần chú ýlă ta cần tính độsđu cho câc giaođiểm năy. Giả sửxilă giao điểmcủa đườngquĩtvớicạnh Pi’Pj’ thếthì tacó thể tínhrađộ sđucủaxithôngquacôngthức(II.3.1)nhưsau:

Nếugọiyscanlăgiâ trịtungđộcủadòngquĩtthếthì:

z(xi)=z(Pi’)+[z(Pj’)-z(Pi’)]*[(yscan–y(Pi’))/(y(Pj’)-y(Pi’))] (II.3.2) {trongđóy(P)lăthănhphầntoạđộycủađiểmP}

Rõ răngquacông thức trínta thấy,nếu xilă trung điểmcủaPi’Pj’ thì z(xi) =z(Pi’)+z(Pj’)*1/2

II.3.a. Căiđặtminhhoạchothuậttoân“vùngđệmđộsđu”

Từ nhữngphđntính trín chúngtacó thể tiếnhănh khaibâocâc cấutrúc dữ liệucầnthiếtvă căiđặtchothuậttoân.

Khaibâocâccấutrúc dữliệucầnthiết:

Sauđđylăcâckhaibâocầnthiếtđểchophĩplưutrữmộtđốitượng3Dtheo mô hình câc mặt đa giâc, cùngcâc khaibâo cần thiếtđể tiến hănh khử mặt khuất theo thuật toân z-Buffer theongôn ngữ Pascal trong môi trường của trìnhbiíndịchDelphi

{Bắtđầuphầnkhaibâophụcvụchogiảithuật Z-buffer}

Z_BufferType=ArrayofArray ofcardinal;{KiểubộđệmZ,đđylămột mảng động 2 chiều mỗi phần tử kiểu cardinal, điều đó nghĩa vùng đệmđộsđu sẽ chophĩp ta phđnbiệt được 4294967296(232) mức sđu khâcnhau}

NutPoly_Z=record {Cấu trúc của một đỉnh của đa giâc chiếuG’}

x,y:Integer; {Toạ độ của ảnh trín mặt phẳng chiếu}

z:real; {Thănh phần độ sđu đi kỉm (lă độ sđu củatạoảnh)}

end;

Polygon_Z=arrayofNutPoly_Z; {Đagiâcchiếu lămột mảngđộng. Như một đa giâc 2 chiều, song mỗi một đỉnh chứa thím thănh phầnđộsđucủađỉnh}

Trang116

Chương 7: Mô hình các mặt đa giác & Vâ

ún đề khử mặt khuất - Nguyễn Hữu T

ài

CanhCat_Z=record {Cấutrúccủa câccạnh đagiâcđượcxđy dựng nhằm phục vụ cho quâ trình tính giaođiểm}

y1,y2:Integer; {Tung độ bắt đầu kết thúc của một cạnh(y1<=y2)}

xGiao:real; {hoănh độ xuất phât của cạnh. Song trong quâtrìnhtínhtoânnósẽ lătungđộ giao điểm của cạnh với đường quĩt ngang}

xStep:real; {Giâ trị thay đổi của x khi y thay đổi 1 đơnvị,nóchobiếtđộdốccủacạnh}

zGiao:real; {Giâ trị độ sđu tại điểm xuất phât của cạnh. Song trong quâ trình tính toân sẽ giâ trị độ sđu của giao điểm với đườngquĩtngang}

zStep:real; {Giâ trị độ sđu của giao điểm tiếp theo so với giâtrị độsđu của giaođiểmtrước đó sẽ chính lệch nhau một khoảng zStep}

end;

DanhSachCanhCat_Z=arrayofCanhCat_Z; {Danh sâch câc cạnh đượctạo ratừ đagiâcchiếuG’, danh sâchnăynhằm phụ vụcho quâ trìnhtính toâncâcgiaođiểmvới đườngquĩtcũngnhưđộsđu củamỗigiao điểm}

GiaoDiem_Z=record {Lưu toạ độ giaođiểm văđộsđu tương ứngvới giaođiểmđó}

Một phần của tài liệu giáo trình lý thuyết đồ họa (Trang 113 - 129)

Tải bản đầy đủ (DOCX)

(150 trang)
w