2010-01-31 43 views
0

在這裏,我們爲另一個問題。屏幕上的圖形碰撞

之前的一個,我終於完成了kDop系統和一切有關。 (kDop的等級樹等)。 一切工作正常。

現在我想在屏幕上畫出衝突以進行調試,並查看工作結果。 (要查看我在特定模式下所做的分層選擇是否正確)

對於AABB/Sphere沒有問題,它非常容易創建。 問題是與kDOP ...

我:

軸系 (1,0,0)(0,1,0)(0,0,1)(1,1,1 )( - 1,1,1)(1,-1,1)(1,1,-1)(1,1,0)(1,0,1),(0,1,1),(1 ,-1,0),(1,0,-1),(0,1,-1) 和使用座標軸計算的最小/最大值。

如何用這些數據創建一系列多邊形(實際上是一個簡單的網格)? (我不在乎實現,我只是想理解它,所以我可以實現它)

非常感謝答案!

編輯:我可以很容易地計算網格的原因,我已經有了軸。問題是計算頂點的位置...

編輯2:我在網上發現這個代碼似乎是有用的(或至少在它說它創建一個調試網格的文檔),但我不'知道如何使用它來尋找頂點位置:

real Kdop::getDistanceOfPlaneToOrigin(int k) const { 
     if (k < 0 || k >= mK) { 
      return 0.0f; 
     } 
     if (k >= mK/2) { 
      return (real) (mDistances[k] * -1.0); 
     } 
     return mDistances[k]; 
    } 

編輯3:我想和具有法線與點(原點,我敢肯定,飛機越過),我可以建立所有飛機相關的操作...現在我需要更多的東西....

+0

給定正常的n和距離原點d的距離,你基本上已經獲得了你的平面座標。如果你的法線是呃標準化的,點p的平面方程爲:np - d = 0(你可以根據你所關心的飛機的哪一側將其改變爲不等式) – comingstorm 2010-02-01 19:15:15

+0

... if您的正常*不是*正常化,請使用:np - d | n | = 0 – comingstorm 2010-02-01 19:19:18

回答

1

通常,每個頂點是三個平面的交點。另外,要繪製的每個頂點都需要位於所有剩餘平面的正確一側。這可能是一個令人討厭的問題組合描述,但用kDop,至少它是一個固定大小的問題...

爲了讓它更聰明一些,你應該看看一些線性編程數學。具體來說,一旦你有一個有效的頂點(即,在其餘平面的正確一側的3個平面的交集),你可以沿着每個邊沿滑動到下一個有效頂點。您可以以這種方式遞歸地探索有效頂點和邊的整個圖形:對圖進行廣度優先搜索,跟蹤您探索的頂點 - 一旦用盡了可能性(有限,請記住!)。你有你想要畫的東西。

哦,並根據飛機計算實際頂點,請查看this mathworld page

實際上,如果你確定沒有一架飛機是多餘的(也就是說,如果他們都不在你的kDop之外),你可能能夠簡化你的搜索。在這種情況下,您的kDop具有標準結構,每個多邊形具有固定的鄰居配置;在這種情況下,你可以插入你的飛機,計算你固定的一組頂點,並繪製你的標準圖。你可以很容易地(如果有點枯燥)手工制定出所有的細節。

您可能想要留意退化的情況,例如 - 如果你在你的kDop中放置一個方向立方體,那麼你的大部分方面都是零大小的。 - 在進一步的考慮中,我認爲你的配置可能不完全是固定不變的。例如,假設有四個附近的飛機;並根據其深度,它們之間的邊緣可能會這樣或那樣的,像這樣:

plane A  | plane B 
      | 
     /\ 
     / \ 
     / \ 
________/  \ 
     |  \ 
     |   \ 
plane C | plane D \ 

     vs. 

plane A | plane B 
     | 
     | 
________| 
     \ 
      \ 
      |\ 
      | \ 
      | \ 
      | \ 
      | \ 
      |  \ 
      |  \ 
      |  \ 
      |  \ 
plane C | plane D \ 

不過,我覺得你還是可以簡化設置一些。您仍然需要檢查您的頂點是否有效,但是通過考慮您的特定平面配置,您可以減少要檢查的頂點數量和平面數量。

+0

我對第二種解決方案感興趣,事實上軸一直都是相同的,並且一直在kDOP內,我只需要找到哪些軸與哪個軸相結合。我實際上已經創建了一個例程來交叉3個飛機並得到一個點,我只需要找到所有的組合。任何線索?:D – feal87 2010-02-01 19:57:54

+0

實際上只是一個立方體的圖像和所有的simmetry軸/平面就足夠了因爲我很難形象化的東西:D – feal87 2010-02-01 20:02:38

+0

Mhn ...詢問我發現了另一個解決方案N^2。我會先嚐試一下,看看它是否正常工作:) – feal87 2010-02-01 22:47:56

0

你看看行軍立方體算法? (http://en.wikipedia.org/wiki/Marching_cubes

我不知道它是否可以按原樣使用,但您可以從中激發自己。

+0

Mhn ...明天我會看看它。它看起來可怕...:P – feal87 2010-01-31 21:08:14

+0

如果行軍立方體算法看起來很可怕,我很抱歉地說,我不知道是否有其他技術適合你:( – Julio 2010-02-01 11:05:14

+0

我搜索了周圍,它似乎不是好的方式去。我發現了一種蠻力的方式,但它的速度太慢了...... – feal87 2010-02-01 13:31:15