2012-05-18 69 views
2

我在想如何在我的OpenGL應用程序中做碰撞檢測,並得出結論,我應該保留兩個我的幾何數據副本。OpenGL:處理碰撞檢測和頂點數據的建議?

1)首張複印:只支持OpenGL渲染purposes.This可以保存爲VBO,頂點索引(保存在GPU)

2)第二個副本:我保存客戶端(在一個類中,比如說3DEntity),我執行所有測試,包括邊界框碰撞測試,光線投射,

因此,在我加載一個網格數據(比如從一個OBJ文件)之後,首先準備「第一個副本」然後使用「頂點索引」準備「第二個副本」。 (例如:如果我的網格是一個簡單的立方體,我的「第一個副本」將有8個頂點,並使用頂點索引來正確渲染它。但是我的「第二個副本」將有36個頂點。因爲我必須做射線在三角形上投射)

我在「3DEntity」中保留了一個轉換矩陣,以保持我的「3d實體」的Position,Rotation..etc等狀態。 所以在僞代碼中;

class 3DEntity { 
Vertex[] verticesForPhysics; 
Matrix tranformationMatrix; 
} 

我保持固定「verticesForPhysics」值。(手段,它總是在模型座標系)。所以,當我想移動,旋轉,我的實體,我只是改變「transformationMatrix」。

當進行像碰撞檢測這樣的測試時,我通過將「verticesForPhysics」乘以「transformationMatrix」給出世界座標中的頂點,再次製作頂點的臨時副本。

Vertex[] verticesForPhysicsInWorld=transformationMatrix * verticesForPhysics; 

現在我用這些「verticesForPhysicsInWorld」做我的測試。

這是處理這個問題的正確方法嗎? 我擔心通過保留兩個副本併爲碰撞檢測測試製作另一個臨時副本來實現數據冗餘。 其他OpenGL遊戲引擎如何處理?

+0

如果它有效,那麼它是正確的。 –

+0

我想知道這是否是最好的方法?通過保留兩份副本,我擔心數據冗餘,並再次爲碰撞檢測測試創建臨時副本。 –

回答

3

這是非常正常的有頂點數據的多個副本,所以不用擔心:-)

例如,你可能有:

描述您的幾何
  • 未轉化的頂點數據
  • 渲染過程中轉換的頂點數據(可能由GPU完成)
  • 簡化的用於碰撞檢測的變換數據(例如AABB樹) - 這比使用完整變換頂點數據處理collisi在檢測!
  • 需要時,轉換頂點數據以獲得更詳細的碰撞檢測,但只有在之後已確定由於AABB重疊而導致兩個對象可能發生碰撞。你不想在每一幀都做到這一點!

請注意,用於物理的頂點數據/幾何體與用於渲染的頂點數據/幾何體不同也是常見的。通常情況下,您可以使用較簡單的對象進行碰撞檢測(例如球體,圓柱體)