TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN KHOA CÔNG NGHỆ THÔNG TIN BỘ MÔN CÔNG NGHỆ TRI THỨC DIỆP CHÍ CƯỜNG – 0012523
NGHIÊN CỨU CÁC KỸ THUẬT
HIỂN THỊ MÔ HÌNH ĐỊA HÌNH
BA CHIỀU LUẬN VĂN CỬ NHÂN TIN HỌC GIÁO VIÊN HƯỚNG DẪN
Th.s. ĐINH NGUYỄN ANH DŨNG NIÊN KHÓA 2000 – 2004
Lời cảm ơn
Lời cảm ơn đầu tiên em xin được gởi đến giáo viên hướng dẫn thầy Đinh
Nguyễn Anh Dũng, là người đã tận tình hướng dẫn và chỉ bảo em trong suốt thời
gian thực hiện đề tài tốt nghiệp này.
Kế đến em xin chân thành cảm ơn các thầy cô trong Khoa Công Nghệ Thông
Tin, trường Đại học Khoa học Tự nhiên đã tạo điều kiện thuận lợi cho chúng em trong
suốt bốn năm học Đại học, tạo cho chúng em có nền tảng kiến thức vững chắc.
Và cũng không quên gởi lời cảm ơn sâu sắc đến gia đình, các anh chị và bạn bè
đã ủng hộ, giúp đỡ và động viên trong những lúc khó khăn trong suốt thời gian học
tập cũng như nghiên cứu.
Mặc dù đã cố gắng hết hoàn thành luận văn trong phạm vi và khả năng cho
phép, nhưng chắc chắn sẽ không tránh khỏi những thiếu sót, kính mong sự thông cảm
và tận tình chỉ bảo của quý Thầy Cô và các bạn.
Sinh viên thực hiện
- 1 -
Diệp Chí Cường
Bố cục
Luận văn gồm 6 chương:
• Chương 1: Tổng quan là chương mở đầu, giới thiệu về nhu cầu thực tế
và lý do thực hiện đề tài. Chương này cũng nêu ra các hướng giải quyết
đã được thực hiện.
• Chương 2: Các khái niệm nêu lên một số khái niệm cơ bản liên quan
đến vấn đề đã nêu.
• Chương 3: Thuật toán của Röttger, Chương 4: Thuật toán ROAM và
Chương 5: Thuật toán Diamond mô tả chi tiết một vài thuật toán thông
dụng hiện nay. Các chương này sẽ trình bày cấu trúc dữ liệu, hoạt động
chi tiết của các thuật toán. Cuối cùng sẽ nêu ra những ưu khuyết điểm
của các thuật toán.
• Chương 6: Tổng kết là chương cuối cùng của đề tài. Chương này nêu ra
- 2 -
kết quả đạt được khi thực hiện cài đặt chương trình.
Mục lục
4.1.1 4.1.2 4.2
4.2.1 4.2.2
4.3.1 4.3.2 4.3.3 4.3.4
4.4.1 4.4.2 4.4.3 4.4.4
- 3 -
Chương 1 Tổng quan ......................................................................................................6 1.1 Giới thiệu vấn đề ...............................................................................................6 1.2 Các hướng giải quyết vấn đề .............................................................................7 Chương 2 Các khái niệm ..............................................................................................10 2.1 Đường ống đồ họa (graphics pipeline)............................................................10 2.2 Cấu trúc biểu diễn đỉnh ...................................................................................11 2.3 Thu nhỏ khung cảnh (scene reduction) ...........................................................11 2.4 Các mô hình hiển thị đồ họa............................................................................12 Chương 3 Thuật toán của Röttger ................................................................................13 3.1 Cấu trúc dữ liệu ...............................................................................................13 3.2 Hiển thị bản đồ địa hình ..................................................................................15 3.3 Phát sinh lưới tam giác ....................................................................................16 3.4 Geomorphing...................................................................................................22 3.5 Clipping ...........................................................................................................23 3.6 Ưu và khuyết điểm ..........................................................................................23 Chương 4 Thuật toán ROAM .......................................................................................25 4.1 Biểu diễn..........................................................................................................25 Cây nhị phân tam giác..............................................................................25 Lưới tam giác động và liên tục ................................................................26 Tối ưu với hàng đợi kép ..................................................................................29 Hàng đợi phân chia (split queue) .............................................................29 Hàng đợi kết hợp (merge queue) .............................................................30 4.3 Các khái niệm lỗi (error metrics) ....................................................................32 Các biên xếp chồng trong không gian thế giới ........................................33 Sự méo mó hình học ................................................................................33 Hiệu chỉnh Line-of-site (LOS).................................................................36 Các khái niệm khác..................................................................................36 4.4 Cải tiến quá trình hiển thị ................................................................................37 View-frustum culling ...............................................................................37 T-stripping................................................................................................38 Trì hoãn việc tính toán lại độ ưu tiên.......................................................38 Tối ưu lũy tiến (progressive optimazation)..............................................39 4.5 Ưu điểm và khuyết điểm .................................................................................40 4.5.1 Ưu điểm....................................................................................................40 Khuyết điểm.............................................................................................40 4.5.2 Chương 5 Thuật toán Diamond ....................................................................................42 5.1 Biểu diễn..........................................................................................................42 Cây tứ phân tam giác (triangle quadtree).................................................42 5.1.1
5.1.2 5.1.3 5.2
5.2.1 5.2.2
- 4 -
Các đặc tính..............................................................................................45 Tính liên tục (continuity) của lưới tam giác ............................................45 Thuật toán Diamond........................................................................................46 Các hàng đợi tam giác..............................................................................47 Thuật toán ................................................................................................48 5.3 Ưu và khuyết điểm ..........................................................................................51 Chương 6 Tổng kết .......................................................................................................52
Danh sách hình
99 × . Các mũi tên thể hiện các mối quan
- 5 -
Hình 3-1: Lưới tam giác của bản đồ địa hình hệ cha – con trong cây tứ phân.......................................................................................14 Hình 3-2: Các quạt tam giác được phát sinh đệ qui cho lưới tam giác trong hình 3.1. Dấu gạch chéo chỉ ra các đỉnh được bỏ qua...................................................................16 Hình 3-3: Tiêu chuẩn độ phân giải toàn cục: khoảng cách với kích thước ô trong cây tứ phân. ...............................................................................................................................17 Hình 3-4: Lưới tam giác của một hình phẳng căn cứ vào tiêu chuẩn độ phân giải toàn cục. Các tâm của quạt tam giác có màu trắng và cạnh màu đen....................................17 Hình 3-5: Tính toán độ gồ ghề bề mặt. ..........................................................................19 Hình 3-6: Hạn chế các giá trị d2 của các khối kề nhau nhằm thỏa mãn điều kiện (4). .20 Hình 3-7: Các giá trị d2 được lan truyền từ dưới lên (theo chiều mũi tên). ..................21 Hình 3-8: Lan truyền các giá trị d2 làm cho lưới tam giác tốt hơn gần các cực trị địa phương trong một bề mặt phẳng. ...................................................................................22 Hình 4-1: Mức 0 → 5 của cây nhị phân tam giác. .........................................................26 Hình 4-2: Phép phân chia và kết hợp trên lưới tam giác của cây nhị phân. Quan hệ láng giềng được thể hiện trong tam giác T ở bên trái. ...........................................................28 Hình 4-3: Phép phân chia ép buộc cho tam giác T.........................................................28 Hình 4-4: Các nêm xếp chồng cho miền 1-D phụ thuộc vào v. .....................................33 Hình 4-5: Biên chênh lệch bởi việc chiếu nêm lên màn hình. .......................................35 Hình 4-6: Bên trái là trước khi hiệu chỉnh LOS, bên phải sau khi thực hiện. ...............36 Hình 5-1: Vài mức ban đầu của cây tứ phân tam giác. ..................................................43 Hình 5-2: Định nghĩa tam giác và các mối quan hệ của nó. ..........................................44 Hình 5-3: Phép phân chia và kết hợp. ............................................................................44 Hình 5-4: Tính không liên tục của lưới tam giác. ..........................................................46 Hình 5-5: Hiệu chỉnh lại tính không liên tục cho lưới tam giác. ...................................46 Hình 6-1: Địa hình được hiển thị bằng thuật toán của Röttger......................................52 Hình 6-2 : Địa hình được hiển thị bằng thuật toán ROAM. ..........................................53 Hình 6-3 : Địa hình được hiển thị bằng thuật toán Diamond.........................................54 Hình 6-4 : Địa hình khi được phủ texture. .....................................................................55
Chương 1
Tổng quan
1.1 Giới thiệu vấn đề
Hiện nay, công nghệ thông tin đã xâm nhập vào mọi lĩnh vực của đời sống xã
hội. Tin học đã hỗ trợ cho con người rất nhiều. Có thể nói Tin học đã góp phần làm cho
cuộc sống ngày càng tươi đẹp và có ý nghĩa hơn.
Giờ đây, khi Tin học đã và đang tiến bộ từng ngày làm cho mọi thứ trở nên hiện
đại hơn và dễ sử dụng hơn. Cùng với đà phát triển đó, chúng ta cũng phải kể đến sự
phát triển của công nghệ ba chiều. Trên thế giới, các hãng sản xuất phần cứng đồ họa
hàng loạt tung ra những sản phẩm có tính năng mạnh mẽ và tốc độ xử lý vô cùng
nhanh chóng. Bên cạnh đó, công nghệ ba chiều đã ngày càng được ứng dụng rộng rãi
từ lĩnh vục thương mại, công nghiệp, giải trí, … đến cả quân sự, không gian, …
Do nhu cầu con người ngày càng tăng, việc mô phỏng thế giới thực là điều phải
được thực hiện. Từ những ứng dụng thiết kế ba chiều phục vụ cho việc chế tạo máy
móc thiết bị, xây dựng nhà ở công trình kiến trúc, đến các ứng dụng mô phỏng thử
nghiệm tính năng trong công nghiệp chế tạo xe hơi, máy bay, … Điều này cho thấy
công nghệ ba chiều không thể thiếu được đối với cuộc sống.
Trong đó chúng ta không thể nào không kể đến việc mô phỏng dữ liệu địa hình
trong thế giới thực vào máy tính. Đây là vấn đề được ứng dụng rất rộng rãi chẳng hạn
như trong lĩnh vực không gian, máy tính mô phỏng địa hình bề mặt các hành tinh giúp
cho công việc nghiên cứu thử nghiệm; trong lĩnh vực giải trí, các trò chơi máy tính
- 6 -
cũng đòi hỏi dữ liệu địa hình giúp trò chơi mang tính hiện thực hơn; trong các hệ thống
thông tin địa lý (Geographic Information System – GIS) thì vấn đề này càng không thể
thiếu được; …
1.2 Các hướng giải quyết vấn đề
Trên thực tế, dữ liệu địa hình vô cùng phức tạp và to lớn, nhưng có nhiều ứng
dụng đòi hỏi sự tương tác động thời gian thực từ phía người sử dụng và do đó đòi hỏi
phải xử lý nhanh dữ liệu địa hình để thích nghi với dữ liệu đầu vào từ người dùng.
Nhiều hệ thống máy tính xử lý đồ họa hiện đại cho phép hiển thị hàng ngàn đa
giác được tô bóng hay phủ hình ảnh (texture) ở một tốc độ tương tác. Tuy nhiên, nhiều
ứng dụng chứa đựng các mô hình đồ họa với rất phức tạp về mặt hình học vẫn vượt quá
khả năng của phần cứng đồ họa. Vấn đề này khá phổ biến trong các ứng dụng xử lý các
mô hình bề mặt đa giác rộng lớn, như các chương trình mô phỏng và mô hình hóa địa
hình số.
Để phục vụ cho các mô hình bề mặt phức tạp mà vẫn quản lý được tốc độ hiển
thị thời gian thực, vấn đề này có hai hướng giải quyết, nhưng cả hai đều hướng đến
việc xấp xỉ các bề mặt đa giác hay đơn giản hóa dữ liệu ban đầu. Thứ nhất, các phương
pháp này sử dụng mô hình với đa độ phân giải. Mô hình phức tạp ban đầu sẽ được tổ
chức trong một cấu trúc dữ liệu đơn giản hơn (các mô hình ở nhiều độ phân giải khác
nhau), và sau đó, trong quá trình hiển thị, tùy thuộc vào khoảng cách đến điểm nhìn mà
quyết định mô hình sẽ được hiển thị ở độ phân giải nào (thường thì khi ở gần điểm
nhìn hiển thị chi tiết hơn, khi ở xa điểm nhìn thì hiển thị ít chi tiết hơn). Hướng thứ hai
là cũng sử dụng một cấu trúc dữ liệu để đơn giản hóa địa hình ban đầu nhưng thường là
cấu trúc dạng cây và điều khác biệt so với hướng trên là cấu trúc này sẽ được xây dựng
không phải ở bước tiền xử lý mà ngay trong lúc hiển thị địa hình.
Một vài phương pháp xử lý địa hình hiệu quả đã được đưa ra. Cây tứ phân có lẽ
là cấu trúc có ưu thế nhất trong các thuật toán địa hình; các phương pháp sử dụng việc
- 7 -
thiết lập tính có thể trông thấy (visibility) hay các mức độ chi tiết dựa trên các khối đã
được đưa ra; và các mạng tam giác bất qui tắc (trianglar irregular networks – TINs) là
phổ biến trong các thuật toán có mức độ chi tiết liên tục.
Các cây tứ phân thích hợp tốt với việc tổ chức cấu trúc dữ liệu theo bản đồ chiều
cao hai chiều và do đó nổi bật trong các thuật toán khảm địa hình (terrain tessellation
algorithm). Cấu trúc phân cấp của cây tự cung cấp tốt cho view frustum culling và do
đó các cây tứ phân thường được sử dụng ở trước các thuật toán địa hình để phục vụ
như là một cơ chế lọc (view culling).
A. James Stewart đã mô tả một tập hợp tính nhìn thấy phân cấp (hierarchical
visibility) cho địa hình, nó được lưu trữ trong một cây tứ phân hoàn chỉnh và có thể
được sử dụng để lọc (cull) các vùng rộng lớn một cách hiệu quả. Phương pháp này hoạt
động tốt nếu kết hợp với các thuật toán khác có dựa vào việc tính toán LOD.
Willem H. de Boer lại mô tả một thuật toán gần gũi hơn với phần cứng mà sử
dụng các tập hợp mức độ chi tiết theo khối (block-based level-of-detail) được gọi là
GeoMipMaps. Ông ta đã đề nghị một cải tiến cho thuật toán cơ bản để hạn chế hiện
tượng vertex poping (các đỉnh xuất hiện đột ngột) có dạng GeoMipMap tam tuyến
(trilinear GeoMipMap), xác định LOD khối này với các khối khác; điều này biến đổi
dần dần từ thuật toán mức độ ưu tiên theo khối sang thuật toán mức độ ưu tiên liên tục.
Một số phương pháp theo hướng cổ điển, như thuật toán Diamond, đều tận dụng
các mạng TINs để thực hiện quá trình hiển thị địa hình. TINs là mạng các tam giác
trong đó tất cả các tam giác có hình dạng giống nhau nhưng lại thay đổi về kích thước
liên quan đến những tam giác khác. Mạng này đã được Lindstrom, Röttger và
Duchaineau tận dụng với các dạng khác nhau.
Lindstrom đưa ra một thuật toán để có được mức độ chi tiết liên tục trong một
lưới chữ nhật sử dụng cây tứ phân thay đổi động và chiến thuật từ dưới lên (bottom-up).
Röttger thực hiện ngược lại với Lindstrom, và đưa ra một thuật toán để có được
kết quả tương tự bằng cách sử dụng cây tứ phân hoàn chỉnh và được duyệt theo thứ từ
- 8 -
từ trên xuống (top-down).
Duchaineau đưa ra thuật toán ROAM nhằm quản lý việc lập lưới tam giác có
mức độ chi tiết liên tục bằng cách sử dụng các phép toán phân chia và kết hợp dựa trên
đỉnh.
Henri Hakl đưa ra thuật toán Diamond tương tự như thuật toán ROAM nhưng
- 9 -
có một số cải tiến nhằm tăng tốc độ hiển thị.
Chương 2
Các khái niệm
2.1 Đường ống đồ họa (graphics pipeline)
Việc hiển thị đồ họa có liên quan đến việc đơn giản hóa khung cảnh (scene),
một tập hợp dữ liệu không gian 3 chiều thành một tập hợp con nhỏ hơn và nhìn thấy
được trên màn hình, rồi sau đó là hiển thị tập hợp này.
Để hiển thị một khung cảnh chúng ta chú ý rằng một khung cảnh bao gồm nhiều
đa giác mà thường là tập hợp các tam giác với các mục đích hiển thị phần cứng. Quá
trình hiển thị đi qua đường ống đồ họa thực hiện các phép biến đổi cho các đỉnh của
tam giác tùy theo điểm nhìn (point-of-view) hiện tại và sau đó được chiếu từ không
gian thế giới sang không gian màn hình tùy theo viewing frustum. Điểm nhìn sẽ quyết
định vị trí và hướng từ đó khung cảnh sẽ được hiển thị, trong khi đó viewing frustum
lại quyết định phạm vi của vùng nhìn thấy (field-of-view – FOV).
Sau khi thực hiện xong phép biến đổi và phép chiếu, tam giác sẽ được chiếu
sáng (nghĩa là tính toán độ sáng trên nó) và được cắt xén (clip – nghĩa là chỉ những
phần nào nhìn thấy mới được vẽ) và sau đó cuối cùng là vẽ nó lên bộ đệm đồ họa. Một
số phương pháp có thể được chấp nhận trong lúc đang vẽ các tam giác như wire-frame,
solid, textured và bump-mapped.
Wireframe chỉ hiển thị các đường thẳng nối các đỉnh đa giác, solid chỉ hiển thị
thông tin màu sắc, texturing sử dụng hình ảnh hay dữ liệu thủ tục được chiếu lên đa
giác, bump-mapping phủ hình ảnh lên bề mặt đa giác và sử dụng một số dạng kỹ thuật
- 10 -
tô bóng để tạo ra cảm giác độ sâu cho hình ảnh.
2.2 Cấu trúc biểu diễn đỉnh
Các đỉnh của tam giác được sử dụng trong đường ống đồ họa có thể được biểu
diễn theo một số cách, đơn giản nhất là danh sách tam giác (triangle-list). Danh sách
tam giác chỉ đơn giản là lưu trữ các đỉnh trong một tập hợp bộ ba tương ứng với ba
đỉnh của tam giác.
Một danh sách tam giác có thể chứa các thông tin thừa, nếu như hầu hết các tam
giác đều có các đỉnh chung. Dãy tam giác (triangle-strip) và quạt tam giác (triangle-
fan) đều quan tâm đến điều này và đều đưa ra một cấu trúc biểu diễn đỉnh tiết kiệm
dung lượng bộ nhớ và thời gian xử lý.
Cấu trúc biểu diễn đỉnh theo chỉ mục cung cấp chi phí lưu trữ và hiển thị tốt
nhất bằng cách chỉ lưu các đỉnh duy nhất và sử dụng bộ đệm chỉ mục để kết hợp các
đỉnh thành tam giác. Bộ đệm chỉ mục tự nó cung cấp một số các biểu diễn tương ứng
với danh sách chỉ mục (index-list), dãy chỉ mục (index-strip) và quạt chỉ mục (index-
fan).
2.3 Thu nhỏ khung cảnh (scene reduction)
Một khung cảnh thường không được hiển thị toàn bộ mà giảm đi thành một tập
hợp con. Việc rút gọn này thường được thực hiện bởi culling các tập hợp tam giác.
Culling ngụ ý việc loại bỏ khỏi tập con đã hiển thị và quá trình culling có nhiều dạng;
ví dụ như khử mặt khuất (backface culling) sẽ loại bỏ đi tất cả các tam giác quay lưng
lại với điểm nhìn (nghĩa là pháp tuyến của tam giác không chỉ về phía điểm nhìn. Các
dạng khác của culling thường cố gắng loại bỏ đi các tập tam giác, ví dụ như hộp giới
hạn (bounding box) bao quanh một tập hợp các tam giác nếu nằm bên ngoài vùng nhìn
thầy (field-of-view) thì không có một tam giác nào trong tập hợp đó được hiển thị cả.
Một dạng khác của việc rút gọn tam giác được thực hiện trong mức độ chi tiết
(level-of-detail – LOD) và sơ đồ LOD liên tục. Những dạng này giảm bớt các tam giác
- 11 -
bằng cách tìm một số lượng tam giác ít hơn mà xấp xỉ được một mô hình đã cho. Một
LOD đơn giản có thể lưu trữ các đối tượng nhiều hay ít chi tiết của cùng một đối tượng
và sử dụng chúng cho phù hợp, trong khi các sơ đồ phức tạp hơn có thể tính toán LOD
trong lúc đang thực hiện. Một thuật toán LOD liên tục có thể tạo ra một tập hợp rất lớn
các xấp xỉ mà có thể thay đổi chỉ một tam giác.
2.4 Các mô hình hiển thị đồ họa
Hiển thị đồ họa cố gắng tạo ra cấu trúc biểu diễn ảo cho dữ liệu mô hình để sử
dụng trong quá trình hiển thị. Chúng ta phân loại một mô hình để biểu diễn một đối
tượng, nội thất trong nhà, môi trường ngoài trời hay hỗn hợp.
Một đối tượng có thể là các thực thể - bàn, ghế, con người,… Những đối tượng
động tương tác với khung cảnh và sở hữu một trí thông minh nhân tạo đều được gọi là
nhân vật. Dữ liệu thô kết hợp với các đối tượng này thường là một tập hợp các đỉnh.
Môi trường trong nhà biểu diễn cho các tòa nhà và kiến trúc, thường được nhìn
từ bên trong. Một hệ thống cống rãng và một tòa thánh đường đều là ví dụ của môi
trường trong nhà. Tương tự như đối tượng, dữ liệu thô kết hợp với môi trường trong
nhà thường là tập hợp các đỉnh.
Môi trường ngoài trời bao gồm địa hình, núi, rừng và biển, … Dữ liệu địa hình
thường được lưu trữ dưới dạng bản đồ chiều cao (height field). Bản đồ chiều cao là một
hình ảnh 2 chiều trong đó giá trị tại mỗi điểm được diễn giải thành chiều cao tại điểm
đó. Bất kỳ một hình ảnh nào cũng có thể là một bản đồ chiều cao.
Các dạng khác nhau của mô hình sở hữu các tính chất khác nhau, nó sẽ làm cho
một phương pháp cụ thể sẽ có được những thuận lợi cho từng mô hình cụ thể hơn là
những mô hình khác. Trong báo cáo này chúng ta chỉ chú trọng vào môi trường ngoài
trời và đặc biệt là mô hình địa hình và sẽ mô tả các phương pháp quản lý và hiển thị
- 12 -
hiệu quả.
Chương 3
Thuật toán của Röttger
Năm 1998, Stefan Röttger đã đưa ra một thuật toán CLOD được xây dựng trên
công việc của Peter Lindstrom đã thực hiện trước đó. Giả thuyết cơ bản được
Lindstrom đưa ra là việc sử dụng cây tứ phân để tận dụng được bản đồ chiều cao. Sử
dụng phương pháp từ dưới lên, cây tứ phân này được dùng để phát sinh việc khảm
(tesselation) LOD liên tục của dữ liệu địa hình theo thời gian thực.
Röttger đề xuất một cơ chế khác nhằm tận dụng việc làm mịn theo chiến thuật
từ trên xuống đối với cây tứ phân phân cấp để tạo một quá trình khảm CLOD thời gian
thực cho dữ liệu landscape.
3.1 Cấu trúc dữ liệu
n
n
2
21
1
×+
+
Cấu trúc dữ liệu bên dưới của thuật toán là một cây tứ phân. Trong thuật toán
. Một lưới được tạo ra bởi
này, ta giả sử bản đồ địa hình có kích thước thuật toán như trong hình 3.1.
Cây tứ phân được biểu diễn bởi một ma trận các giá trị nhị phân với mỗi tập hợp
các mục (entry) cho trọng tâm của khối (block), nếu một nút tương ứng được làm mịn.
- 13 -
Ma trận cây tứ phân của lưới ví dụ trong hình 3.1 được thể hiện như sau:
99 × . Các mũi tên thể hiện các mối quan
Hình 3-1: Lưới tam giác của bản đồ địa hình
hệ cha – con trong cây tứ phân.
Các mục trong ma trận đánh dấu bằng dấu chấm hỏi không cần được thiết lập
trong quá trình tính toán cho lập lưới tam giác, từ đó thuật toán top-down không truy
cập các giá trị này trong một lưới tam giác đã cho. Bởi vì số lượng các nút được viếng
thăm trong mỗi frame chỉ phụ thuộc vào chất lượng hiển thị, nhưng không phụ thuộc
vào kích thước của bản đồ địa hình, yêu cầu băng thông bộ nhớ bị hạn chế bởi chất
- 14 -
lượng hình ảnh mà ta mong muốn.
3.2 Hiển thị bản đồ địa hình
Bản đồ địa hình được lập lưới tam giác sẽ được vẽ bằng cách duyệt đệ qui toàn
bộ cây tứ phân và các entry trong ma trận tương ứng sẽ được thiết lập. Chỉ khi nào
duyệt đến lá của cây tứ phân thì một phần quạt tam giác (fan) hay một quạt tam giác
hoàn chỉnh được vẽ lên. Các quạt tam giác (triangle fan) rất thích hợp với việc vẽ lưới
tam giác ở các độ phân giải (resolution) khác nhau: để tránh các bẫy ở những khối kế
cận nhau mà có độ phân giải khác nhau, một lưới tam giác thích hợp được tạo ra một
cách đơn giản bằng cách bỏ qua những trung điểm của các cạnh (xem hình 3.2).
Phương pháp này chỉ thực hiện nếu các mức chi tiết (level) của các nút kề nhau chênh
lệch không quá 1 đơn vị. Ở cuối phần kế tiếp, chúng ta sẽ xem yêu cầu này được quản
lý như thế nào trong suốt quá trình hiển thị bằng cách tiền xử lý bản đồ địa hình và lưu
trữ thông tin về độ gồ ghề của bề mặt
Trong quá trình phát sinh các quạt tam giác, chúng ta cần phải quyết định xem
các nút kề nhau có được chia nhỏ ra để có cùng mức chi tiết hay không. Nếu nút láng
giềng không được chia nhỏ để có cùng mức chi tiết thì chúng ta có thể bỏ qua trung
điểm của cạnh chung. Trường hợp này có thể được phát hiện bằng cách kiểm tra các
entry trong ma trận tương ứng với nút láng giềng, sau đó được đặt bằng 0 (chú ý rằng
việc truy cập vào các entry ma trận, không được thiết lập, được loại bỏ đảm bảo độ
- 15 -
chênh lệch mức chi tiết nhỏ hơn hoặc bằng 1).
Hình 3-2: Các quạt tam giác được phát sinh đệ qui cho lưới tam giác trong hình 3.1. Dấu gạch chéo chỉ ra các đỉnh được bỏ qua.
3.3 Phát sinh lưới tam giác
Trước khi một khung cảnh được hiển thị như đã mô tả trong phần trước, lưới
tam giác phải được xây dụng bằng duyệt đệ qui cây tứ phân. Ở mỗi nút con, một tiêu
chuẩn chia nhỏ nhị phân được đánh giá và kết quả của nó được lưu trữ trong ma trận
cây tứ phân. Nếu điều kiện thõa mãn và mức chi tiết (level of detail) tốt nhất vẫn chưa
đạt tới, thì chúng ta sẽ duyệt sâu xuống cây tứ phân qua tất cả bốn nút con.
Một số khía cạnh cần được quan tâm đến đối với tiêu chuẩn này: trước hết, độ
phân giải nên giảm khi khoảng cách đến điểm nhìn tăng. Điều kiện này có thể được
C
<
đảm bảo bằng cách thỏa mãn:
l d
(1)
với một số hằng số C, trong đó l là khoảng cách từ điểm nhìn, và d là chiều dài cạnh
- 16 -
của khối (xem hình 3.3 và 3.4). C là một tham số chất lượng có thể cấu hình lại được.
Hình 3-3: Tiêu chuẩn độ phân giải toàn cục: khoảng cách với kích thước ô trong cây tứ phân.
Hằng số C điều khiển độ phân giải toàn cục cực tiểu. Nếu C tăng, số lượng toàn
bộ các đỉnh trong mỗi frame cũng sẽ tăng theo bậc 4. Chú ý rằng điều kiện trên chỉ
được đánh giá một lần duy nhất cho một quạt tam giác hoàn chỉnh, bao gồm đến 10
1L –norm.
đỉnh. Để cho phép việc tính toán hiệu quả, việc đo khoảng cách được thực hiện sử dụng
- 17 -
Hình 3-4: Lưới tam giác của một hình phẳng căn cứ vào tiêu chuẩn độ phân giải toàn cục. Các tâm của quạt tam giác có màu trắng và cạnh màu đen.
Với tiêu chuẩn thứ hai, chúng ta muốn tăng độ phân giải của các vùng có bề mặt
gồ ghề cao. Thực tế, chúng ta muốn cực tiểu hóa lỗi của đỉnh đã được chiếu lên màn
hình, đây là một đại lượng tốt cho chất lượng hình ảnh. Khi tăng lên một mức chi tiết
thì lỗi mới phát sinh ở 5 điểm: ở tâm của nút trong cây tứ phân và 4 trung điểm của các
cạnh. Một chặn trên cho lỗi xấp xỉ trong không gian 3 chiều có thể có được bằng cách
idh (xem hình 3.5).
lấy giá trị lớn nhất trong các giá trị chênh lệch độ cao tuyệt đối
Chênh lệch độ cao được tính dọc theo các cạnh và đường chéo của nút, tổng cộng có 6
giá trị cho mỗi nút. Lỗi trong không gian 3 chiều được phát sinh khi xuống một mức
trong cây tứ phân bây giờ có thể được tính toán bằng cách tính trước giá trị lớn nhất
của các giá trị chênh lệch độ cao tuyệt đối, hay xen kẽ với việc tính các giá trị gồ ghề
d
2
=
bề mặt, mà chúng ta gọi là giá trị d2.
dh i
max 6..1 i =
1 d
(2)
Các giá trị d2 của một nút nhân với chiều dài cạnh d của nút tương ứng với lỗi
xấp xỉ trong không gian 3 chiều. Do đó, giá trị d2 nhân với d chính là chặn trên cho lỗi
phát sinh khi tăng một mức chi tiết.
Tiêu chuẩn chia nhỏ trên đã chỉnh sửa bao gồm các giá trị d2 cho việc xử lý độ
f
=
)1,2
gồ ghề bề mặt bây giờ có thể đưa ra với biến quyết định f.
l max( Cd dc ⋅ ⋅ ⋅ subdivide 1 if f <
(3)
Giá trị hằng số C một lần nữa quyết định độ phân giải toàn cục cực tiểu, nhưng
ngược lại hằng số mới c lại chỉ ra độ phân giải toàn cục mong muốn. Hằng số sau ảnh
hưởng trực tiếp đến số lượng đa giác được hiển thị trong mỗi frame. Do đó, bằng cách
- 18 -
thay đổi c, chúng ta có thể quản lý để có được tốc độ cố định.
Hình 3-5: Tính toán độ gồ ghề bề mặt.
Vấn đề quan trọng còn lại là làm cách nào để đảm bảo chênh lệch mức chi tiết
cho các khối kế cận nhau phải nhỏ hơn hoặc bằng 1. Từ đó độ gồ ghề bề mặt của các
khối kề nhau có thể khác nhau đáng kể, điều này cần thiết để xây dựng một lưới tam
giác thích hợp mà không có lỗ thủng nào. Sau đây chúng ta sẽ mô tả làm cách nào để
có được như vậy.
Trước tiên giả sử rằng điều kiện (3) được thỏa mãn cho một khối cho trước (f2 <
1), nên khối này được chia nhỏ. Trong trường hợp này, tất cả các khối kề nhau có chiều
dài cạnh gấp đôi cũng phải được chia nhỏ. Do đó, điều kiện sau nhất định phải thỏa
mãn đối với biến quyết định f1 của một khối kề nhau để giới hạn độ chênh lệch mức chi
f
<
tiết.
1
f ⇔< 2
2
l 2 d
2
l 1 dd ⋅
2
1
d ⋅ 2
(4)
l1 luôn nhỏ hơn độ phân giải cực tiểu C. Còn nếu nằm bên ngoài vùng
Với điểm nhìn nằm ở trong vùng chữ nhật (hình 3.6) biểu thức (3) luôn được
1 (khoảng cách điểm nhìn ở
thỏa mãn, khi d
l 1 2l
2
này, thì giá trị phân số bị giới hạn lại trong khoảng từ 2
- 19 -
vô cực) và hằng số K.
K
<
<
1 2
l 1 2 l
K
=
=
(2
)1
2 L 1 2 L
C C −
2
(5)
thỏa mãn
d d
1 1 2
l 1 2l
2
2
lớn hơn K, sau đó điều kiện (4) thỏa mãn, khi Mặt khác, nếu
K
điều kiện (5). Tuy nhiên, khi giá trị d2 tương ứng với độ gồ ghề bề mặt, có thể tăng lên
2 d ≤ 1 2 d
2
, sau đó chúng ta một cách tùy ý, điều kiện (4) không tự thỏa mãn. Do đó, nếu
phải thay đổi các giá trị d2 như sau: Bắt đầu với khối tồn tại nhỏ nhất, chúng ta tính các
giá trị d2 cục bộ của tất cả các khối và lan truyền chúng trong cây. Giá trị d2 của mỗi
khối là giá trị cực đại của giá trị cục bộ và K nhân với các giá trị đã tính từ trước đó của
các khối kề nhau ở mức chi tiết thấp hơn kế tiếp. Trong ví dụ này, các giá trị d2 được
lan truyền từ lá lên gốc của cây tứ phân thể hiện trong hình 3.7.
- 20 -
Hình 3-6: Hạn chế các giá trị d2 của các khối kề nhau nhằm thỏa mãn điều kiện (4).
Hình 3-7: Các giá trị d2 được lan truyền từ dưới lên (theo chiều mũi tên).
Đến đây, chúng ta chỉ xem xét trường hợp 2 chiều, nhưng với một vài chú ý
chúng ta có thể chấp nhận nó trong 3 chiều. Trong trường hợp này, độ cao của điểm
nhìn cần phải được quan tâm liên quan đến tâm của các ô trong cây tứ phân. Tuy nhiên,
khi bản đồ chiều cao thường có chiều cao nhỏ hơn so với kích thước của chúng,
khoảng cách này có thể được xấp xỉ bằng độ chênh lệch giữa điểm nhìn và độ cao
trung bình của các nút trong cây tứ phân.
Ví dụ về ảnh hường của sự lan truyền các giá trị d2 khắp bản đồ chiều cao, và
ảnh hưởng của nó lên lưới tam giác đã cho trong hình 3.8. Có một số cực trị nằm trên
- 21 -
bề mặt phẳng.
Hình 3-8: Lan truyền các giá trị d2 làm cho lưới tam giác tốt hơn gần các cực trị địa phương trong một bề mặt phẳng.
3.4 Geomorphing
Đến đây, chúng ta chỉ ra làm thế nào để lập lưới tam giác và hiển thị một bản đồ
1
địa hình, nhưng hiện tượng popping khi điểm nhìn di chuyển vẫn xảy ra. Nhớ rằng biến
quyết định f từ biểu thức (3): Kiểm tra thấy rằng nếu f nằm trong khoảng , thì cây
[ 1,2 )
1 chỉ ra rằng nút đó có ít nhất một nút con, trong khi các giá trị lớn
tứ phân không được làm mịn hơn nữa, và một quạt tam giác được tạo ra cho nút này.
Các giá trị nhỏ hơn 2
hơn 1 thì nút đó không có nút con nào cả.
b
1(2
f
)
=
−
Nếu morphing chỉ xảy ra ở các nút lá của lưới tam giác hiện tại, chúng ta có thể
sử dụng được giới hạn trong đoạn [0, 1] như là một hệ số blend cho những
chỗ ranh giới giữa hai mức chi tiết (xem hình 3.5). Phụ thuộc vào các nút kề nhau trong
cây tứ phân được chia nhỏ sâu đến bao nhiêu, có đến 5 đỉnh mà phải thực hiện
morphing cho mỗi nút trên cây (xem hình 3.2 và 3.6). Độ cao ở những điểm này được
nội suy tuyến tính với hệ số b giữa độ cao của mức chi tiết thấp nhất (là trung bình của
hai điểm góc tương ứng) và độ cao của mức chi tiết cao nhất có thể lấy trực tiếp từ dữ
liệu bản đồ chiều cao.
Cần phải cẩn thận để tránh các hiện tượng xuất hiện các vết nứt (cracks) và tạo
- 22 -
ra một lưới cho phù hợp. Các hệ số blending của các khối kế cận hơi khác nhau căn cứ
vào việc thay đổi khoảng cách đến điểm nhìn. Do đó, độ cao nội suy ở trung điểm của
cạnh chung là khác nhau đối với các khối kề nhau, nên làm cho các vết nứt xuất hiện.
Để tránh hiện tượng này, chúng ta lưu các hệ số blending trong ma trận nhị phân.
Giá trị blending cho cạnh chung có được bằng cách lấy cực tiểu các giá trị blending của
hai khối. Giá trị bằng 0 chỉ ra rằng không chia nhỏ nữa, trong khi các giá trị biểu diễn
cho các hệ số blending. Chúng ta tránh lưu trữ các giá trị số thực bằng cách sử dụng
một byte cho mỗi entry. Kết quả chúng ta có 255 bước morphing, đủ chính xác trong
thực tế.
3.5 Clipping
Một cải tiến phổ biến để giảm số lượng đa giác hiển thị đó là clipping với
viewing – frustum. Khi chúng ta sử dụng cây tứ phân, chúng ta cũng có thể sử dụng nó
cho việc clipping. Như đã cung cấp, mức chi tiết không quá cao, hộp giới hạn
(bounding box) được tính toán cho mỗi nút, để có thể sử dụng cho clipping với
viewing-frustum. Theo cách này, hầu hết các đỉnh không nhìn thấy có thể được loại bỏ
ở giai đoạn sớm của thuật toán một cách ít tốn kém. Clipping có thể được áp dụng cho
cả hai quá trình phát sinh lưới tam giác và quá trình hiển thị. Đối với quá trình phát
sinh lưới tam giác chúng ta xem như hộp giới hạn lớn gấp 3 lần, bởi vì các hệ số
blending của một số khối có thể góp phần vào quá trình phát sinh lưới tam giác mà các
khối đó không được nhìn thấy.
3.6 Ưu và khuyết điểm
Ưu điểm chính của thuật toán này là nhu cầu dụng lượng bộ nhớ cho cấu trúc
biểu diễn là ít hơn so với các thuật toán khác. Một lần thiết lập, thuật toán yêu cầu chỉ
một byte phụ cho mỗi phần tử dữ liệu địa hình. Byte này lưu giá trị variance và làm
- 23 -
mịn nút của toàn bộ cây. Không có không gian bộ nhớ cố định phụ nào yêu cầu thêm.
Khuyết điểm chính của thuật toán này là thiếu sơ đồ hiển thị cố kết frame (frame
corehency). Tính cố kết frame tận dụng dữ liệu khảm của frame trước đó để tạo ra lưới
kết quả của frame hiện tại. Cơ chế này thực hiện công việc có độ phức tạp O(số lượng
tam giác thay đổi), thường khoảng nhỏ hơn 5% mỗi frame. Thuật toán của Röttger có
nn × điểm dữ liệu.
- 24 -
độ phức tạp O(log n), với bản đồ chiều cao có
Chương 4
Thuật toán ROAM
Thuật toán ROAM (Real-time Optimally Adapting Meshes) được Mark
Duchaineau đưa ra năm 1997. Thuật toán này tận dụng quá trình phân chia và kết hợp
để tạo ra lưới tam giác một cách hiệu quả. Ý tưởng tận dụng các thủ tục phân chia và
kết hợp để tạo ra lưới tam giác gắn kết frame (frame coherency – nghĩa là lưới tam giác
của frame này sẽ được xây dựng từ lưới tam giác của frame trước đó thông qua phép
phân chia và kết hợp) đã được xúc tiến bởi Lindstrom trước đó – nhưng Duchaineau đã
quan sát những hàm ý bên trong những khái niệm về cây nhị phân tam giác và sau đó
phát biểu có hệ thống lại thành thuật toán ROAM rất thành công. Thuật toán này ngày
nay được sử dụng rộng rãi trong rất nhiều ứng dụng liên quan đến địa hình. Và hiện
nay người ta còn áp dụng thuật toán này vào việc hiển thị một đối tượng tổng quát.
4.1 Biểu diễn
4.1.1 Cây nhị phân tam giác
Nếu cây tứ phân theo dạng hình vuông có bản sau là cây tứ phân tam giác, thì
cây nhị phân theo dạng hình chữ nhật quen thuộc lại có bản sau là cây nhị phân tam
giác ít được biết đến. Hình dưới đây thể hiện vài mức đầu của cây nhị phân tam giác.
Tam giác gốc T = (va, v0, v1) được định nghĩa là một tam giác vuông cân ở mức (level)
thô nhất, l = 0. Ở mức kế tiếp tốt hơn, l = 1, các con của tam giác gốc được định nghĩa
bằng cách phân chia tam giác gốc theo đoạn thẳng nối từ đỉnh của tam giác va tới trung
- 25 -
điểm vc của cạnh huyền (v0, v1). Tam giác con trái của T là T0 = (vc, va, v0), trong khi đó
tam giác con phải của T là T1 = (vc, v1, va). Phần còn lại của cây nhị phân tam giác
được định nghĩa bằng cách đệ qui lặp đi lặp lại tiến trình phân cách này.
Hình 4-1: Mức 0 → 5 của cây nhị phân tam giác.
4.1.2 Lưới tam giác động và liên tục
Các lưới điểm trong không gian thế giới được hình thành bằng việc gán các vị
trí trong không gian thế giới w(v) cho các đỉnh của cây nhị phân. Một tập hợp các tam
giác của cây nhị phân tạo thành một lưới điểm liên tục khi không có bất kì hai tam giác
nào chồng lên nhau ở bất kì đâu ngoại trừ chúng có chung đỉnh và chung cạnh. Chúng
ta chỉ quan tâm đến những lưới liên tục như lưới tam giác cho cây nhị phân hay đơn
giản là lưới tam giác (triangulation). Hình 4.2 mô tả một láng giềng điển hình của tam
giác T trong lưới tam giác. Chúng ta định nghĩa TB là láng giềng đáy (base neighbor)
chia sẻ cạnh huyền (v0, v1), TL là láng giềng trái (left neighbor) chia sẻ cạnh trái (va, v0),
và TR là láng giềng phải (right neighbor) chia sẻ cạnh phải (v1, va) của tam giác.
Một điểm then chốt về lưới tam giác cho cây nhị phân là các láng giềng đó đều
- 26 -
có cùng mức (level) l với T, hay có mức tốt hơn liên tiếp l + 1 đối với các láng giềng
trái và phải, hay có mức thô hơn liên tiếp l – 1 đối với các láng giềng đáy. Tất cả các
quan hệ này được mô tả thông qua các tam giác trong Hình 4.3.
Khi T và TB đều có cùng mức l, chúng ta xem cặp (T, TB) như là một hình thoi
(diamond). Phép phân chia và phép kết hợp (phép đảo của phép phân chia) cũng được
mô tả trong Hình 4.3 cho lưới tam giác có chứa hình thoi. Phép phân chia sẽ thay thế
tam giác T bằng các tam giác con (T0, T1), và tam giác TB bằng hai tam giác con (TB1,
TB2). Phép phân chia này sẽ tạo ra một đỉnh mới vc ở tâm của hình thoi, và cho kết quả
là một lưới tam giác mới. Nếu tam giác T không có láng giềng đáy TB, thì chỉ có tam
giác T bị phân chia thành hai tam giác con. Phép kết hợp có thể được áp dụng cho hình
thoi (T, TB) khi tất cả các tam giác con của T và TB (nếu TB tồn tại) đều có trong lưới
tam giác. Trong trường hợp này, chúng ta nói (T, TB) là một hình thoi khả hợp
(mergeable diamond) của lưới tam giác.
Một vấn đề quan trọng về các phép phân chia và kết hợp là bất kì lưới tam giác
nào đều có thể có được từ bất kì một lưới tam giác khác thông qua một chuỗi các phép
phân chia và kết hợp.
Chúng ta có thể tạo chuyển động cho các phép phân chia và kết hợp thông qua
kỹ thuật morphing đỉnh để tạo nên tính liên tục tạm thời cho các đỉnh mới. Với khoảng
thời gian t ∈ [0, 1], giả sử có phép phân chia một hình thoi (T, TB) như trong Hình 4.2.
Thay vì di chuyển điểm vc ngay đến vị trí mới của nó wc=w(vc), mà ta cho nó di chuyển
(
)
2/))
1(
vw (
wt )
=
+
=
−
+
dần dần trên đoạn thẳng từ trung điểm cạnh huyền lúc chưa phân chia
wm
tw )( a
tw c
m
vw ( 1
0
- 27 -
đến vị trí mới: . Và tương tự phép kết hợp.
Hình 4-2: Phép phân chia và kết hợp trên lưới tam giác của cây nhị phân. Quan hệ láng giềng được thể hiện trong tam giác T ở bên trái.
Tam giác T không thể phân chia được khi tam giác láng giềng đáy TB ở mức thô
hơn. Để tam giác T có thể phân chia thì tam giác TB bắt buộc phải được phân chia trước,
phép phân chia này có thể kéo dài thành chuỗi đệ qui. Trong Hình 4.3 ta cần đến 4
phép phân chia. Do đó các phép phân chia ép buộc (forced splits) là cần thiết cho thuật
toán tối ưu trong phần sau.
Hình 4-3: Phép phân chia ép buộc cho tam giác T.
Lưới tam giác ban đầu gồm nhiều tam giác có thể được sử dụng để biểu diễn
một đa giác bất kì. Nếu lưới tam giác ban đầu chỉ gồm các hình thoi, thì các phép phân
chia và kết hợp có thể được sử dụng một cách tự do như trong trường hợp chỉ có một
- 28 -
tam giác gốc. Đối với địa hình, lưới tam giác thông thường là một hình thoi.
4.2 Tối ưu với hàng đợi kép
Các phép phân chia và kết hợp cung cấp một cách uyển chuyển cho việc cập
nhật lưới tam giác được tốt hơn. Chúng ta không cần quan tâm đến việc tránh các vết
nứt (cracks) hay các đỉnh có dạng T (T-vertices). Trong phần này sẽ giới thiệu một
thuật toán vét cạn dùng để vận hành quá trình phân chia và kết hợp. Ý tưởng rất đơn
giản: lưu các giá trị độ ưu tiên (priorities) cho mỗi tam giác trong lưới tam giác, bắt đầu
với lưới tam giác ban đầu (base triangulation), và thực hiện phép phân chia ép buộc lặp
đi lặp lại cho tam giác có giá trị ưu tiên cao nhất. Như vậy, tiến trình này tạo ra một
chuỗi lưới tam giác để cực tiểu hóa giá trị ưu tiên cực đại (thường là một biên lỗi –
error bound) ở mỗi bước lặp. Yêu cầu duy nhất để bảo đảm cho tính tối ưu này đó là
các giá trị độ ưu tiên phải đơn điệu (monotonic), nghĩa là giá trị ưu tiên của tam giác
con không được lớn hơn của tam giác cha. Thêm một hàng đợi ưu tiên thứ hai – cho
các hình thoi có thể kết hợp lại được – cho phép một thuật toán vét cạn có thể bắt đầu
từ một lưới tam giác tối ưu trước đó khi các giá trị độ ưu tiên thay đổi, và do đó sẽ có
ưu điểm là tận dụng được tính phụ thuộc của các ảnh với nhau.
4.2.1 Hàng đợi phân chia (split queue)
Giả sử rằng với mỗi tam giác T đều có một giá trị ưu tiên đơn điệu p(T)∈[0,1].
Khi lưới tam giác T được xây dựng từ trên xuống, chúng ta sẽ quản lý một hàng đợi ưu
tiên Qs chứa tất cả các tam giác hiện tại có trong T. Thuật toán vét cạn từ trên xuống
như sau:
Đặt T = lưới tam giác ban đầu.
Với tất cả T ∈ T, chèn T vào Qs.
Trong khi T quá nhỏ hay không chính xác {
Tìm T có giá trị ưu tiên cao nhất trong Qs.
Phân chia ép buộc cho T.
- 29 -
Cập nhật hàng đợi phân chia như sau: {
Xóa T và các tam giác phân chia khác khỏi Qs.
Thêm các tam giác mới trong T vào Qs.
}
}
Thuật toán vét cạn này tạo ra các lưới tam giác tối ưu tại mỗi bước lặp. Giả sử
có lưới tam giác khác T’ có giá trị ưu tiên cực đại nhỏ hơn T. Rõ ràng là T’ nhất định
chỉ chứa các con cháu của tất cả các tam giác bị ép buộc phân chia trong khi xây dựng
T. Bởi vì phép phân chia ép buộc (force-split) tạo ra các bước làm mịn cần thiết ít nhất
mà vẫn giữ được tính liên tục, nên T’ không thể chứa bất kì tổ tiên nào cả của các tam
giác trong T. Cuối cùng, bởi vì T’ có giá trị ưu tiên thấp hơn, nên nó nhất định chỉ
chứa các con cháu của ít nhất một tam giác trong T. Do đó, T’ có nhiều tam giác hơn T
và vì thế nên T là tối ưu. Tổng số các phép phân chia và kết hợp được thực hiện bởi
thuật toán từ trên-xuống (top-down algorithm) là xấp xỉ N, số lượng tam giác trong lưới
tam giác cuối cùng T.
4.2.2 Hàng đợi kết hợp (merge queue)
Bây giờ giả sử rằng cho các giá trị ưu tiên biến thiên theo thời gian pf(T)∈[0,1]
cho mỗi frame f ∈ (0, 1, …), và bài toán là xây dựng các lưới tam giác tối ưu (T0, T1,
…). Nếu các giá trị ưu tiên này thay đổi từ từ, thì các lưới tam giác tối ưu ứng với bất
kỳ hai frame kế tiếp nhau sẽ tương tự với một frame khác. Trong trường hợp này, việc
hiển thị (performance) sẽ được cải thiện nếu chúng ta sử dụng lưới tam giác Tf – 1 làm
điểm bắt đầu để xây dựng lưới tam giác Tf. Điều này được thực hiện bằng cách quản lý
hàng đợi ưu tiên thứ hai Qm, chứa tất cả các hình thoi khả hợp trong lưới tam giác hiện
tại. Giá trị ưu tiên cho hình thoi khả hợp (T, TB) được đặt bằng giá trị ưu tiên lớn hơn
- 30 -
của hai tam giác đó, max{pf(T),pf(TB)}. Thuật toán vét cạn này như sau:
Nếu f = 0 {
Đặt T = lưới tam giác ban đầu.
Xóa Qs, Qm.
Tính các giá trị ưu tiên cho các tam giác và các hình thoi của T, sau đó
chèn vào Qs, Qm tương ứng.
} ngược lại {
Tiếp tục T = Tf – 1.
Cập nhật giá trị ưu tiên cho các phần tử của Qs, Qm.
}
Trong khi T không đạt độ chính xác / kích thước mong muốn, hay giá trị ưu tiên
phân chia lớn nhất lớn hơn giá trị ưu tiên kết hợp nhỏ nhất {
Nếu T quá lớn hay quá chi tiết {
Tìm giá trị ưu tiên thấp nhất (T, TB) trong Qm.
Kết hợp (T, TB).
Cập nhật các hàng đợi như sau: {
Xóa tất cả tam giác con đã được kết hợp lại khỏi Qs.
Thêm các tam giác cha kết hợp T, TB vào Qs.
Xóa (T, TB) khỏi Qm.
Thêm tất cả hình thoi khả hợp mới vào Qm.
}
} ngược lại {
Tìm giá trị ưu tiên cao nhất T trong Qs.
Phân chia ép buộc cho T.
Cập nhật các hàng đợi như sau: {
Xóa T và các tam giác phân chia khác khỏi Qs.
Thêm các tam giác mới trong T vào Qs.
- 31 -
Xóa khỏi Qm các hình thoi đã được phân chia.
Thêm các hình thoi khả hợp mới vào Qm.
}
}
}
Đặt Tf = T.
Thuật toán vét cạn này tạo ra lưới tam giác Tf có cùng giá trị ưu tiên như thuật
toán từ trên-xuống được thực hiện trên lưới tam giác ban đầu. Tổng quát thuật toán này
không tạo ra các lưới tam giác tối ưu trong các bước lặp trung gian (ví dụ, Tf – 1 thường
không tối ưu với frame f), nhưng nó sẽ đạt tối ưu nếu sử dụng ít nhất các phép phân
chia và kết hợp cho Tf – 1. Tổng số các phép phân chia và kết hợp xấp xỉ bằng ∆N, được
định nghĩa như là số tam giác không có chung của Tf và Tf – 1. Trong trường xấu nhất,
∆N có thể là Nf – 1 + Nf. Trường hợp như thế này ta có thể dễ dàng thấy được: có số
lượng lớn tam giác và hình thoi mà các giá trị ưu tiên nằm giữa giá trị ưu tiên kết hợp
cực tiểu và giá trị ưu tiên phân chia cực đại. Biện pháp khắc phục trong trường hợp này
là quay trở về với thuật toán từ trên-xuống (top-down algorithm), nó có thể được thực
hiện bằng cách khởi tạo T, Qs và Qm thông qua f = 0.
4.3 Các khái niệm lỗi (error metrics)
Trong phần này mô tả các đại lượng lỗi và các biên lỗi được sử dụng để tính
toán các giá trị ưu tiên cho các hàng đợi. Đặc biệt chúng ta giả sử rằng ánh xạ từ đỉnh
(vertex) sang không gian thế giới (world-space) w(v) có dạng w(v)=(vx,vy,z(v)), trong
đó (vx, vy) là tọa độ của đỉnh v, và z(v) là chiều cao tại v. Chúng ta đặt bản đồ chiều cao
cho tam giác T là zT(x, y). Chúng ta cũng giả sử hệ thống tọa độ camera và phép chiếu
- 32 -
phối cảnh được cho sẵn trong mỗi frame.
4.3.1 Các biên xếp chồng trong không gian thế giới
Với lưới tam giác, đường biên thuận tiện cho mỗi tam giác T là biên nêm
(wedgie), được định nghĩa là một hình khối chứa các điểm (x, y, z) trong đó (x,y)∈T và
|z – zT(x, y)| ≤ eT với độ dày nêm eT ≥ 0. Chúng ta xem đoạn thẳng từ (x,y,z – eT) đến (x,
y, z + eT) là đoạn độ dày (thickness segment) cho v. Các biên nêm xếp chồng được xây
dựng từ dưới-lên, bắt đầu với eT = 0 cho tất cả T ở mức mịn nhất lmax. Độ dày nêm eT
cho tam giác cha được định nghĩa theo các độ dày nêm của các tam giác con eT0 và eT1.
,
vz (
)
z
(
v
|)
=
|} +
−
Các biên nêm xếp chồng kín nhất được cho bởi công thức:
e T
c
T
c
e max{ T 0
e T 1
(
)
)
2/))
z
v
vz ((
=
+
(1)
c
T
0
vz ( 1
. Chú ý rằng phép tính này nhanh và cục bộ, tạo điều Trong đó
kiện thuận lợi cho địa hình động. Hình 4.4 biểu diễn các nêm xếp chồng phụ thuộc vào
đỉnh v.
Hình 4-4: Các nêm xếp chồng cho miền 1-D phụ thuộc vào v.
4.3.2 Sự méo mó hình học
Với lưới tam giác được phủ texture, sự méo mó hình học trong không gian màn
hình khác với sự méo mó màu sắc. Chúng ta giả sử các màu sắc cho các điểm trên bề
mặt được thể hiện chính xác như màu sắc trong hình texture. Các lỗi hình ảnh còn lại
- 33 -
có thể được thể hiện đơn thuần như là sự méo mó hình học: khoảng cách giữa nơi mà
mỗi điểm bề mặt nên đặt trên màn hình và nơi mà lưới tam giác đặt điểm đó. Thông
qua toàn bộ ảnh chúng ta tính toán độ chênh lệch cực đại theo các điểm đó. Đây là khái
niệm lỗi cơ bản của ROAM.
Đặt s(v) là vị trí chính xác cho điểm v trên màn hình và sT(v) là vị trí xấp xỉ từ
lưới tam giác T. Chúng ta định nghĩa độ chênh lệch hình học theo điểm (pointwise
geometric distortion) ở v là dist(v) = ||s(v) – sT(v)||2. Với toàn bộ ảnh, chúng ta định
nghĩa độ chênh lệch cực đại là distmax = maxv∈Vdist(v) trong đó V là tập hợp các điểm v
có vị trí trong không gian thế giới w(v) nằm trong khung nhìn (view frustum).
Trong thực tế, biên trên (upper bound) được tính bằng độ chênh lệch cực đại.
Với mỗi tam giác T trong lưới tam giác, một biên trên cục bộ (local upper bound) theo
độ chênh lệch được xác định bằng cách chiếu nêm của T lên màn hình, được mô tả
trong Hình 4.5. Biên được định nghĩa là chiều dài cực đại của các đoạn độ dày sau khi
chiếu với tất cả v ∈ T. Các biên cục bộ này là đơn điệu, và sẽ được sử dụng để tạo
thành các giá trị ưu tiên trong hàng đợi. Nếu một nêm mở rộng phía sau mặt phẳng cắt
ở gần, thì độ ưu tiên của tam giác được đặt là giá trị cực đại và việc tính toán biên
- 34 -
chênh lệch được bỏ qua.
Hình 4-5: Biên chênh lệch bởi việc chiếu nêm lên màn hình.
Bởi tính chất riêng biệt của phép chiếu phối cảnh, độ dày nêm đã chiếu cực đại
không phải luôn luôn xảy ra ở một trong các đỉnh tam giác. Điều này dẫn đến việc tính
toán biên trên sau. Đặt (p, q, r) là tọa độ của điểm w(v) trong không gian camera mà
không có chiếu phối cảnh, và không mất đi tính tổng quát, giả sử phép chiếu phối cảnh
có dạng s = (p/r, q/r). Sự chênh lệch không gian màn hình ở v∈T được giới hạn bởi
việc chiếu đoạn độ dày ở v. Đặt (a, b, c) là vectơ không gian camera tương ứng với
vectơ độ dày trong không gian thế giới (0, 0, eT). Độ chênh lệch ở được giới hạn bởi:
(2)
Có thể được viết lại:
(3)
Ta thấy giá trị cực tiểu của r2 – c2 và giá trị cực đại của (ar-cp)2 + (br-cp)2 xảy
ra ở các đỉnh góc của T (mặc dù tổng quát không có cùng góc). Do đó biên trên theo
- 35 -
dist(v) có thể xác định bằng cách thay các giá trị cực đại và cực tiểu vào biểu thức 3.
4.3.3 Hiệu chỉnh Line-of-site (LOS)
Đến đây, giá trị độ ưu tiên của các phần tử trong hàng đợi được tính toán từ
khoảng chênh lệch trên màn hình đối với tam giác T. Giá trị ưu tiên này có thể được
biến đổi để bảo đảm rằng các LOS đã chọn có bị che khuất hay không. Một phương
pháp đơn giản để thực hiện điều này là chúng ta thay đổi giá trị độ ưu tiên cho các tam
giác có nêm giao với LOS. Bằng cách thiết lập các giá trị ưu tiên bằng một giá trị cực
đại mà chúng ta qui định trước, thì các phép phân chia sẽ được ưu tiên thực hiện hơn
đủ để đảm bảo rằng các tam giác có thể được nhìn thấy một cách chính xác dọc theo
đường LOS. Phương pháp này có khuynh hướng gia tăng các phép phân chia hơn mức
cần thiết, mặc dù sự vượt mức này thực tế thường là nhỏ so với tổng số toàn bộ các tam
giác.
Hình 4-6: Bên trái là trước khi hiệu chỉnh LOS, bên phải sau khi thực hiện.
4.3.4 Các khái niệm khác
Sau đây là một vài sự biến đổi giá trị độ ưu tiên mà ta có thể áp dụng cho
- 36 -
ROAM.
• Giảm độ chi tiết cho mặt khuất: giá trị độ ưu tiên có thể được đặt bằng
giá trị cực tiểu cho các tam giác mà các tam giác trong nhánh tam giác
này đều là mặt khuất.
• Sự chênh lệch theo phương pháp tuyến: đối với quan điểm được quyết
định bằng các véctơ được nội suy từ các đỉnh, giá trị độ ưu tiên nên được
đặt cho các tam giác có sự chênh lệch pháp tuyến lớn.
• Sự chênh lệch tọa độ texture: đối với các ánh xạ từ bề mặt sang tọa độ
texture, giá trị độ ưu tiên nên được thêm vào tương ứng với độ lớn của sự
chênh lệch vị trí trong không gian màn hình kết hợp với việc xấp xỉ tọa
độ texture.
• Các cạnh Silhouette: chúng ta có thể nhấn mạnh những tam giác có
đường biên pháp tuyến chuyển từ mặt khuất sang mặt nhìn thấy được.
• View frustum: các niêm tam giác nằm bên ngoài sáu mặt phẳng cắt có
thể được đặt bằng giá trị độ ưu tiên cực tiểu.
• Sự mờ không khí: giá trị độ ưu tiên có thể giảm đi nếu sương mù làm
giảm tầm nhìn.
• Bố trí đối tượng: để bố trí chính xác các đối tượng trong địa hình, giá trị
ưu tiên của các tam giác dưới mỗi đối tượng có thể tăng dần theo như
chúng ta qui định.
4.4 Cải tiến quá trình hiển thị
Chúng ta mô tả các cải tiến để thuật toán ROAM có thể thực hiện ở tốc độ cao
đối với các lưới tam giác có hàng ngàn tam giác.
4.4.1 View-frustum culling
View frustum được định nghĩa là phần không gian được giới hạn bởi sáu mặt
- 37 -
phẳng. Mỗi tam giác trong cây nhị phân (toàn bộ lưới tam giác) được đặt một cờ IN
cho mỗi sáu nữa không gian (halfspace), và một nhãn tổng hợp OUT, ALL-IN hay
DONT-KNOWN, được định nghĩa như sau: IN được đặt khi nêm tam giác hoàn toàn
nằm bên trong nữa không gian, OUT được đặt khi nêm tam giác hoàn toàn nằm bên
ngoài ít nhất một halfspace, ALL-IN được đặt nếu tất cả cờ IN được đặt, và DONT-
KNOWN được đặt nếu không phải OUT hay ALL-IN.
Từ một frame này chuyển sang một frame khác, chúng ta phải cập nhật lại cờ và
nhãn cho các tam giác, việc này được xử lý bằng cách duyệt đệ qui cây nhị phân tam
giác. Nếu tam giác T có nhãn OUT hay ALL-IN ở frame trước, và các nhãn này đúng
với frame hiện tại, thì cây con của tam giác T không cần phải cập nhật lại và quá trình
đệ qui dừng lại. Mặt khác, T kế thừa các cờ IN từ tam giác cha và kiểm tra lại nêm tam
giác của nó với các halfspace không đánh dấu IN, đặt cờ IN mới cho thích hợp. Nếu
nêm tam giác hoàn toàn ở ngoài bất kì halfspace nào, T và tất cả tam giác con được đặt
là OUT. Nếu tất cả cờ IN được đặt, T và tất cả tam giác con được đặt ALL-IN. Mặt
khác T được đặt là DONT-KNOWN và tiếp tục quá trình đệ qui cho các tam giác con.
4.4.2 T-stripping
Tốc độ hiển thị có thể tăng lên nếu chúng ta tổ chức các tam giác thành các
strips, nhưng để tối ưu thì lại là một vấn đề khó. Chúng ta chỉ giả sử rằng các strip
không tổng quát (không có “hoán chuyển các đỉnh với nhau”). Chúng ta sử dụng
phương pháp cải tiến đơn giản chỉ có được chiều dài trung bình của strip từ 4 – 5 tam
giác. Khi các tam giác bị phân chia, kết hợp hay thay đổi trạng thái view-culling, thì
thực hiện liên kết strip. Việc xóa một tam giác ra khỏi strip sẽ dẫn đến strip này sẽ bị
xóa đi, hoặc bị ngắn lại nếu tam giác đó ở cuối strip, hay bị phân làm hai.
4.4.3 Trì hoãn việc tính toán lại độ ưu tiên
Các giá trị ưu tiên về độ chênh lệch trên màn hình của các tam giác thay đổi nếu
- 38 -
như vị trí hiển thị thay đổi, thường thì chậm và trơn. Việc tính toán lại độ ưu tiên của
tất cả các tam giác cho mỗi frame là rất tốn kém. Thay vào đó, giá trị ưu tiên sẽ chỉ
được tính toán lại khi chúng ảnh hưởng đến quyết định phân chia hay kết hợp.
Cho một giới hạn tốc độ trên điểm nhìn (viewpoint), các giới hạn có thể có được
cho các giá trị ưu tiên về độ chênh lệch trên màn hình theo thời gian. Vì thế độ ưu tiên
trực giao (được định nghĩa là độ ưu tiên của hàng đợi phân chia khi quá trình phân chia
hay kết hợp hoàn tất) thay đổi dần dần từ frame này sang frame khác (thường thay đổi
khoảng 1%). Việc tính toán lại các giá trị cho một tam giác có thể được hoãn lại cho
đến khi độ ưu tiên trực giao nằm trong khoảng giá trị ưu tiên. Danh sách trì hoãn được
lưu lại cho mỗi một vài tá frame kế tiếp. Chỉ những tam giác trong danh sách trì hoãn
của frame hiện tại mới được tính toán lại giá trị ưu tiên. Nếu có đủ thời gian, các tam
giác có thể được tính toán lại bằng chuỗi các danh sách trì hoãn. Sau khi quá trình tính
toán lại xong, tam giác được đặt vào danh sách trì hoãn, điều này sẽ cung cấp một thời
khóa biểu cho quá trình tính toán lại này.
4.4.4 Tối ưu lũy tiến (progressive optimazation)
Để đảm bảo cho tốc độ hiển thị, việc tối ưu quá trình lập lưới tam giác nên dừng
lại khi khoảng thời gian đã thiết lập sắp hết. Thuật toán ROAM có hỗ trỡ điều này bởi
vì việc cập nhật quá trình tối ưu và stripping thực hiện đối với một phép phân chia hay
kết hợp kế tiếp nhau. Dĩ nhiên là nếu dừng lại sớm sẽ dẫn đến việc lập lưới tam giác
không tối ưu. Tuy nhiên, bởi vì các bước phân chia và kết hợp được thực hiện theo thứ
tự giảm dần của độ quan trọng, việc thực hiện một phần có thể tối ưu theo trực quan
khi chúng ta đạt gần đến tối ưu thực trong khoảng thời gian cho phép trong khi vẫn
quản lý được số lượng tam giác mong muốn. Qui trình này gọi là tối ưu lũy tiến. Việc
tính toán lại giá trị ưu tiên cũng có thể được giới hạn lại theo thời gian cho trước. Chỉ
có một công đoạn của ROAM không thể thực hiện được như trên đó là view-frustum
culling, nhưng may mắn là nó chỉ đòi hỏi một khoảng thời gian rất ít và được hoàn
- 39 -
thành trước quá trình tính toán lại giá trị ưu tiên và quá trình tối ưu lưới tam giác.
4.5 Ưu điểm và khuyết điểm
4.5.1 Ưu điểm
Thuật toán ROAM được sử dụng rất rộng rãi trong các ứng dụng liên quan đến
địa hình phụ thuộc vào tính hiển thị cao.
• ROAM là một thuật toán tham lam nhằm đạt đến lưới tam giác tối ưu
trong khi sử dụng một số lượng ít nhất các phép phân chia và kết hợp nếu
có thể được.
• Thuật toán này rất đơn giản và dễ hiểu và cũng dễ cài đặt.
• Việc chọn cấu trúc biểu diễn lưới điểm và các thao tác trên đỉnh không
làm xảy ra hiện tượng T-vertices, do đó không cần phải có biện pháp gì
để tránh hiện tượng này.
• Vì các hàng đợi ưu tiên đều được sắp xếp theo thứ tự nên ta có thể trực
tiếp có được số lượng tam giác của lưới tam giác cuối cùng.
• Với các ứng dụng yêu cầu tính toán đường ngắm (line of sight) trực tiếp,
ROAM có thể bảo đảm rằng giá trị ưu tiên lớn nhất chỉ ra được các
đường ngắm.
• ROAM có hỗ trợ việc lập lưới tam giác động (tính cố kết frame – frame
coherency) để cải thiện tốc độ hiển thị.
• Có rất nhiều cải tiến quá trình hiển thị bằng các khái niệm lỗi và những
thao tác phục vụ cho ROAM, bao gồm việc tối ưu đường ngắm.
4.5.2 Khuyết điểm
Chỉ có một số ít khuyết điểm cho thuật toán ROAM này.
• Yêu cầu dung lượng bộ nhớ cho mỗi đỉnh là rất tốn kém so với một số
- 40 -
hướng khác như thuật toán của Röttger.
• Cấu trúc biểu diễn cho lưới tam giác trong ROAM tự nó không hỗ trợ tốt
cho biểu diễn đỉnh như dãy tam giác (triangle-strip), do đó sẽ dẫn đến
- 41 -
làm giảm tốc độ hiển thị.
Chương 5
Thuật toán Diamond
Thuật toán này được Henri Hakl đưa ra vào năm 2001, đây là một cải tiến của
thuật toán ROAM. Thuật toán này sử dụng cấu trúc biểu diễn lưới điểm là cây tứ phân
tam giác thay thế cây nhị phân tam giác trong ROAM, với cấu trúc này có thể phân ly
thành các dãy tam giác (triangle-strip) một cách tự nhiên. Thay vì 2 hàng đợi như
ROAM, thuật toán này bỏ qua hàng đợi ưu tiên mà sử dụng 4 hàng đợi LIFO có hỗ trợ
việc chèn và xóa theo thời gian cố định.
5.1 Biểu diễn
5.1.1 Cây tứ phân tam giác (triangle quadtree)
Bất kì một tam giác nào đều có thể thõa mãn là gốc cho một cây tứ phân tam
giác và tam giác con của tam giác này sẽ có hình dạng như tam giác gốc. Với các mục
- 42 -
đích này mà không làm mất đi tính tổng quát, chúng ta sẽ giả sử gốc tam giác đều.
Hình 5-1: Vài mức ban đầu của cây tứ phân tam giác.
Từ biểu diễn cây tứ phân tam giác này, ta có được hai kiểu tam giác, tam giác
hướng lên và tam giác hướng xuống. Thuật toán CLOD mà chúng ta sẽ thực hiện các
hàm không phụ thuộc vào hướng của tam giác, tuy nhiên trong quá trình hiển thị thì
việc phân biệt các tam giác đó là quan trọng vì nó sẽ hổ trợ cho việc khử mặt khuất.
Để giúp đỡ cho việc thực hiện thuật toán, trước tiên chúng ta định nghĩa một
tam giác và các mối quan hệ của nó như sau (Hình 5.2):
• 3 đỉnh v1, v2, v3 được định nghĩa từ trái sang phải.
• 3 láng giềng n1, n2, n3 được định nghĩa từ trái sang phải.
• 4 tam giác con a, b, c, d – a luôn là tam giác con ở giữa, các tam giác con
- 43 -
còn lại được định nghĩa từ trái sang phải.
Hình 5-2: Định nghĩa tam giác và các mối quan hệ của nó.
Chúng ta định nghĩa phép phân chia và kết hợp thông qua biểu diễn lưới điểm
như sau: phép phân chia sẽ thay thế một tam giác bằng 4 tam giác con, phép kết hợp là
phép đảo của phép phân chia. Hình 3 mô tả các phép toán này.
- 44 -
Hình 5-3: Phép phân chia và kết hợp.
5.1.2 Các đặc tính
Như đã đề cập ở trên, cây tứ phân tam giác cung cấp các tính năng giống như
cây nhị phân tam giác. Tuy nhiên, cây tứ phân tam giác có một số đặc tính khác với
cây nhị phân tam giác và nó làm tăng tính hiện thực và khả năng hiển thị tốt hơn.
Trong cách biểu diễn cây nhị phân tam giác, một đỉnh đã cho có thể được chia
sẽ bởi từ 4 đến 8 tam giác, trong khi đó với cách biểu diễn cây tứ phân tam giác, thì
mỗi đỉnh chỉ luôn được chia sẽ bởi 6 tam giác. Do đó trong biểu diễn cây tứ phân tam
giác, một phần tử được hiển thị luôn luôn gồm 6 tam giác cho mỗi đỉnh. Tính cố định
này sẽ làm cho việc hiển thị chính xác hơn. Thêm vào đó hiện tượng vertex-popping
cũng được giảm bớt, chẳng hạn như loại bỏ được trường hợp các đỉnh được chia sẽ bởi
4 tam giác trong một khung hình và bởi 8 tam giác trong khung hình kế tiếp.
Có lẽ quan trọng hơn là lưới tam giác có được từ một cây tứ phân tam giác có
phù với việc tối ưu trong hiển thị như là việc sử dụng các dãy tam giác (triangle-strips)
chẳng hạn. Các dãy tam giác trong tổ chức cây nhị phân tam giác có được bằng cách
lưu trong một hằng số và thường rất ngắn khoảng trung bình từ 4 – 5 tam giác mỗi dãy
(phụ thuộc vào kích thước địa hình và mức độ chi tiết hiển thị), và các cấu trúc hình
học phụ không phù hợp lắm với các dãy tam giác dài. Ngược lại, cây tứ phân tam giác
vốn có thể phân tích thành các dãy tam giác dài và thuận tiện cho phần cứng trong quá
trình tạo lưới tam giác. Chiều dài trung bình của dãy tam giác phụ thuộc vào mức độ
chi tiết hiển thị (rendering detail), kích thước địa hình, và sai số địa hình (terrain
variance).
5.1.3 Tính liên tục (continuity) của lưới tam giác
Với biểu diễn lưới tam giác này không được hoàn chỉnh, nó thất bại ở tính liên
tục của lưới tam giác: trong lưới tam giác có các đỉnh dạng T (T-vertices) giữa các tam
giác láng giềng ở các mức khác nhau. Hình 5.4 bên dưới là một ví dụ về tính không
- 45 -
liên tục của lưới tam giác.
Hình 5-4: Tính không liên tục của lưới tam giác.
Vấn đề này dễ dàng được khắc phục: thực hiện lập lưới tam giác nếu các phép
phân chia và kết hợp không tạo ra tính không liên tục trong lưới tam giác; chỉ cần xem
xét đến mức độ chi tiết (level) của tam giác ở trong bước này. Trong suốt quá trình
phát sinh lưới tam giác, hiện tượng T-vertices được loại bỏ bằng cách xem xét đến các
láng giềng rồi có các thao tác đặc biệt tương ứng, như mô tả trong hình 5.5 bên dưới.
Hình 5-5: Hiệu chỉnh lại tính không liên tục cho lưới tam giác.
5.2 Thuật toán Diamond
Trong phần này, chúng ta sẽ mô tả thuật toán hiển thị địa hình như đã đề cập ở
trên. Trước tiên, chúng ta sẽ mô tả 4 hàng đợi LIFO vận hành quá trình lập lưới tam
giác cho địa hình; sau đó chúng ta đưa ra mô tả đến các phép phân chia và kết hợp
cùng với vòng lặp hiển thị chính của thuật toán. Cuối cùng chúng ta sẽ điểm mạnh và
- 46 -
yếu của thuật toán này.
5.2.1 Các hàng đợi tam giác
Thuật toán ROAM sử dụng hai hàng đợi: các hàng đợi ưu tiên chứa đựng tất cả
các tam giác khả phân và khả hợp, được sắp xếp theo thứ tự của giá trị ưu tiên. Các
hàng đợi ưu tiên được quản lý cùng với các thao tác mà thuật toán ROAM thực hiện,
điều này cho phép thuật toán có thể trực tiếp đạt được số lượng tam giác cho trước: có
thể chỉ ra rằng trong một khung hình nào đó thì nên gồm có, ví dụ, 3000 tam giác. Sau
đó thuật toán sẽ thực hiện phép phân chia và kết hợp các tam giác cho đến khi lưới tam
giác đạt đến số tam giác là 3000 tam giác. Phụ thuộc vào các hàng đợi ưu tiên, mỗi
thao tác phân chia hay kết hợp là tối ưu mang tính cục bộ, cho kết quả là một lưới tam
giác tối ưu với bất kỳ số lượng tam giác nào.
Một vài năm trở lại đây, mục đích quản lý số lượng tam giác cố định là để bảo
đảm một ứng dụng có thể chạy ở một tốc độ hiển thị cố định, từ đó nhu cầu xử lý từ
khung hình này đến khung hình khác gần như là như nhau đối với số tam giác không
đổi. Tuy nhiên phần cứng đồ họa ngày càng mạnh và đặc biệt là khả năng phần cứng
hổ trợ xử lý các phép biến đổi và chiếu sáng, nên có thể loại bỏ được nhu cầu quản lý
số lượng tam giác cố định để có được tốc độ hiển thị không đổi. Các phần cứng đồ họa
hiện đại có thể dễ dàng đương đầu với cả ngàn tam giác mà tốc độ hiển thị hầu như
không bị ảnh hưởng.
Từ khi tốc độ hiển thị ngày càng không phụ thuộc vào số lượng tam giác thì các
hàng đợi ưu tiên đã được sắp xếp không còn là điều kiện tiên quyết cho quá trình lập
lưới tam giác cho địa hình. Thay vào đó thuật toán sẽ sử dụng 4 hàng đợi LIFO có thời
gian thêm vào và xóa đi không thay đổi.
• SplitBelow – chứa tất cả tam giác khả phân có giá trị ưu tiên bé hơn giá
trị ưu tiên đích.
• SplitAbove – chứa tất cả tam giác khả phân có giá trị ưu tiên lớn hơn giá
- 47 -
trị ưu tiên đích.
• MergeBelow – chứa tất cả tam giác khả hợp có giá trị ưu tiên bé hơn giá
trị ưu tiên đích.
• MergeAbove – chứa tất cả tam giác khả hợp có giá trị ưu tiên lớn hơn giá
trị ưu tiên đích.
5.2.2 Thuật toán
Trong phần này chúng ta sẽ đi vào mô tả chi tiết thuật toán địa hình Diamond
(Diamond terrain algorithm). Trước tiên chúng ta xem xét vòng lặp chính của thuật
toán, sau đó mô tả chi tiết các phép phân chia (và qui trình phát sinh các tam giác con)
và các phép kết hợp.
A. Vòng lặp chính:
Vòng lặp hiển thị của thuật toán này bao gồm 2 quá trình phân biệt: quá trình
đánh giá độ ưu tiên và quá trình lặp lưới tam giác. Trong quá trình đánh giá độ ưu tiên,
giá trị ưu tiên của tất cả các tam giác trong các hàng đợi đều được đánh tính toán lại và
các tam giác đó có thể được đưa vào hàng đợi nếu cần thiết. Trong quá trình lặp lưới
tam giác, tất cả các tam giác khả hợp có độ ưu tiên nhỏ hơn độ ưu tiên đích sẽ được kết
hợp lại và tất cả các tam giác khả phân lớn hơn độ ưu tiên đích sẽ được phân chia.
Nếu ResetDiamond thì
Thiết lặp lại lưới tam giác và hàng đợi.
Lọc (cull) và dành ưu tiên cho các tam giác láng giềng đáy đầu tiên và
xếp các tam giác vào hàng đợi nào thích hợp SplitAbove hay
SplitBelow.
Ngược lại
Duyệt qua hàng đợi SplitBelow, đánh giá lại độ ưu tiên và sắp xếp lại
- 48 -
các phần tử vào hàng đợi SplitAbove nếu cần thiết.
Duyệt qua hàng đợi MergeAbove, đánh giá lại độ ưu tiên và sắp xếp lại
các phần tử vào hàng đợi MergeBelow nếu cần thiết.
Trong khi MergeBelow chưa rỗng,
Kết hợp các phần tử trong MergeBelow.
Trong khi SplitAbove chưa rỗng,
Phân chia các phần tử trong SplitAbove.
ResetDiamond là một giá trị nhị phân, nếu là đúng (true) vòng lặp chạy lần đầu
tiên. Nếu ResetDiamond = true với mỗi khung hình phía sau, thì thuật toán chỉ thực
hiện các phép phân chia trên lưới tam giác; còn nếu là false thì thuật toán sẽ là động
(phụ thuộc vào khung hình) và sẽ thực hiện cả hai phép phân chia và kết hợp.
Chú ý rằng sau mỗi lần thực hiện xong vòng lặp này, hàng đợi MergeBelow và
SplitAbove sẽ trở nên rỗng – tất cả các tam giác khả hợp và khả phân đều nằm trong
hàng đợi SplitBelow và MergeAbove sau mỗi lần lặp.
B. Phép phân chia:
Về mặt hình học, phép phân chia khá đơn giản và được thực hiện dễ dàng, tuy
nhiên, nó vô cùng quan trọng đối với quá trình thực hiện của thuật toán mà bốn hàng
đợi LIFO được quản lý một cách chính xác.
Phép phân chia cũng đảm bảo rằng các tam giác láng giềng chỉ chênh lệch nhau
một mức (level). Điều này được thực hiện bằng cách ép buộc tam giác láng giềng phân
chia nếu nó quá thô, để tam giác đang xét có thể phân chia được.
Nếu tam giác đang xét đã được đưa vào hàng đợi
Lấy tam giác đó ra khỏi hàng đợi SplitAbove.
Nếu tam giác cha đã được đưa vào hàng đợi
- 49 -
Lấy tam giác đó ra khỏi hàng đợi kết hợp.
Nếu tam giác láng giềng thô hơn tam giác đang xét
Phân chia tam giác láng giềng.
Nếu tam giác cha của tam giác láng giềng đã được đưa vào hàng đợi
Lấy tam giác đó ra khỏi hàng đợi kết hợp.
Tạo ra các tam giác con từ tam giác đang xét.
Lọc (cull) và dành ưu tiên cho các tam giác con và đưa vào hàng đợi SplitAbove
hay SplitBelow cho phù hợp.
Nếu tam giác đang xét là khả hợp
Đưa nó vào hàng đợi MergeAbove.
Chú ý rằng một tam giác khả hợp nếu nó có tam giác con nhưng không có tam
giác cháu.
C. Quá trình phát sinh tam giác con:
Quá trình phát sinh tam giác con là một phần của phép phân chia tam giác. Khi
thực hiện quá trình phát sinh tam giác, điều quan trọng là phải chắc chắn rằng các tam
giác láng giềng phải được liên kết chính xác với nhau.
Tạo ra các tam giác con và liên kết chúng với tam giác đang xét.
Gán các tọa độ cho các tam giác con.
Nếu không có tam giác láng giềng
Thiết lặp các láng giềng là rỗng (NULL).
Ngược lại
Nếu tam giác láng giềng có con
Liên kết các tam giác con của tam giác đang xét và tam giác láng
- 50 -
giềng với nhau.
Ngược lại
Liên kết các tam giác con của tam giác đang xét với tam giác láng
giềng.
D. Phép kết hợp:
Tương tự phép phân chia, phép kết hợp thì đơn giản về mặt hình học, tuy nhiên,
việc quản lý hàng đợi cho chính xác đòi hỏi cần phải chú ý đặc biệt.
Nếu các tam giác con đã được đưa vào hàng đợi
Lấy chúng ra khỏi hàng đợi phân chia.
Lấy tam giác đang xét ra khỏi hàng đợi MergeBelow.
Chỉnh lại các liên kết cho các tam giác con của láng giềng nếu cần thiết.
Xóa các tam giác con của tam giác đang xét.
Nếu tam giác cha của láng giềng có thể kết hợp
Đưa tam giác cha vào hàng đợi kết hợp phù hợp.
Nếu tam giác cha của tam giác đang đang xét có thể kết hợp
Đưa tam giác cha vào hàng đợi kết hợp phù hợp.
Đưa tam giác đang xét vào hàng đợi SplitBelow.
5.3 Ưu và khuyết điểm
Thuật toán này dựa theo ý tưởng của ROAM nên kế thừa được các ưu điểm của
ROAM. Trong khi đó với cấu trúc biểu diễn lưới tam giác, chúng ta không cần thực
hiện một phương pháp phức tạp nào để lấy ra các strip tam giác từ lưới tam giác, mà
cấu trúc này tự nó có được các strip tam giác dài nên sẽ giảm thời gian hiển thị. Thuật
toán này sử dụng 4 hàng đợi LIFO cho phép sử dụng hiệu quả các tài nguyên trong quá
- 51 -
trình xử lý.
Chương 6
Tổng kết
Chúng em đã thực hiện cài đặt thử nghiệm các thuật toán đã nêu. Chương trình cài đặt bằng ngôn ngữ Visual C++® 6.0 và thư viện đồ họa OpenGL chạy trên nền Windows® XP trên hệ thống Pentum®IV 256M RAM và VGA 64M.
- 52 -
Hình 6-1: Địa hình được hiển thị bằng thuật toán của Röttger.
- 53 -
Hình 6-2 : Địa hình được hiển thị bằng thuật toán ROAM.
- 54 -
Hình 6-3 : Địa hình được hiển thị bằng thuật toán Diamond.
Hình 6-4 : Địa hình khi được phủ texture.
Tốc độ trung bình của các thuật toán khi hiển thị 5000 tam giác.
- 55 -
Thuật toán Röttger ROAM Diamond Tốc độ (frame/s) 84.3 63.7 75.8
Tài liệu tham khảo
[1] Stefan Röttger, Wolfgang Heidrich, Philipp Slusalleck, and Hans-Peter
Seidel. Real-time Generation of Continuous Levels of Detail for
Height Fields. Proceedings of WSCG ’98, pages 315-322, 1998.
[2] Peter Lindstrom, David Koller, William Ribarsky, Larry F. Hodges, Nick
Faust. Real-time, Continuous Level of Detail Rendering of Height
Fields. Proceeding of ACM SIGGRAPH ‘96, pages 109–118, August
1996.
[3] Mark Duchaineau, LLNL, Murray Wolinsky, LANL, David E. Sigeti,
LANL, Mark C. Miller, LLNL, Charles Aldrich, LANL, Mark B.
Mineev-Weinstein, LANL. ROAMing Terrain: Real-time Optimally
Adapting Meshes. IEEE Visualization ’97, pages 81–88, 1997.
[4] Ulrich Thatcher. Continuous LOD Terrian Meshing Using Adaptive
Quadtrees. Gamasutra. 2000.
[5] Willem H. de Boer. Fast Terrain Rendering Using Geometrical
MipMapping. 2000.
[6] A. James Stewart. Hierarchical Visibility in Terrains. Eurographics
Rendering Workshop. 1997.
[7] P. Lindstrom, V. Pascucci. Visualization of Large Terrains Made Easy.
Proceedings of IEEE Visualization 2001. 2001.
[8] Henri Hakl. Diamond Terrain Algorithm – Continuous Levels of
Detail for Height Fields. 2001
[9] Hugues Hoppe. Smooth View-Dependent Level-of-Detail Control and
its Application to Terrain Rendering. In IEEE Visualization ’98, pages
- 56 -
35-42. IEEE, October 1998
[10] Bent Dalgaard Larsen, Niel Jorgen Christensen. Real-time Terrain
Rendering using Smooth Hardware Optimized Level of Detail.
[11] Marc van Kreveld. Algorithms for Triangulated Terrain.
[12] Alex A. Pomeranz. ROAM Using Surface Triangle Clusters
- 57 -
(RUSTiC). Thesis of Masters of Science in Computer Science. 2000.

