2009-04-22 31 views
6

Tôi hiện đang viết một chương trình để triển khai Marching Cube sử dụng C++ và Opengl.Marching Cube Question

Tuy nhiên, tài liệu tham khảo tốt nhất của tôi chỉ là từ http://local.wasp.uwa.edu.au/~pbourke/geometry/polygonise/

trong các trang web, các mã được cung cấp được viết bằng C.
vấn đề của tôi ở đây là tôi không hiểu được triTable và edgeTable
và làm thế nào họ có liên quan.

ai cũng có thể giúp tôi giải thích hoặc hướng dẫn tôi chuyển đổi thuật toán thành mã không?

Trả lời

12

Các bảng này được sử dụng để tìm hiểu cách tesselate bề mặt:

Bảng đầu tiên cung cấp cho bạn các cạnh cần thiết để nội suy. Bảng thứ hai cung cấp cho bạn cách bạn phải tesselate, nghĩa là, mà hình tam giác bạn phải thực hiện bên trong khối lập phương.

Một ví dụ nhỏ:

chúng ta hãy giả định, đỉnh một và 2 là dưới mức iso, các cubeindex nên 3.

Toàn bộ giao nhau sẽ giống như một nêm.

Nếu bạn nghĩ về nó, bạn phải nội suy giá trị trên các cạnh: 0 và 9, và 2 và 10. Nếu bạn nhập vào bitfield, mỗi bit tương ứng với "là cạnh giao nhau?" bạn sẽ kết thúc với một cái gì đó như thế này:

 
10 9 8 7 6 5 4 3 2 1 edge 
1 1 0 0 0 0 1 0 1 0 intersected? 

phải không?

Mà chính xác là giá trị từ edgeTable [3] ở dạng nhị phân;) 0x30A = 1100001010

Bây giờ bạn có thể viết một hàm tuyến tính nội suy các điểm trên các cạnh để phù hợp với isolevel của bạn. Những điểm này sẽ trở thành bề mặt của bạn bên trong ô này.

Nhưng cách tesselate ô/bề mặt này?

nếu bạn nhìn vào triTable [3] một nụ cười nên leo trên khuôn mặt của bạn :)

Addit sau tuyên bố của hoang mang dư trong bình luận: ;-)

gì Marching Cubes làm: Hãy tưởng tượng bạn có một căn phòng tối với một nguồn sáng điểm trong đó. Đây là trung tâm của cường độ ánh sáng cường độ ánh sáng của các giá trị cường độ vô hướng. Bạn có thể đi đến điểm (x, y, z) và đo cường độ ở đó, ví dụ: 3 candela.

Bây giờ bạn muốn hiển thị bề mặt thông qua tất cả các điểm có cường độ ánh sáng nhất định. Bạn có thể tưởng tượng rằng Isosurface này sẽ trông giống như một quả cầu xung quanh nguồn sáng điểm. Đó là những gì chúng tôi hy vọng rằng các hình khối Marching sẽ cung cấp cho chúng tôi.

Bây giờ chạy qua tất cả các điểm trong phòng và đánh dấu mọi điểm là một đỉnh có giá trị xấp xỉ iso, sẽ rất phức tạp về mặt thuật toán và sẽ dẫn đến số đỉnh.Mà sau đó chúng tôi sẽ phải tesselate bằng cách nào đó.

Vì vậy: Các hình khối Marching đầu tiên sẽ phân tách toàn bộ âm lượng thành các hình khối có kích thước bằng nhau. Nếu dữ liệu cơ bản có một số loại không xác định cơ bản, thì bội số của chúng được sử dụng. Tôi sẽ không đi vào trường hợp khác, vì điều đó rất hiếm. Ví dụ: Ví dụ, chúng tôi đặt một lưới có mật độ 1mm vào một phòng 2mx5mx5m

Chúng tôi sử dụng hình khối 5mmx5mmx5mm. Chạy qua chúng sẽ rẻ hơn nhiều.

Bây giờ bạn có thể tưởng tượng rằng các cạnh của một số khối giao nhau với mặt đồng vị. Đây là những điều thú vị. Mã này xác định chúng:

cubeindex = 0; 
    if (grid.val[0]

nếu cubeindex bằng không, khối đặc biệt này không bị giao cắt bởi mặt đồng vị. Nếu cubeindex là> 0 bây giờ bạn biết rằng mặt đồng phân đi qua khối lập phương này và bạn muốn hiển thị phần của mặt đồng phân bên trong nó.

Hãy hình dung điều này trong tâm trí của bạn. Xem http://en.wikipedia.org/wiki/Marching_cubes để biết ví dụ về hình khối được cắt.

Các đỉnh mà bạn có thể nhận được dễ dàng là các đỉnh trên các cạnh của khối lập phương. Chỉ nội suy tuyến tính giữa 2 điểm góc để tìm vị trí của đẳng thức và đặt đỉnh ở đó. Nhưng mà các cạnh được giao nhau ??? Đó là thông tin trong edgeTable [cubeindex]. Đó là đoạn mã lớn với tất cả các if, lưu trữ các điểm nội suy làm đỉnh trong một mảng các điểm xyz: vertlist []. mảnh này đọc như sau:

 
get the bitfield = edgeTable[cubeindex] 
if edge 1 is marked in bitfield (bit 1 set to 1 in bitfield) 
    vertlist[0] = interpolated point, somewhere on edge 1 
... and so on. 

Bây giờ bạn có một mảng đầy đủ các đỉnh, nhưng làm thế nào để kết nối chúng với tam giác? Đó là thông tin có thể truy tìm được.

Phần còn lại là khá nhiều những gì tôi đã giải thích ở trên.

Cũng sẽ vẫn có vấn đề, vui lòng nêu cụ thể về đoạn mã cung cấp cho bạn sự cố.

+2

Nếu nụ cười đó không muốn xảy ra, hãy suy nghĩ về cách bạn đặt các hình tam giác vào đó và sau đó so sánh với đề xuất trong triTable. Hãy vui vẻ! ;-) – AndreasT

+0

Xin cảm ơn, AndreasT thực sự tôi đã mất một chút. cho thông tin của bạn tôi không có kiến ​​thức về thuật toán. Tôi hiểu cách hoạt động của triTable hiện tại, tuy nhiên tôi vẫn không hiểu cách hoạt động của edgeTable và cách xác định bề mặt nào sử dụng .. – noob88

+0

ok, bây giờ điều thực sự lớn :) – AndreasT

Các vấn đề liên quan