我正在嘗試使用Gottschalk's算法(代碼available here)爲3D三角形網格創建定向邊界框(OBB)。由於我正在處理網格,因此我使用協方差矩陣和特徵值分解方法來創建定向邊界框。我意識到特徵值分解的數值精度將導致錯誤的OBB計算。在Gottschalk的定向邊界框算法中引起問題的數值精度
讓我們以一個例子來說明。假設我有一個由8個頂點組成的單位立方體網格,範圍爲[0,1](如下所示)。很顯然,這個立方體的OBB本身就是。
如果我運行戈特沙爾克的算法,我想最終邊界框,如下圖所示:
(旋轉了更好的視野)
顯然結果是錯誤的。我已經將問題追蹤到特徵值分解。由於我正在處理單位立方體,所以軸必須是單位x
,y
和z
方向。但是,特徵值分解在其他方向上產生軸。錯誤的結果來自協方差矩陣。的協方差矩陣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進行特徵值分解。
Close ?!認真?這個問題怎麼能不是編程相關?!它直接關係到算法的魯棒性! – M2X
結果並沒有錯。準確的協方差矩陣是一個簡單的縮放(所有值相等的對角線),並且*每個矢量都是該矩陣的特徵向量。你應該嘗試一個更現實的數據集。 –
@MattTimmermans我不確定我完全理解你的意思。你能詳細說明嗎?另外,「實際數據集」是什麼意思?由8個頂點組成的形狀的定向邊界框不現實? – M2X