2009-04-23 87 views
6

從我的最後一個問題:Marching Cube Question
實施Marching Cube算法?

不過,我還不清楚在:

  1. 如何創建假想的立方體/體素檢查一個頂點是等值以下?
  2. 我如何知道isosurface下的哪個頂點?
  3. 每個立方體/體素如何確定使用哪個cubeindex/surface?
  4. 如何在TriTable中使用數據繪製曲面?

比方說,我有一個蘋果的點雲數據。
我該怎麼做?

任何熟悉Marching Cube的人都能幫助我嗎?
我只知道C++和opengl(c有點出於我的手)

回答

1

1)它取決於yoru的實現。您需要有一個數據結構,您可以在該體素或立方體的每個角(頂點)查找值。這可以是3D圖像(即:OpenGL中的3D紋理),也可以是自定義的陣列數據結構或您希望的任何其他格式。

2)您需要檢查立方體的頂點。對此有不同的優化,但總的來說,從第一個角開始,只需檢查立方體的所有8個角的值。 3)大多數(快速)算法創建一個位掩碼,將其用作靜態選項數組的查找表。這隻有很多可能的選擇。

4)一旦你從TriTable中創建了三角形,你可以使用OpenGL來渲染它們。

比方說,我有一個蘋果的點雲數據。我如何繼續?

這不適用於行軍立方體。行進立方體需要體素數據,因此您需要使用一些算法將數據點雲放入立方體體積中。高斯Splatting是一個選項。

通常情況下,如果您正在使用點雲進行工作,並且想要查看曲面,則應該查看曲面重構算法而不是進行立方體。

如果您想了解更多信息,我強烈建議您閱讀一些關於可視化技術的書籍。一個好的來自Kitware的人 - The Visualization Toolkit。你可能想看看VTK。它有一個C++實現Marching Cubes,並且是完全開源的。

+0

can a 6 glQuads equal to a voxel?如果是這樣,體素如何構建?我的觀點是否是立方體的中心? – noob88 2009-04-23 18:36:21

2

首先,等值面可以用兩種方式表示。一種方法是將isovalue和per-point標量作爲來自外部源的數據集。這就是MRI掃描的工作原理。第二種方法是創建一個以點/頂點爲參數的隱式函數F(),並返回一個新的標量。考慮這個函數:

float computeScalar(const Vector3<float>& v) 
{ 
    return std::sqrt(v.x*v.x + v.y*v.y + v.z*v.z); 
} 

這將計算標量場中每個點的點和原點之間的距離。如果isovalue是半徑,則您只是想出一種表示球體的方式。 這是因爲| v | < = R對於一個球體內的所有點或者其內部的所有點都是正確的。只要找出球體內的哪些頂點以及哪些頂點在球體外面。您希望使用較少或較大的運算符,因爲卷將空間分爲兩部分。當你知道你的立方體中的哪些點被分類爲內部和外部時,你也知道等值面的哪些邊相交。你可以結束一切,從沒有三角形到五個三角形。網格頂點的位置可以通過對相交邊進行插值來計算,以找到實際的交點。


如果你想表示發言權標量場一個蘋果,你要麼需要得到源數據集插上你的應用程序,或使用一個非常複雜的隱函數。我建議讓簡單的幾何圖元像球體和圓環首先工作,然後從那裏展開。