2015-11-14 78 views
1

3d採摘有沒有「標準」方法?大多數遊戲公司做什麼? (準確的配貨)OpenGL中的3D採摘

我認爲最快的方法就是使用GPU和渲染每一個對象有「色指數」,然後使用glReadPixels(),但後來我聽說,它很慢,因爲glFlush()glFinish()通話考慮。

還有這種射線投射方法,雖然不錯,但由於球體/ AABB近似值不準確。

+0

光線投射是標準方法。如果僅將邊界體積用於加速而不是最終交集結果,則不必是不準確的。 – derhass

+0

你的意思是「只爲了加速,而不是爲了最終的相交結果」?你能解釋更多嗎? – Pilpel

+0

那麼,在整個三角形網格上進行三角形射線相交測試(可能通過進一步預先計算的數據結構加速),以找到確切的交點。 – derhass

回答

2

關於什麼是「標準」的任何問題都可能引發一些自以爲是的反應,但我認爲這裏最接近「標準」的是光線投射。

帶上您的防水射線/三角相交函數,並測試從您的鼠標光標位置未投影到您場景中三角形的射線。

通常這會很慢,需要線性複雜度。所以下一步就是加速到更好的狀態,如對數時間。這通常通過諸如八叉樹,BVH,K-D樹或BSP的數據結構來實現。有時候人們會跳過這一步,只是嘗試使射線/三角交叉點真的很快並且真正平行,甚至可能使用GPGPU。

它需要更多的工作比前期基於幀緩存解決方案,但複雜的應用往往會走這條路可能是因爲:

  1. 可移植性:它是從渲染引擎分離。它不必綁定到OpenGL或DirectX,例如,這可以提高可移植性。
  2. 通用性:通常情況下,加速器和相關查詢是其他事情所必需的。例如,FPS遊戲可能會讓玩家和敵人不斷地相互射擊。找出什麼樣的炮彈擊中什麼往往需要這些類型的交叉口問題不斷髮生,而不僅僅是一個統一的視角。
  3. 簡單性:開發人員可以承擔額外的工作,以便日後簡化。

還有這種光線投射方法,這是好的,但因爲球/近似的AABB不 準確。

對於使用AABB或邊界球進行加速目的應該沒有任何不準確的地方。這些純粹是爲了加速測試,並迅速減少需要通過進行更便宜的測試而需要發生的更昂貴的射線/三角形交點的數量,以及消除大批量三角形以批量檢查的數量。通常他們應該被構建爲包含場景中的元素。如果你先做一個光線/ AABB交點,例如,如果這個點擊,測試AABB中包含的元素。任何沒有加速器的加速結構都不會給出相同的結果,通常會是一個糟糕的結果。例如,一種非常基本的加速形式就是在場景中的一個網格元素周圍放置一個邊界框,就像一個字符一樣,有時這種基本形式不涉及全面的加速器,可能對非常動態的元素很有用在場景中(以避免不斷更新加速器的成本)。如果射線與角色的邊界框相交,則檢查組成該角色的所有三角形。之後,只要您檢查AABB中的三角形,它就會變成加速度而非近似值。當然,如果你只檢查了AABB而沒有其他的,那麼這將是一個粗略的近似值。

+1

從來沒有得到這個..通知怪異的。謝謝! – Pilpel