C B A (a) C B A (b) G F E D Hình 7-8 Chia một mặt ra làm nhiều mặt để tránh các vấn đề nhìn thấy và không nhìn thấy luân phiên giữa hai mặt.
Ta có thể sử dụng cả hai phương pháp không gian ảnh và không gian đối tượng trong một thuật toán khử mặt khuất. Phương pháp sắp xếp theo độ sâu (depth- sorting method) là một sự nối kết của hai tiếp cận trên, nó thực hiện các công việc cơ bản sau:
1. Các mặt được sắp theo thứ tự giảm dần của độ sâu.
2. Các mặt được vẽ theo thứ tự từ mặt có độ sâu lớn nhất đến mặt có độ sâu nhỏ nhất (vẽ từ mặt xa nhất đến mặt gần nhất).
Các các thao tác sắp xếp được thực hiện trong không gian đối tượng, còn sự chuyển đổi dòng quét (scan conversion) được thực hiện trong không gian ảnh. Phương pháp giải quyết vấn đề mặt khuất
này đôi khi còn được gọi là thuật toán của họa sĩ (painter’s algorithm). Để tạo ra một bức sơn dầu (oil painting), đầu tiên họa sĩ sơn các độ sáng nền. Kế tiếp, các đối tượng ở xa nhất được thêm vào. Sau cùng, các đối tượng ở gần được vẽ phủ lên các đối tượng ở xa đó. Mỗi lớp vẽ sau phủ lên lớp vẽ trước đó. Dùng kỹ thuật tương tự, chúng ta đầu tiên sắp xếp các mặt theo khoảng cách từ chúng đến mặt quan sát. Các giá trị độ sáng của mặt xa nhất được nhập vào vùng xv zv zmax zmin Z’max Z’min S
S’ Hình 7-9
Hai mặt không có sự nạp chồng độ sâu.
Trang 143 Chương 7: Khử các mặt kuất và đường khuất
vùng đệm làm tươi. Với mỗi mặt kế tiếp (xét theo thứ tự độ sâu giảm dần), ta “sơn” các độ sáng của mặt lên vùng đệm làm tươi (phủ lên các độ sáng của mặt được xử lý trước đó).
Việc sơn các mặt đa giác lên vùng đệm làm tươi dựa theo độ sâu được thực hiện trong vài bước. Đầu tiên, các mặt được sắp xếp dựa vào giá trị z lớn nhất của mỗi mặt. Mặt với độ sâu lớn nhất (gọi là S) sau đó được so sánh với các mặt còn lại trong danh sách để xác định xem có bất kỳ sự chồng độ sâu nào không (nằm chồng lên nhau). Nếu không có sự chồng độ sâu nào xảy ra, S được vẽ ra (vẽ ra theo từng đường quét). Trong hình 7-9 trình bày hai mặt không có sự chồng độ sâu (hai mặt không nằm chồng nhau), hình chiếu của chúng lên mặt phẳng xz. Xử lý này sau đó được lặp lại cho mặt kế tiếp trong danh sách. Khi không có sự chồng độ sâu nào xảy ra, mỗi mặt sẽ được xử lý theo thứ tự độ sâu đó cho đến khi tất cả đều được quét qua. Nếu có một sự chồng độ sâu được phát hiện ở bất kỳ điểm nào trong danh sách, ta cần làm vài so sánh bổ sung để xác định xem mặt nào nên được sắp xếp lại.
Với mỗi mặt nằm chồng với S, ta thực hiện các phép kiểm tra sau. Chỉ cần một trong số các phép kiểm tra này là đúng (true), ta không cần sắp lại vị trí mặt đó. Các phép kiểm tra được lập danh sách theo mức độ khó tăng dần:
1. Trên mặt phẳng xy, các hình chữ nhật bao quanh hai mặt không chồng lên nhau.
xv zv
xmax xmin x’max x’min Hình 7-10
Hai mặt không có sự chồng độ sâu theo hướng x. S’ S 2. Mặt S thì ở “phía ngoài” mặt nằm chồng, so sánh dựa vào mặt phẳng quan sát. 3. Mặt nằm chồng thì ở “phía trong ” mặt S, so sánh dựa vào mặt phẳng quan sát.
4. Các hình chiếu của hai mặt lên mặt phẳng quan sát không nằm chồng lên nhau.
Trang 144 Chương 7: Khử các mặt kuất và đường khuất
biết rằng mặt không nằm phía sau S. Vì vậy ta chuyển đến mặt chồng S kế tiếp. Nếu tất cả các mặt mặt nằm chồng vượt qua được ít nhất một trong các phép kiểm tra trên, ta không phải sắp xếp và S có thể được vẽ ra.
Phép kiểm tra 1 được thực hiện trong hai phần: Chúng ta kiểm tra sự nằm chồng theo hướng x, sau đó kiểm tra nằm chồng theo hướng y. Nếu cái nào trong hai hướng này được phát hiện là không có nằm chồng, hai mặt phẳng không che khuất nhau. Một ví dụ về hai mặt có nằm chồng theo hướng z nhưng không chồng theo hướng x được cho trong hình 7-10.
Chúng ta có thể thực hiện phép kiểm tra 2 bằng cách thế tọa độ tất cả các đỉnh của S vào phương trình mặt của mặt nằm chồng và kiểm tra dấu của kết quả. Giả sử rằng mặt nằm chồng có hệ số A’, B’, C’, và D’. Nếu A’x + B’y + C’z + D’ > 0 với mỗi đỉnh có tọa độ (x, y, z) của S, mặt S sẽ ở “phía ngoài” mặt nằm chồng S’ (xem hình 7- 11). Như được đề cập trước đây, các hệ số A’, B’, C’, và D’ phải được xác định trước để pháp vector của mặt nằm chồng S’ chỉ ra xa khỏi mặt phẳng quan sát.
Hình 7-11
Mặt S hoàn toàn ở “phía ngoài” mặt nằm chồng S’ khi nhìn từ mặt quan sát xy. xv zv S S’ Hình 7-12 Mặt nằm chồng S’ hoàn toàn ở “phía trong” mặt S, khi nhìn từ mặt quan sát xy. xv
zv S S’
Phép kiểm tra 3 được thực hiện dùng các hệ số A, B, C, và D của mặt S. Nếu
+ D < 0, khi đó mặt nằm chồng S’ sẽ ở “phía trong” mặt S (cung cấp pháp vector của mặt S hướng ra xa mặt phẳng quang sát). Hình 7-12 trình bày một mặt nằm chồng S’ thỏa phép kiểm tra này. Trong ví dụ này, mặt S thì không ở “phía ngoài” S’ (phép kiểm tra 2 không đúng).
Trang 145 Chương 7: Khử các mặt kuất và đường khuất
Nếu tất cả các phép kiểm tra từ 1 đến 3 đều thất bại (sai), chúng ta thử đến phép kiểm tra 4 bằng cách kiểm tra sự cắt nhau giữa các cạnh biên của hai mặt, dùng các phương trình đường thẳng trong mặt xy. Như được minh họa trong hình 7-13, hai mặt có thể cắt hoặc không cắt nhau thậm chí khi các không gian bao quanh chồng nhau theo các hướng x, y, và z (xem hình 7-13).
Các mặt không cắt nhau Hình 7-13 Hai mặt với các chữ nhật nằm ch biên ồng . nhau trong mặt xy Các mặt cắt nhau
Nếu tất cả bốn phép kiểm tra trên đều thất bại với một mặt nằm chồng cụ thể S’, ta đổi chỗ hai mặt S và S’ cho nhau trong danh sách đã được sắp. Một ví dụ của hai mặt sẽ được sắp xếp lại với thủ tục này được cho trong hình 7-14. Tuy nhiên, ta vẫn không biết chắc rằng ta đã tìm gặp mặt xa nhất tính từ mặt phẳng quan sát chưa. Hình 7-15 minh họa một trường hợp mà tại đó đầu tiên chúng ta đổi chổ S và S’’
với nhau. Nhưng vì S’’
che khuất một phần của S’ (nhìn lên từ mặt xy), chúng ta cần đổi chổ S’’
và S’ với nhau để có ba mặt được sắp hợp lý theo độ sâu. Do đó, chúng ta cần lặp lại quá trình kiểm tra cho mỗi mặt, cái vừa được sắp lại trong danh sách.
Hình 7-14
Mặt S có độ sâu z lớn hơn xv
zv S S’ Hình 7-15
Ba mặt ban đầu đã được sắp theo thứ tự độ sâu z : S,
xv zv S’’ S’ S
Thuật toán vừa được phác thảo có thể đi vào một vòng lặp vô tận nếu hai hay
nhiều mặt che khuất lẫn nhau một cách luân phiên như trong hình 7-7 (xem hình 7-7). Trang 146 Chương 7: Khử các mặt kuất và đường khuất
Trong các trường hợp như thế, thuật toán sẽ lặp đi lặp lại không ngừng việc đổi chỗ vị trí của các mặt nằm chồng nhau. Để tránh các vòng lặp như thế, chúng ta có thể đặt cờ trạng thái cho mặt nào vừa được sắp đến vị trí xa hơn để nó không bị di chuyển lại nữa. Nếu có một sự cố gắng được làm để đổi chỗ các mặt lần thứ hai, ta chia nó ra làm hai phần tại đường cắt (đường giao) của hai mặt. Mặt ban đầu sau đó được thay thế bởi hai mặt mới, và ta lại tiếp tục quá trình xử lý như trước đây.