Giải thuật vùng ñệm ñộ sđu

Một phần của tài liệu lythuyetdohoa (Trang 94 - 108)

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

7.2.3. Giải thuật vùng ñệm ñộ sđu

Bằng câch tắnh giâ trị ựộ sđu (lă giâ trị Z trong hệ toạ ựộ quan sât) của mỗi ựiểm trong tất cả câc mặt ựa giâc, tại mỗi ựiểm trắn mặt phẳng chiếu có thể có ảnh của nhiều

ựiểm trắn nhiều mặt ựa giâc khâc nhau, song hình vẽ chỉ ựược thể hiện hình ảnh của

ựiểm có độ sđu thấp nhất ( tức lă ựiểm ở gần nhất). Với câch thực hiện năy giải thuật có thể khử ựược tất cả câc trường hợp mă câc giải thuật khâc mắc phảị

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đu cho mỗi pixel trắn hình ảnh của vật thể, thơng thường ta tổ chức nó lă một ma trận hình chữ nhật. Nếu dùng 1 byte ựể biểu diễn ựộ sđu của một pixel, thì một vật thể có hình ảnh trắn mặt phẳ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 pixel năo đó về cùng một ựộ sđụ Nếu ta dùng 4 byte ựể biểu diễn ựộ sđu của một pixel, thì khi đó vùng đệm ựộ sđu sẽ cho phĩp ta phđn biệt ựược 4294967296 (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ước 100x100. Do tắnh chất 2 mặt năy nắn tuỳ văo tình huống vă yắu cầu mă ta có thể tăng hay giảm số byte ựể lưu giữ ựộ sđu của 1 pixel. Vă thông thường người ta dùng 4 byte ựể lưu giữ ựộ sđu của một ựiểm, khi đó thì độ chắnh xâc rất caọ

Một cđu hỏi có thể ựặt ra lă lăm sao có thể tắnh độ sđu của mỗi ựiểm trong ựa giâc. Ở ựđy có 2 phương phâp: phương phâp trực tiếp vă phương phâp giân tiếp.

Ớ Phương phâp trực tiếp sẽ tắnh độ sđu của mỗi ựiểm dựa văo phương trì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ất nhiắn chỉ hữu hạn ựiểm), bằng câch cho câc thă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úng ta sẽ tìm thănh phần thứ 3 lă z bằng câch thay thế x vă y văo phương trình mặt phẳng ựể tắnh ra thănh phần z. Về mặt tô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 vướng mắc:

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ẳng chiếu ựủ mịn vă cũng không bị tình trạng quâ mịn (tức lă vẽ rất nhiề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ức tạp tắnh tơn. Cũng nắn nhớ rằng khi thể hiện một ựa giâc lắn mặt phẳng chiếu thì ảnh của nó có thể ựược phóng to hay thu nhỏ).

Ớ 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 theo câc bước sau:

Chương VIỊ Khử ựường vă mặt khuất

92

Gọi G lă một mặt ựa giâc ựược biểu diễn bởi tậ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ới tập câc ựỉnh P1Ỗ,P2Ỗ,Ầ PnỖ.

để thể hiện hình ảnh của G lắn mặt phẳng chiếu thì rõ răng lă chúng ta

phải tiến hănh tô ựa giâc GỖ. Song như thuật tôn đê phât biểu, chúng ta cần xâ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ểm tạo ảnh (tức lă ựiểm ựê tạo ra ựiểm ảnh sau phĩp chiếu) thì lúc năy ta khơng cần thiết phải xâc ựịnh M ựể tắnh độ sđu, mă ta có thể tắnh ựược giâ trị ựộ sđu năy qua công thức sau:

Nếu MỖ nằm trắn ựoạn thẳng PỖQỖ với tỷ lệ lă: PỖMỖ/PỖQỖ=t

vă nếu 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 ảnh MỖ nhận ựược lă

