Ðường cong Spline vă B-Spline

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

6.2.1. định nghĩa Theo trắn ta có: P(t) = k L = ∑ 0 Pk.Rk(t) (*)

trong ựó Pk với k=1..L lă câc ựiểm kiểm soât.

Rk(t) lă câc hăm trộn liắn tục trong mỗi ựoạn con [ti , ti+1]vă liắn tục trắn mỗi nút. Mỗi Rk(t) lă một ựa thức riắng phần.

Chương VỊ Thiết kếựường cong vă mt cong Bezier vă B-Spline

78

Câc ựoạn ựường cong riắng phần năy gặp nhau ở câc ựiểm nút vă tạo cho ựường cong trở nắn liắn tục. Ta gọi những ựường cong như vậy lă SPLINE.

Cho trước một vector nút thì có thể có nhiều họ hăm trộn ựược dùng ựể tạo ra một

ựường cong Spline có thểựịnh nghĩa trắn vector nút ựó. Một họ câc hăm như vậy ựược gọi lă cơ sở cho câc Splinẹ

Trong số câc họ hăm năy, có một cơ sở cụ thể mă câc hăm trộn của nó có giâ mang nhỏ nhất vă nhờ vậy nó ựem lại khả năng kiểm soât cục bộ lớn nhất. đó lă câc B-

Spline, với B viết tắt của chữ Basic (cơ sở).

đối với câc hăm B-Spline, mỗi ựa thức riắng phần tạo ra nó có mt cp m năo ựó. Do ựó, thay vì dùng ký hiệu Rk(t) cho câc hăm riắng phần năy ta sẽ ký hiệu câc hăm trộn năy lă Nk,m(t).

Do ựó câc ựường cong B-Spline có thể biểu diễn lại: P(t) =

k L = ∑ 0 Pk.Nk,m(t) TÓM LẠI

để xđy dựng câc ựường cong B-Spline ta cần có:

Ớ Một vector nút T=(t0, t1, t2, ...,tk+m-1).

Ớ (L+1) ựiểm kiểm soât.

Ớ Cấp m của câc hăm B-Spline vă công thức cơ bản cho hăm B-Spline Nk,m(t) lă: Nk,m(t) = t t t t k k m k − −       + −1 .Nk,m-1(t) + t t t t k m k m k + + + − −       1 .Nk+1,m-1(t) với k=0..L

