2009-04-22 39 views

回答

12

這些表用於找出如何tesselate表面:

第一個表爲您提供了必要的邊緣進行插值。 第二個表格爲您提供了必須在多維數據集內創建三角形的方法,即, 。

一個小例子:

讓我們假設,頂點和2之一是下面的ISO水平, 的cubeindex應爲3

整個交叉點應該像 楔形。

如果你仔細想想,你必須在邊緣插值: 0和9,以及2和10. 如果你在一個位域中輸入這個值,每一個對應於「是否相交的邊緣?你會結束這樣的事情:

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

不是嗎?

這正是從edgeTable [3]二進制值;)0x30A = 1100001010

現在,您可以編寫線性插值對那些邊緣 點,以滿足您ISOLEVEL的功能。這些點將成爲你在這個單元格內的表面。

但如何tesselate這個細胞/表面?

,如果你看看triTable [3]微笑應該爬在你的臉上:)在評論殘留困惑的語句之後

ADDIT:;-)

什麼移動立方體呢: 假設你有一個黑暗的房間裏有一個點光源。 它是標量強度值的體積光強度場的中心。 你可以去點(x,y,z)並測量那裏的強度,例如, 3坎德拉。

您現在想通過具有特定光強度的所有點渲染曲面。 你可以想象這個Isosurface看起來像一個圍繞點光源的球體。這就是我們希望行進中的立方體能夠爲我們提供的。

現在穿過房間中的所有點並將每個點標記爲具有大致iso值的頂點,將在算法上非常複雜並且會導致擁抱數量的頂點。我們將不得不以某種方式進行研究。因此:第一次行軍立方體將整個體積檢測爲相同尺寸的立方體。 如果基礎數據具有某種基礎離散性,則使用其中的倍數。我不會進入另一個案例,因爲這很少見。 例如,我們在2mx5mx5m的房間內放置密度爲1mm的柵格

我們使用5mmx5mmx5mm的立方體。穿過它們應該便宜得多。

現在可以想象,某些立方體的邊緣與等值面相交。 這些是有趣的。該代碼識別他們:

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

如果cubeindex保持爲零,這種特殊的立方體不是由等值面相交。 如果cubeindex> 0,則您現在知道isosurface會穿過此立方體 ,並且您想渲染其中的isosurface部分。

請在你的腦海中想像這一點。 請參閱 http://en.wikipedia.org/wiki/Marching_cubes 有關相交立方體的示例。

您可以輕鬆獲取的頂點是立方體邊緣的頂點。 只需在兩個角點之間進行線性插值即可找到isovalue的位置 並在此處放置一個頂點。但是哪些邊相交? 這是edgeTable [cubeindex]中的信息。 這是包含所有if的大部分代碼,它將插值點 作爲頂點存儲在xyz點的數組中:vertlist []。 這塊內容如下:

 
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. 

您現在有一個數組滿頂點,但如何將它們連接起來三角形? 這是可提供的信息。

其餘的幾乎是我上面解釋的。

那麼應該還是有問題,請具體說明一下給你帶來麻煩的那段代碼。

+2

如果這個笑容不想發生,請考慮如何將三角形放在那裏,然後將其與triTable中的提議進行比較。 玩得開心! ;-) – AndreasT 2009-04-22 11:37:59