z(MỖ)=z(PỖ)+(z(QỖ)-z(PỖ))t (2.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ă ảnh của G như sau:

+ 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đu của ựiểm tạo ảnh. Có nghĩa lă PỖ1 sẽ chứa thắm giâ trị z(P1), PỖ2 sẽ chứa thắ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ới i=1..n.

Tiến hănh tô ựa giâc GỖ theo một quy trình tương tự như thuật tơn tơ ựa giâc theo dịng quĩt. Có nghĩa lă cho một dịng quĩt chạy ngang qua ựa giâc, tại mỗi vị trắ bất kỳ của dòng quĩt, chúng ta tiến hănh tìm tập câc giao ựiểm của dòng quĩt vớ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ăỵ Giả sử xi lă giao ựiểm của ựường quĩt với cạnh PiỖPjỖ thế thì ta có thể tắnh ra ựộ sđu của xi thông qua công thức (2.3.1) như sau:

Nếu gọi yscan lă giâ trị tung ựộ của dịng quĩt thế thì:

z(xi) = z(PiỖ)+z(PjỖ)*[(yscan Ờ y(PiỖ))/(y(PjỖ)-y(PiỖ))] (2.3.2)

{trong ựó y(P) lă thănh phần toạ ựộ y của ựiểm P}

Rõ răng qua công thức trắn ta thấy, nếu xi lă trung ựiểm của PiỖPjỖ thì z(xi) = z(PiỖ)+z(PjỖ)*1/2

Căi ựặt minh hoạ cho giải thuật Ộvùng ựệm ựộ sđuỢ

Từ những phđn tắnh trắn chúng ta có thể tiến hănh khai bâo câc cấu trúc dữ liệu cần thiết vă căi ựặt cho thuật tơn.

Ớ Khai bâo câc cấu trúc dữ liệu cần thiết:

Sau ựđy lă câc khai bâo cần thiết ựể cho phĩp lưu trữ một ựối tượng 3D theo mơ hình câc mặt ựa giâc, cùng câc khai bâo cần thiết ựể tiến hănh khử mặt khuất theo thuật tôn z-Buffer theo ngơn ngữ Pascal trong mơi trường của trình biắn dịch Delphi

{Bắt ựầu phần khai bâo phục vụ cho giải thuật Z-buffer}

Type Z_BufferType=Array of Array of cardinal; {Kiểu bộ ựệm Z, ựđy lă một mảng ựộng 2 chiều mă mỗi phần tử có kiểu cardinal, ựiều ựó có nghĩa lă

vùng ựệm ựộ sđu sẽ cho phĩp ta phđn biệt ựược 4294967296 (232) mức sđu khâc nhau}

NutPoly_Z=record {Cấu trúc của một ựỉnh của ựa giâc chiếu GỖ }

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ủa tạo ảnh)} end;

Polygon_Z =array of NutPoly_Z; {đa giâc chiếu lă một mảng

ựộng. Như một ựa giâc 2 chiều, song mỗi một ựỉnh

có chứa thắm thănh phần ựộ sđu của ựỉnh}

CanhCat_Z=record {Cấu trúc của câc cạnh ựa giâc ựược xđy dựng

nhằm phục vụ cho q trình tắnh giao ựiểm}

y1,y2:Integer; {Tung ựộ bắt ựầu vă kết thúc của một cạnh

Chương VIỊ Khử ựường vă mặt khuất

94

xGiao:real; {hoănh ựộ xuất phât của cạnh. Song trong q trình

tắnh tơn nó 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 ựơn vị, nó cho

biết ựộ dốc của cạnh}

zGiao:real; {Giâ trị ựộ sđu tại ựiểm xuất phât của cạnh. Song

trong q trình tắnh tơn nó sẽ lă giâ trị ựộ sđu của giao ựiểm với ựường quĩt ngang}

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ểm trước ựó sẽ chắnh lệch nhau

một khoảng lă zStep}

end;

DanhSachCanhCat_Z=array of CanhCat_Z; {Danh sâch câc cạnh

ựược tạo ra từ ựa giâc chiếu GỖ, danh sâch năy nhằm phụ vụ cho q trình tắnh

tôn câc giao ựiểm với ựường quĩt cũng như ựộ sđu của mỗi giao ựiểm}

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

giao ựiểm ựó}

x,y:Integer; {Toạ ựộ giao ựiểm}

z:real; {Giâ trị ựộ sđu}

ChiSoCanh:integer; {Chỉ số cạnh cắt tạo ra giao ựiểm (Nhằm mục

đắch khử câc giao ựiểm thừa)}

end;

DanhsachGiaoDiem_Z=array of GiaoDiem_Z;

{Kết thúc phần khai bâo phục vụ cho giải thuật Z-buffer}

Procedure DrawObj(Obj:Obj3D; Zmin,ZMax:Real;

Z_Buffer:Z_BufferType; Canvas:TCanvas; Width,Height:integer; Zoom:real);

