Khi chúng ta đã có danh sách các cạnh viền rồi, chúng ta sẽ tạo ra bóng khối bằng cách xây dựng các tứ giác từ mỗi cạnh viền đó dựa vào vị trí của nguồn sáng. 2 đỉnh đầu của tứ giác là 2 đỉnh của cạnh viền. 2 đỉnh tiếp theo sẽ nằm trên 2 đường thẳng nối giữa nguồn sáng và 2 đỉnh đầu. 2 đỉnh này theo lý thuyết sẽ được chiếu ra vô cực nhưng như thế sẽ không cần thiết vì thế ta sẽ chỉ cho chúng các giá trị tọa độ lớn là được.
1
v và v2 là 2 đỉnh của một cạnh viền bất kỳ trong danh sách. L là vị trí của nguồn sáng.
3
v và v4 sẽ là 2 điểm cần tìm tọa độ để tạo ra tứ giác.
Const He_so_chieu 100 //Hệ số chiếu này là một số lớn.
chieu so He x L x v x v3 ( 1 ) _ _ ; chieu so He y L y v y v3 ( 1 ) _ _ ; chieu so He z L z v z v3 ( 1 ) _ _ ; chieu so He x L x v x v4 ( 2 ) _ _ ;
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/ 39 chieu so He y L y v y v4 ( 2 ) _ _ ; chieu so He z L z v z v4 ( 2 ) _ _ ; 2.9. .
Từ các điểm này ta sẽ vẽ được các tứ giác bao ngoài bóng khối. Vấn đề còn lại cần phải giải quyết với bóng khối là phải “đậy nắp” (Capping) 2 đầu của khối lại để nó trở thành một khối kín. Lúc đó ta có thể thực hiện các phép kiểm tra một cách chính xác nhất. Để “nấp” phía trước thì đơn giản là ta dùng luôn các mặt trước của vật thể đối với vị trí của ánh sáng. Nấp mặt sau thì ta chỉ cần chiếu từng mặt sau của vật thể với ánh sáng đó ra vô cực. Phần này không cần thiết lắm bởi vì ta đã chiếu nó ra gần như là vô cực. Nên những điểm đó không cần xét đến nhiều. [2]
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/
40
Để hiểu rõ hơn ta xét: cơ sở là khối bao của đối tượng theo nguồn sáng. Vậy công việc đầu tiên là phải tính được khối bao tạo bởi đối tượng với nguồn sáng (khối bóng). Trong trường hợp đơn giản nhất xét một tam giác như trong “Hình 2.11”.
Hình 2.11. Khối bao của tam (ABC) giác với nguồn sáng điểm L.
Khối bao là khu vực được in đậm, ta thấy rằng khối bao của một tam giác là một khối được tạo bởi toàn bộ cạnh của tam giác đó và các đường nối với nguồn sáng. Như vậy, khi xét một đối tượng, trong trường hợp đơn giản nhất khối bao của đối tượng sẽ là tập hợp các khối bao của từng đa giác cấu thành đối tượng. Với cách xây dựng khối bao như vậy thì công việc xây dựng các khối bao cho đối tượng sẽ không cần giải quyết vì mỗi đa giác sẽ xác định ngay được các cạnh của nó. Tuy vậy, với việc lựa chọn khối bao như thế số lượng khối bao cấu thành khối bao của đối tượng sẽ là rất lớn, dẫn tới thời gian tính toán bóng đổ là rất lớn do đó người ta thường lựa chọn khối bao cho đối tượng là khối bao cấu thành từ đường bao của đối tượng theo nguồn sáng.
Vậy tại sao chỉ cần sử dụng đường bao của đối tượng theo hướng nguồn sáng và việc tính các đường bao này như thế nào?. Xét hình vẽ sau “Hình 2.12”:
B A C L L A E D C F
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/
41
Hình 2.12. Đường bao của một đa giác trong không gian hai chiều.
Ta thấy rằng các điểm C,D,E mặc nhiên nằm trong khu vực có bóng đổ vì nó không nhìn thấy nguồn sáng, các cạnh che toàn bộ là các cạnh BA, AF, nếu không tính không gian của chính đối tượng cạnh đại điện cho đa giác ABCDEF với nguồn sáng chỉ là BF mà thôi. Xét tính chất tại các điểm B và điểm F ta thấy rằng các cạnh tạo bởi đỉnh B là AB, BC có hướng vector pháp tuyến ngược nhau so với vector
hướng ánh sáng tới tại điểm B hay cụ thể là: dot(NAB,lB) 0
và dot(NBC,lB) 0
, với
dot là hàm tích vô hướng, N là vector pháp tuyến của cạnh, l là hướng nguồn sáng tại mỗi điểm. Mở rộng hơn ta có thể tìm được đường bao của một đối tượng trong không gian ba chiều theo nguồn sáng. Thuật toán cụ thể có thể trình bày sơ lược như sau:
Thuật toán tìm đường occluder light.
Bƣớc 1: Lấy danh sách các cạnh của đối tượng.
Bƣớc 2: Xét với mỗi cạnh.
Nếu tại cạnh đó chỉ có một đa giác liên đới thì bổ xung cạnh đó vào danh sách các đường (occluder light) .
Nếu có hai hoặc nhiều hơn hai đa giác tại cạnh đang xét thì xét nếu tồn tại một cặp đa giác sao cho dot(Nci,l) dot(Ncj,l) 0, với ci là đa giác thứ i chứa cạnh
c, cj là đa giác thứ j chứa cạnh c, thì bổ xung cạnh đó vào danh sách các đường (occluder light).
Bƣớc 3: Sau khi tìm được danh sách các cạnh là đường (occluder light) tiến hành nối các cạnh này lại để được các đường bao. Việc nối các cạnh này dựa vào chỉ số của từng cạnh.
Sau các bước này chúng ta đã có danh sách các đường (occluder light, người ta còn gọi các đường này là đường Silhouette) cho đối tượng, chúng là các đường đóng. Khi thực hiện thuật toán tạo bóng đổ bằng bóng khối ta phải vẽ kín cả hai đầu như trong “Hình 2.12” ta phải vẽ cả đường BAF, tuy nhiên trong môt số trường hợp đơn giản ta chỉ cần vẽ cạnh BF để giảm số lượng đa giác cần vẽ. Vậy với mỗi tập
Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/
42
đường Silhouette chúng ta phải tiến hành tam giác hóa trong trường hợp muốn giảm thiểu tối đa việc vẽ khối bóng để tăng tốc độ hiển thị.
Ngoài cách tính đường Silhouette như trên, chúng ta cũng có thể xây dựng đường Silhouette dựa vào bản đồ chiều sâu “depthmap” lấy được bằng cách coi nguồn sáng như là một điểm nhìn và tiến hành render chỉ lấy bản đồ chiều sâu từ điểm nhìn đó. Công việc tính các đường Silhouette dựa theo depthmap sử dụng thuần các kỹ thuật trích biên, tách ngưỡng trong xử lý ảnh hai chiều. Nhìn chung ưu điểm của phương pháp này là dễ cho việc tính toán, tổ chức lưu trữ, nhưng nhược điểm lớn nhất của phương pháp này là tốc độ do phải xử lý trên ảnh, mặt khác kích thước ảnh cũng ảnh hưởng đến chất lượng của khối bóng do không có sự ánh xạ hoàn toàn gữa không gian ảnh và không gian đối tượng. [4], [5]