đđy lă một công thức ựệ quy với Nk,L(t) =

   ≤ + lại ngược 0 1 tk πt tk 1 (Hăm hằng bằng 1 trắn ựoạn (tk , tk+1)

đối với câc mặt B-Spline, ta có công thức biểu diễn tương tự:

P(u,v) = i M = ∑ 0 k L = ∑ 0

Pi,k.Ni,m(u).Nk,m(v)

Nhận xĩt: Câc ựường Bezier lă câc ựường B-Splinẹ

6.2.2. Câc tắnh cht hu ắch trong vic thiết kế câc ựường cong B-Spline

i/ Câc ựường B-Spline cấp m lă câc ựa thức riắng phần cấp m. Chúng lă câc Spline do chúng có m-2 cấp ựạo hăm liắn tục ở mọi ựiểm trong giâ mang của chúng.

Câc hăm B-Spline cấp m tạo thănh mt cơ sở cho bất kỳ Spline năo có cùng

cp ựược ựịnh nghĩa trắn cùng câc nút. Câc Spline có thểựược biểu diễn như

một tổ hợp tuyến tắnh của câc B-Splinẹ

ii/ Hăm trộn B-Spline Nk,m(t) bắt ựầu ở tk vă kết thúc ở tk+m . Giâ mang của nó lă [tk,tk+m]. Giâ mang của họ câc hăm Nk,m(t) với k=0,...L lă khoảng [t0,tm+L].

iii/Một ựường cong B-Spline ựóng dựa trắn L+1 ựiểm kiểm soât có thểựược tạo ra bằng câch dùng phương trình ựường B-Spline tuần hoăn sau:

P(t) = k L = ∑ 0 Pk.N0,m((t-k) mod (L+1)) (adsbygoogle = window.adsbygoogle || []).push({});

Với giả thiết câc nút câch ựều nhau trong ựịnh nghĩa của hăm N0,m(...).

iv/ Nếu dùng vector chuẩn thì ựường cong B-Spline sẽ nội suy câc ựiểm kiểm soât

ựầu tiắn vă cuối cùng. Câc hướng khởi ựầu vă kết thúc của ựường cong ựó sẽ

nằm dọc theo câc cạnh ựầu tiắn vă cuối cùng của ựa giâc kiểm soât.

v/ Mỗi hăm B-Spline Nk,m(t) lă không đm ∀t, vă tổng câc họ hăm năy bằng 1: k L = ∑ 0 Nk,m(t) = 1 ∀t ∈ [t0 , tm+L ]

vi/ Câc ựường cong dựa trắn câc B-Spline lă bt biến Affin. Do ựó, ựể biến ựổi một ựường cong B-Spline, chỉ cần biến ựổi câc ựiểm kiểm soât, sau ựó khởi tạo lại ựường cong từ câc ựiểm kiểm soât ựê ựược biến ựổi năỵ

vii/Một ựường cong B-Spline sẽ nằm trong bao lồi của câc ựiểm kiểm soât

Mạnh hơn: Ở bất kỳ t năo, chỉ có m hăm B-Spline lă khâc 0. Vì vậy, ở mỗi t ựường cong phải nằm trong bao lồi của hầu hết m ựiểm kiểm soât kắch hoạt kế nhaụ (Câc ựiểm kiểm soât kắch hoạt lă câc ựiểm mă tại ựó hăm B-Spline khâc 0)

viii/độ chắnh xâc tuyến tắnh của ựường cong B-Spline: Nếu m ựiểm kiểm soât kề

nhau lă tuyến tắnh cùng nhau thì bao lồi của chúng lă một ựường thẳng. Do ựó

ựường cong cũng sẽ trở thănh ựường thẳng.

ix/ Tắnh chất giảm ựộ biến thiắn: Số giao ựiểm giữa ựường cong B-Spline với bất kỳ một mặt phẳng năo (nếu có) luôn luôn nhỏ hơn số giao ựiểm (nếu có) giữa

ựa giâc kiểm soât của nó với mặt phẳng ựó.

Chương VỊ Thiết kếựường cong vă mt cong Bezier vă B-Spline

80

Ta có thể dùng câc hăm trộn Bezier vă B-Spline ựể mô tả vă vẽ câc mặt cong. đối với câc mặt cong, ta biểu diễn chúng dưới dạng tham số qua một hăm vector với 2 tham số lă u, v. Dạng tổng quât của một mặt cong lă:

p(u,v) = (X(u,v),Y(u,v),Z(u,v))

⇔ p(u,v) = X(u,v).i + Y(u,v).j + Z(u,v).k

Khi u, v biến thiắn trắn một khoảng năo ựó thì câc hăm X(u,v), Y(u,v) vă Z(u,v) thay ựổi giâ trị, do ựó lăm cho vị trắ của p(u,v) thay ựổi trong không gian 3 chiềụ

Chúng ta sẽ không biểu diễn câc mặt qua câc hăm toân học tường minh mă sẽ biểu diễn chúng qua câc ựiểm kiểm soât.

Vắ dụ: p(u,v) = (1-v).((1-u).P00 + ụP10) + v.((1-u).P01 + ụP11) dùng 4 ựiểm kiểm soât ở 4 góc lă Pij với câc hăm trộn lă tuyến tắnh theo u, v.

6.2.4. Câc băng Bezier

đường cong Bezier trong không gian 3 chiều có thể ựược viết dưới dạng lă một hăm của tham số v với L+1 ựiểm kiểm soât tùy thuộc văo tham số u theo một kiểu năo

ựó: Chẳng hạn P(u,v) = k L = ∑ 0 Pk(u).BkL(v) (*)

Nghĩa lă mỗi ựường viền u lă một ựường cong Bezier chuẩn, nhưng ở những giâ trị

u khâc nhau thì câc ựiểm kiểm soât cũng nằm ở những vị trắ khâc nhaụ

Khi u biến thiắn thì mỗi ựiểm kiểm soât Pk(u) sẽ chạy trắn một ựường cong cụ thể. Do ựó, mặt cong có thể xem như lă một sự dịch chuyển ựường Bezier trong không gian.

Ta tưởng tượng một ựa giâc kiểm soât chuyển ựộng trong không gian vă thay ựổi dạng khi chuyển ựộng. Ở mỗi vị trắ, ựa giâc năy tạo nắn một ựường cong Bezier vă mặt cong tạo thănh chắnh lă câi vết còn ựể lại bắn dưới của ựường cong năỵ

Vắ dụ: Phĩp chiếu phối câch của một mặt ựược tạo ra bởi việc nội suy tuyến tắnh giữa 2 ựường cong Bezier dựa trắn 2 ựa giâc kiểm soât lă P0 vă P1. Mỗi ựường cong kiểm soât pk(u) ựược nội suy tuyến tắnh giữa 2 ựiểm kiểm soât Pk0 vă Pk1 khi u biến thiắn giữa 0 vă 1:

pk(u) = (1-u).Pk0 + ụPk1 k=0,1,2,3 (adsbygoogle = window.adsbygoogle || []).push({});

Giả sử câc ựường cong kiểm soât pk(u) chắnh lă câc ựường cong Bezier, mỗi ựường cong năy dựa trắn m +1 ựiểm kiểm soât của chúng.

Vì vậy: Pk(u) = i M = ∑ 0 Pi,k.BiM(u)

Kết hợp pk(u) năy văo phương trình (*) ta ựược:

P(u,v) = i M = ∑ 0 k L = ∑ 0 Pi,k.BiM(u).BkL(v) (**)

Ta gọi ựđy lă dạng tắch Tensor cho băng Bezier.

Cũng giống như câc ựa giâc kiểm soât trong 2D, một khối ựa diện kiểm soât lă một mạng gồm có (M+1).(L+1) ựỉnh.

Tóm lại, ựể tạo ra một băng ta chỉ cần chỉ ra câc vị trắ của câc ựỉnh năy rồi sau ựó âp dụng phương trình (**) ựể vẽ câc ựường viền hay ựịnh nghĩa dạng mặt cong.

6.2.5. Dân câc băng Bezier vi nhau

Mục ựắch lă ựể tạo ra câc dạng mặt phức tạp gồm nhiều băng Bezier kết lại với nhau một câch trơn tru ở câc biắn chung.

Khi nối 2 băng Bezier lại với nhau, mỗi băng có một khối ựa diện kiểm soât riắng vă ựều ựược tạo ra từ phương trình (*) với u, v biến thiắn trong khoảng [0,1]. Vấn ựề

lă lăm sao cho 2 băng có thể dân văo nhau một câch trơn trụ

Ớ Hai băng sẽ gặp nhau ở tất cả câc ựiểm dọc theo biắn chung nếu câc khối ựa diện kiểm soât của chúng khớp nhau ở biắn. Như vậy, ta chỉ cần chọn câc ựa giâc kiểm soât biắn ựể cho 2 băng ựồng nhất nhau ở biắn. Có thể thấy ựược ựiều năy khi thay u=0 văo trong phương trình (*) ở trắn.

Ớ Một ựiều kiện ựủ nữa lă mỗi cặp cạnh của khối ựa diện mă nó gặp nhau ở biắn phải tuyến tắnh cùng nhaụ

6.2.6. Câc băng B-Spline

Câc hăm B-Spline có thểựược sử dụng trong dạng tắch Tensor thay cho câc ựa thức Bernstein ựể ựạt ựược tắnh kiểm soât cao hơn khi thiết kế mặt cong. điều ựó có nghĩa ta sẽ thay phương trình (**) thănh:

P(u,v) = i M = ∑ 0 k L = ∑ 0

Pi,k.Ni,m(u).Nk,m(v)

Khối ựa diện kiểm soât gồm có (L+1).(M+1) ựiểm kiểm soât; u,v biến thiắn từ 0 tới giâ trị nút lớn nhất trong câc vector nút tương ứng của chúng.

Chương VỊ Thiết kếựường cong vă mt cong Bezier vă B-Spline

82

đối với câc băng B-Spline, người ta vẫn dùng câc B-Spline bậc 4. Do việc chọn số ựiểm kiểm soât lă không giới hạn nắn có thể tạo ra nhiều dạng mặt cong rất phức tạp.

Tất nhiắn khi thiết kế, ta phải chọn khối ựa diện nút ựể tạo ra mặt có dạng mong muốn.

KHỬ đƯỜNG VĂ MT KHUT

7.1. CÂC KHÂI NIM

Một vật thể 3D có thể biểu diễn trong mây tắnh bằng nhiều mô hình khâc nhau, song hai mô hình phổ biến nhất ựó lă mô hình khung dđy (WireFrame) vă mô hình câc mt

a giâc ( Polygon mesh model)

Ớ Mô hình WireFrame: đê trình băy ở chương 5, nó cho ta hình dâng của vật thể dưới dạng một bộ khung

Ớ Mô hình câc mặt ựa giâc: ở ựđy một vật thể 3D ựược xâc ựịnh thông qua câc mặt (thay vì câc cạnh như trong mô hình WireFrame), vă mỗi một mặt lại ựược xâc ựịnh thông qua câc ựiểm mă câc ựiểm năy ựược xem như lă câc ựỉnh của mặt ựa giâc, với mô hình câc mặt ựa giâc thì chúng ta không chỉ tạo ra ựược hình dâng của vật thể như mô hình Wireframe mă còn thể hiện ựược câc ựặc tắnh về mău sắc vă nhiều tắnh chất khâc của vật thể. Song ựể có thể mô tả vật thể 3D một câch trung thực (như trong thế giới

thực) thì ựòi hỏi người lập trình phải tắnh toân vă giả lập nhiều thông tin, mă mấu chốt lă vấn ựề khử mặt khuất vă chiếu sâng.Trong chương năy chúng ta sẽ tập trung nghiắn cứu vấn ựề khử mặt khuất.

Vắ dụ: Mô tả vật thể như trong hình 7.1. (adsbygoogle = window.adsbygoogle || []).push({});

- Danh sâch câc ựỉnh: 1,2,3,4,5,6

- Danh sâch câc mặt ựược xâc ựịnh theo bảng sau:

1 2 3 4 5 6 Mặt 3 Mặt 1 Mặt 4 Mặt 5 Mặt 2 Hình 7.1

Chương VIỊ Khửựường vă mt khut 84 1 2 3 4 5 1,2,3 4,5,6 1,3,6,4 3,2,5,6 1,2,5,4

Chúng ta có thểựưa ra nhiều cấu trúc dữ liệu khâc nhau ựể lưu trữ cho ựa giâc. Dưới ựđy lă phât thảo một kiểu cấu trúc:

Type Point3D = Record {đim 3 chiu}

x,y,z:real;

end;

Vector3D = Record {Vector 3 chiụ Mc dù nó ging vi

x,y,z:real; Point3D song ta vn khai ựể câc thut toân end; ựược tường minh}

RGBColor = Record {Cu trúc mău sc ca mt mt}

B,G,R:Byte;

end; KieuMat = Record

PhapVT:Vector3D; {Phâp vector ca mt}

Sodinh:cardinal; {Sốựỉnh ca mt}

List:array of integer;{Danh sâch th t câc ựỉnh to nắn mt. Ởựđy ta dùng mng ựộng}

Color:RGBColor; {mău sc ca mt}

end;

Obj3D = record {đối tượng 3 chiu}

ObjName:string; {Tắn ca ựối tượng}

Sodinh:cardinal; {Sốựỉnh}

Dinh: array of point3d; {Danh sâch ựỉnh. Ởựđy ta dùng kiu mng ựộng}

SoMat:cardinal; {S mt}

Xworld,Yworld,Zworld,Zoom:Real; {Toạựộ vă kắch thước tht ca vt trong h toạựộ thế gii}

end;

Khi căi ựặt cho một ứng dụng cụ thì việc sử dụng mảng cố ựịnh có thể gđy ra câc trở ngại về kắch thước tối ựa hay tối thiểu, cũng như việc sử dụng bộ nhớ không tối ưụ Vì thế ngoăi câch dùng mảng cố ựịnh, ta có thể dùng mảng ựộng trong một số ngôn ngữ như Visual Basic, Delphi hay Visual C++,Ầ hoặc dùng cấu trúc danh sâch móc nốị Song song với ựiều ựó lă việc bớt ựi hay ựưa thắm câc thuộc tắnh cần thiết ựể biểu diễn câc ựặc tắnh khâc của mặt hay của ựối tượng.

* Vn ựề kh mt khut

Khi thể hiện vật thể 3D, một vấn ựề nảy sinh lă lăm sao chỉ thể hiện câc mặt có thể nhìn thấy ựược mă không thể hiện câc mặt khuất phắa saụ Việc một mặt bị khuất hay không bị khuất thì tuỳ thuộc văo cấu trúc câc mặt của vật thể vă vị trắ của ựiểm nhìn cũng như bối cảnh mă vật thểựó ựược ựặt văọ

7.2. CÂC PHƯƠNG PHÂP KH MT KHUT

7.2.1. Gii thut người th sơn vă sp xếp theo chiu sđu (Depth-Sorting) (adsbygoogle = window.adsbygoogle || []).push({});

Người thợ sơn (hay Depth-sorting) lă tắn của một thuật giải ựơn giản nhất trong số câc thuật toân vẽảnh thực 3 chiềụ Nếu ựể ý người thợ sơn lăm việc, chúng ta sẽ thấy anh ta sơn bức tranh từ trong ra ngoăi, với câc cảnh vật từ xa ựến gần. Chúng ta có thể âp dụng một câch tương tựựể vẽ câc ựa giâc trong danh sâch câc ựa giâc. Song có một vấn ựề cần phải chọn lựa, ựó lă một ựa giâc tồn tại trong không gian 3D có tới ba bốn ựỉnh, vă những ựỉnh năy có thể có câc giâ trị z ( giâ trịựộ sđu ) khâc nhaụ Chúng ta sẽ không biết chọn giâ trị năo trong số chúng. Từ những kinh nghiệm trong thực tế, người ta cho rằng nắn sử dụng giâ trị z trung bình sẽ cho kết quả tốt trong hầu hết câc trường hợp.

Như vậy, chúng ta cần phải sắp xếp câc mặt theo thứ tự từ xa ựến gần, rồi sau ựó vẽ câc mặt từ xa trước, rồi vẽ câc mặt ở gần sau, như thế thì câc mặt ở gần sẽ không bị che khuất bởi câ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 ảnh của câc mặt xạ

Chương VIỊ Khửựường vă mt khut

86

Như vậy, thuật giải Depth-Sorting ựược thực hiện một câch dễ dăng khi chúng ta xâc ựịnh một giâ trị ựộ sđu (lă giâ trị z trong hệ toạ ựộ quan sât) ựại diện cho cả mặt. Câc mặt dựa văo ựộ sđu ựại diện của mình ựể so sânh rồi sắp xếp theo một danh sâch giảm dần (theo ựộ sđu ựại diện). Bước tiếp theo lă vẽ câc mặt lắn mặt phẳng theo thứ tự trong danh sâch.

Giải thuật còn một số vướng mắc sau (hình 7.2):

Khi hai mặt cắt nhau thì thuật giải năy chỉ thể hiện như chúng chồng lắn nhaụ

Hình 7.2

Khi hai mặt ở 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 chồng lắn nhau (hay chồng một phần lắn nhau). Chẳng hạn như:

Maĩt nhìn Maịt A

Maịt B

Hình 7.3

Từ những vắ dụ trắn chúng ta có thể thấy rằng, có những trường hợp câ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ể 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 ựồng nghĩa lă chúng ta sẽ phải xử lý thắm rất nhiều câc trường hợp vă lăm tăng ựộ phức tạp tắnh toân.

Phĩp kim tra phn kĩo dăi Z

Phĩp kiểm tra năy nhằm xâc ựịnh phần kĩo dăi z củ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ất có thể câc ựa giâc năy cần ựược hoân ựổị Vì thế phĩp kiểm tra tiếp theo phải ựược thực hiện.

Phĩp kim tra phn kĩo dăi X

Phĩp kiểm tra năy tương tự như phĩp kiểm tra trước, nhưng nó sẽ kiểm tra phần kĩo dăi X 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 ựổị Vì thế phĩp kiểm tra tiếp theo phải ựược thực hiện.

Phĩp kim tra phn kĩo dăi Y

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 ựổị Vì thế phĩp kiểm tra tiếp theo phải ựược thực hiện.

Phĩp kim tra cnh xa

Giả sử A vă B lă hai ựa giâc mă sau khi sắp xếp theo ựộ sđu trung bình thì A

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