{đầu văo: + đối tượng 3D chứa trong Obj

+ Giới hạn ựộ sđu trong khơng gian mă chương trình xử lý lă từ Zmin ựến Zmax. Ta sẽ thực hiện ânh xạ câc giâ trị ựộ sđu tắnh được của câc ựiểm trắn ựa

giâc sang ựoạn 0..4294967294. Biết rằng ựộ sđu Zmin ứng với 0 vă Zmax ứng với 4294967294. (ựộ sđu 4294967295 lăm giâ trị mặc ựịnh cho câc ựiểm nền + Z_Buffer: lă ma trận chứa ựộ sđu câc ựiểm ảnh của câc ựối tượng ựê thể hiện trắn Canvas (xem như lă mặt phẳng chiếu). Nếu ta chưa vẽ ựối tượng năo trước đó thì Z_Buffer ựược khởi ựộng lă 4294967295

Canvas: Tấm vải vẽ. Chúng ta sẽ thực hiện vẽ hình ảnh của ựối tượng lắn Canvas.

Width,Height: Lă chiều rộng vă cao của Canvas

+ Zoom: tỷ lệ thể hiện ựối tượng lắn Canvas sau khi thực hiện phĩp chiếu, ta có thể hiểu nơm na lă tỷ lệ thu phóng.}

Var i,k,P,cx,cy:integer; Poly:Polygon_Z;

CuongDoSang:Real; Color:Tcolor; Begin

cx:=Width div 2;cy:=Height div 2;

For k:=0 to Obj.SoMat-1 do {Duyệt qua tất cả câc mặt ựa giâc}

begin

setlength(Poly,Obj.Mat[K].Sodinh);

{Thiết lập số phần tử của Poly bằng số ựỉnh của mặt mă nó sắp chứa}

For i:=0 to Obj.Mat[K].Sodinh -1 do

{Duyệt qua tất cả câc ựỉnh của mặt vă thiết lập giâ trị cho mỗi ựỉnh

của Poly}

begin

P:=Obj.Mat[K].list[i]; {đỉnh thứ i trong ựa giâc K sẽ

lă ựỉnh thứ P trong danh sâch ựỉnh của Obj} {Dùng phĩp chiếu trực giao ựể chiếu ựiểm Obj.dinh[P] xuống mặt

phẳng OXY ta ựược tọa ựộ ảnh lă (Obj.dinh[P].y,Obj.dinh[P].x),

rồi sau ựó phóng theo tỷ lệ lă Zoom vă tịnh tiến theo vector (cx,cy) nhằm giúp ựưa hình ảnh ra vùng giữa Canvas}

Chương VIỊ Khử ựường vă mặt khuất

96

Poly[i].Y:=-round(Obj.dinh[P].y*zoom)+cy; Poly[i].Z:=((Obj.dinh[P].z-ZMin)/(ZMax-Zmin) *4294967294); //MaxCardinal=4294967295

{Giâ trị ựộ sđu của ựỉnh Poly[i] lă giâ trị Obj.dinh[P].z song ựược

ânh xạ văo ựoạn 0..4294967294}

end; Color:=RGB(Obj.Mat[K].Color.R,Obj.Mat[K].Color.G, Obj.Mat[K].Color.B); FillPolygon3D(Poly,Color,Z_Buffer,CanVas); end; setlength(poly,0); end; Procedure FillPolygon3D(Poly:Polygon_Z;Color:TColor; Z_Buffer:Z_BufferType;Canvas:TCanvas);

{Thủ tục tô mău một ựa giâc theo thuật toân Z_Buffer}

var L,H,ND,NG,i,j,Y,MaxY,MinY:integer; D:DanhSachCanhCat_Z;

G:DanhsachGiaoDiem_Z;

Z_BufferW,Z_BufferH:Integer;

{L,H:Giới hạn chỉ số của mảng Poly

D:Danh sâch câc cạnh ựược tạo ra từ Poly, chứa những thông tin cần thiết ựể tắnh giao ựiểm vă ựộ sđu của giao ựiểm một câch nhanh chóng

ND: Số phần tử của mảng D

G: Chứa danh sâch câc giao ựiểm có được sau mỗi lần dịng quĩt thay ựổi NG:số phần tử của mảng G}

Procedure TaoDanhSachCanhCat;

{Thủ tục năy tạo ra danh sâch D, lă danh sâch câc cạnh của ựa giâc từ thông

tin ựầu văo Poly}

Var i,d1,d2,Dem,Dy,Cuoi:integer; begin

{Xâc ựịnh số cạnh của ựa giâc} 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; {Tạo ra câc cạnh}

For i:=L to Cuoi do begin

If i<H then j:=i+1 else j:=L;

{Xâc ựịnh ựiểm ựầu vă ựiểm cuối của cạnh, ựiểm ựầu lă ựiểm có giâ trị y nhỏ}

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; {Lưu trữ tung ựộ xuất phât vă kết thúc}

D[dem].xGiao:=Poly[d1].x;

{Tung ựộ xuất phât. Khởi đầu thì (D[dem].y1,D[dem].xGiao) chắnh lă toạ ựộ

của ựiểm ựầu của cạnh}

D[dem].zGiao:=Poly[d1].z; {độ sđu của giao ựiểm tại ựiểm ựiểm ựầu của cạnh}

Chương VIỊ Khử ựường vă mặt khuất

98

{độ chắnh lệch tung ựộ của ựiểm ựầu vă ựiểm cuối}

If Dy<>0 then begin

D[dem].xStep:=(Poly[d2].x-Poly[d1].x)/Dy; D[dem].zStep:=(Poly[d2].z-Poly[d1].z)/Dy;

{Từ ựộ chắnh lệch Dy ta suy ra gia trọng của x vă ựộ sđu z khi giâ trị y tăng 1

ựơn vị. Nếu khi dòng quĩt ựi qua ựiểm ựầu thì toạ ựộ giao ựiểm lă

(D[dem].y1,D[dem].xGiao) với ựộ sđu lă D[dem].zGiao, nếu sau ựó dịng quĩt

tăng 1 ựơn vị thì răng toạ ựộ giao ựiểm sẽ (D[dem].y1+1,D[dem].xGiaơD[dem].xStep) ựộ sđu sẽ (D[dem].zGiaơD[dem].zStep)} end else begin D[dem].xStep:=0; D[dem].zStep:=0; end; Dem:=Dem+1; end; end; Procedure TaoDanhSachGiaoDiem;

{Tạo danh sâch câc giao ựiểm với đường quĩt có tung ựộ y hiện thời}

Var i:integer; Begin

Setlength(G,ND); NG:=0;

{Duyệt qua tất cả câc cạnh}

for i:=0 to ND-1 do begin

If (D[i].y1<=y)and(y<=D[i].y2) then

{Có giao điểm với ựường quĩt y}

{Lưu lại toạ ựộ giao ựiểm vă ựộ sđu}

G[NG].x:=round(D[i].xGiao); G[NG].y:=y;

G[NG].z:=D[i].zGiao; G[NG].ChiSoCanh:=i;

{Chỉ số cạnh ựê tạo ra giao ựiểm. Nhằm phục vụ cho q trình lọc

bỏ câc giao ựiểm khơng cần thiết}

{Lưu lại Tung ựộ vă ựộ sđu của giao ựiểm với ựường quĩt tiếp theo

(y+1) văo chắnh D[i].xGiao vă D[i].zGiao}

D[i].xGiao:=D[i].xGiaơD[i].xStep; D[i].zGiao:=D[i].zGiaơD[i].zStep; NG:=NG+1; end; end; end; Procedure SapXepVaLoc;

{Sắp xếp lại câc giao ựiểm vă lọc bỏ câc giao ựiểm thừa}

Var i,j,C1,C2:integer; Tg:GiaoDiem_Z;

Begin

{Sắp xếp lại câc giao ựiểm}

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;

{Khử những Giao ựiểm thừa}

While i<(NG-2) do begin

Chương VIỊ Khử ựường vă mặt khuất

100

begin

C1:=G[i].ChiSoCanh; C2:=G[i+1].ChiSoCanh;

{C1 vă C2 lă hai cạnh ựê tạo nắn 2 giao ựiểm trùng nhau ựang xĩt}

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

{Xoâ bớt một giao ựiểm nếu như: 2 cạnh tạo nắn 2 giao ựiểm năy

nằm về hai phắa của ựường quĩt hoặc có một cạnh lă nằm ngang}

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;

{Thực hiện tô mău câc ựoạn thẳng lă phần giao của ựường quĩt với ựa giâc. đó lă câc đoạn x1x2, x3x4,Ầ}

Var i,x,K:integer;Dz:real; Z:Cardinal; begin i:=0; While i<NG-1 do begin K:=G[i+1].x - G[i].x; If k<>0 then Dz:=(G[i+1].z-G[i].z)/K else Dz:=0;

For x:=G[i].x to G[i+1].x do

{Với mỗi ựoạn ta thực hiện tắnh ựộ sđu của từng ựiểm rồi so sânh với

giâ trị có trong Z_Buffer}

If (0<=x)and(x<=Z_BufferW)and(0<=y) and(y<=Z_BufferH) then

begin

z:=round(G[i].z);

If Z_Buffer[x,G[i].y]>Z then

{So sânh ựộ sđu của ựiểm tắnh được với ựộ sđu đê có }

{Nếu ựộ sđu của ựiểm tắnh ựược nhỏ hơn ựộ sđu ựê có trong

Z_Buffer thì rõ răng lă ựiểm tắnh ựược ở gần hơn ựiểm ựê vẽ trước ựó trong vùng ựệm Z vă Canvas}

Begin

Canvas.Pixels[x,G[i].y]:=Color;

{Vẽ ựiểm lắn Canvas}

Z_Buffer[x,G[i].y]:=Z; {Cập nhật ựộ sđu của

ựiểm vừa vẽ văo vùng ựệm Z}

end; end;

G[i].z:=G[i].z+Dz; {Gân giâ trị ựộ sđu của ựiểm tiếp

theo văo trong G[i].z}

end; i:=i+2; end; end; {Thủ tục chắnh} Begin L:=low(Poly); H:=High(Poly);

{Xâc ựịnh giới hạn trắn vă giới hạn dưới của Poly}

Z_BufferW:=high(Z_Buffer); {Xâc ựịnh câc chiều của ma trận Z_Buffer} Z_BufferH:=high(Z_Buffer[0]);

{Z_BufferW+1:Chiều rộng (từ 0..Z_BufferW) Z_BufferH+1:Chiều cao (từ 0..Z_BufferH)}

Chương VIỊ Khử ựường vă mặt khuất

102

{ Tìm giâ trị y lớn nhất vă nhỏ nhất của ựa giâc Poly ựể từ ựó cho dịng quĩt thực hiện

quĩt từ trắn min ựến max}

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; {Tạo danh sâch câc cạnh của ựa giâc Poly với câc tham

số thiết lập nhằm giúp cho việc tắnh tơn giao ựiểm ựược dễ dăng}

For y:=MinY to MaxY do {Cho dòng quĩt chạy từ MinY ựến MaxY }

begin

TaoDanhSachGiaoDiem; {Tìm danh sâch câc giao ựiểm của ựường quĩt y

với câc cạnh của Poly}

SapXepVaLoc; {Sắp xếp lại câc giao ựiểm vă lọc bỏ câc giao ựiểm thừa} ToMauCacDoan; {Dựa văo câc giao ựiểm ựể xâc ựịnh ra câc ựoạn nằm

trong ựa giâc, từ đó tơ mău từng ựiểm trắn đoạn đó dựa văo ựộ sđu so sânh với giâ trị ựộ sđu tương ứng trắn Z_Buffer}

end;

Setlength(D,0); {Giải phóng mảng D}

Setlength(G,0); {Giải phóng mảng G} end;

BĂI TẬP

1. Căi ựặt cho thuật giải Depth-Sorting

Căi ựặt chương trình cho phĩp biểu diễn vă quan sât vật thể 3D theo mơ hình "câc mặt ựa giâc" trong ựó sử dụng thuật giải Depth-Sorting ựể khử câc mặt khuất

2. Căi ựặt cho thuật giải chọn lọc mặt sau

Căi ựặt chương trình cho phĩp biểu diễn vă quan sât vật thể 3D theo mơ hình "câc mặt

ựa giâc" trong ựó sử dụng thuật giải chọn lọc mặt sau ựể khử câc mặt khuất. Với ựối

tượng lă câc hình lập phương, tứ diện, bât diện, cầu,Ầ

3. Căi ựặt cho thuật giải vùng ựệm ựộ sđu

Căi ựặt chương trình cho phĩp biểu diễn vă quan sât vật thể 3D theo mơ hình "câc mặt

ựa giâc" trong đó sử dụng thuật giải chọn lọc mặt sau ựể khử câc mặt khuất. Với ựối

CHƯƠNG VIII

TẠO BÓNG VẬT THỂ 3D

8.1. KHÂI NIỆM

Khi biểu diễn câc ựối tượng 3 chiều, một yếu tố không thể bỏ qua ựể tăng tắnh thực

Một phần của tài liệu lythuyetdohoa (Trang 94 - 108)

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

(146 trang)