2015-11-15 46 views
0

我正在嘗試使用Gottschalk's算法(代碼available here)爲3D三角形網格創建定向邊界框(OBB)。由於我正在處理網格,因此我使用協方差矩陣和特徵值分解方法來創建定向邊界框。我意識到特徵值分解的數值精度將導致錯誤的OBB計算。在Gottschalk的定向邊界框算法中引起問題的數值精度

讓我們以一個例子來說明。假設我有一個由8個頂點組成的單位立方體網格,範圍爲[0,1](如下所示)。很顯然,這個立方體的OBB本身就是。

Unit cube

如果我運行戈特沙爾克的算法,我想最終邊界框,如下圖所示:

OBB

(旋轉了更好的視野)

OBB rotated

顯然結果是錯誤的。我已經將問題追蹤到特徵值分解。由於我正在處理單位立方體,所以軸必須是單位x,yz方向。但是,特徵值分解在其他方向上產生軸。錯誤的結果來自協方差矩陣。的協方差矩陣I計算該立方體如下:

Covariance matrix: 
|  0.138889 -2.77556E-17   0 | 
| -2.77556E-17  0.138889   0 | 
|   0    0 0.138889 | 

所得特徵向量如下:

Eigenvectors: 
| -0.7071   0 -0.7071 | 
| -0.7071   0 0.7071 | 
|  0 1.0000   0 | 

有鑑於此矩陣作爲OBB的軸線將產生出的錯誤的結果的每一列上面的圖片。如果我用零替換協方差矩陣超小的值,我會得到正確的特徵值和(通過擴展)軸:

Correct eignenvectors: 
| 1  0  0 | 
| 0  1  0 | 
| 0  0  1 | 

這往往是少與更多的頂點對象的問題。但是,我確實有8個頂點的對象,我需要能夠正確計算它們的OBB。

我應該如何解決這些準確度問題?我怎樣才能使我的OBB算法更強大?

如果有幫助,我在C#中實現算法。使用CGAL計算凸殼,使用Math.NET進行特徵值分解。

+0

Close ?!認真?這個問題怎麼能不是編程相關?!它直接關係到算法的魯棒性! – M2X

+0

結果並沒有錯。準確的協方差矩陣是一個簡單的縮放(所有值相等的對角線),並且*每個矢量都是該矩陣的特徵向量。你應該嘗試一個更現實的數據集。 –

+0

@MattTimmermans我不確定我完全理解你的意思。你能詳細說明嗎?另外,「實際數據集」是什麼意思?由8個頂點組成的形狀的定向邊界框不現實? – M2X

回答

0

經過大量的挖掘,我看到了this related question。基本上,你不能指望Gottschalk的算法適用於所有情況。因此,最好使用近似方法。

一個用於計算近似導向邊界框的好庫是ApproxMVBB。在與圖書館的作者來回之後,我終於能夠在Windows下編譯和工作。下面是該算法的輸出爲單位立方體我在這個問題中使用的截圖:

correct OBB

特別感謝去圖書館的作者對他的幫助爲圖書館的編纂:)