2014-02-05 55 views
0

如何在OpenGL中高效地執行選擇?如何在OpenGL中使用框選擇高效選擇對象

我已閱讀此question,仍然有些事情對我而言仍然不確定。

在我的應用程序中,我想支持兩種選擇形式。首先用鼠標點擊,然後用pickbox選擇。我的應用程序還繼承了90年代和2000年初與OpenGL特別相關的一些糟糕的編程實踐,例如它使用GL_SELECT。

畢竟我的閱讀,我明白這可能是非常低效的。我已經學會了兩種方式來解決這個問題:

  1. 顏色採摘:獨特的顏色分配給在 場景中的每個對象。在1x1px的虛構窗口上渲染並閱讀顏色。
  2. 光線投射使用碰撞檢測

問題:

  1. 如何進行顏色挑選了一箱?我只是簡單地將場景渲染到與我的盒子大小相同的窗口中,並閱讀收集獨特顏色的像素矩陣以便適當選擇?
  2. 是光線投射的首選方法嗎?如果是這樣,那麼如何延長拾取盒?
  3. 除了這些常用的方法還有其他方法嗎?
+0

除非你已經通過配置來驗證這是造成問題的原因(我敢打賭你沒有,事實上並非如此),請不要這麼做。在等待數百毫秒的鼠標輸入之後,快速找到對象一毫秒毫無意義。 –

+0

是否要選擇選擇矩形內的所有對象或僅選擇不完全遮擋的對象?因爲如果你想選擇全部,那將排除顏色選擇。 –

+0

@JerryCoffin我有幾十萬的場景,其中有不少物體。根據對象的複雜程度和對象的數量,可能需要一秒或更多時間才能用當前設置選擇對象。我不認爲這是整個過程的瓶頸,但我希望知道未來的選擇是什麼理想的選擇方法。 – pippin1289

回答

2

1.如何對盒子進行顏色採集?我只是簡單地將場景渲染到與我的盒子大小相同的窗口中,並閱讀收集獨特顏色的像素矩陣以便適當選擇?

這是我會做的,但是這隻會選擇至少部分可見的對象。完全遮擋的對象不會選擇顏色選擇。

2.光線投射是首選方法嗎?如果是這樣,那麼如何延長拾取盒?

我會說,光線投射是首選的方法,是的。 AFAIK,它不能很容易地擴展爲拾取盒(儘管這確實是挑選錐體)。我將使用空間數據結構(如八叉樹)快速爲截錐體選擇候選對象,然後我會針對每個候選對象的邊界框測試平截頭體。對於剩下的候選人,我會檢查它的任何頂點是否位於平截頭體內。

八叉樹可以重複使用以加快射線拾取(用於點擊選擇)。儘管如此,取決於對象和頂點的數量,這可能還不夠快。我相信有辦法加快它的速度。

3.除了這些常用的方法還有其他方法嗎?

不是我所知道的。