2009-05-06 34 views
1

我有一個簡單的實體建模應用程序,我想在其中實現幾種「導航模式」,用戶可以通過三維空間導航相機的方式。其中之一是在SketchUp,Blender等中使用的無處不在的「拖動和平移/旋轉」。我也想要實現與我的特定應用程序更相關的內容。具體來說,我想實現一種模式,使相機漂浮在建模對象上方的「環形」上,並始終查看模型的中心;這樣,用戶可以很容易地在對象周圍「旋轉」,這是我的應用程序中的一種常見操作。將OpenGL渲染合併到一個視圖中

所以,我想要做的是在我的視圖中渲染建築物,並在視圖的右上方顯示一個圓環,在圓環上有一個小球體來表示相機的位置。環面中會有一個北向箭頭,用戶將通過拖動球體來拖動模型對象周圍的相機;移動球體將重新定位相機並重新繪製場景。

看起來我應該做的是以下幾點:渲染'主視圖',即建築物;然後將圓環和球體(具有不同的透視設置和光照)渲染到屏幕外的緩衝區,然後從那裏將其投射到我的主視圖。然後我就進入命中測試。我想檢測用戶是否點擊球體或環面;從我從OpenGL拾取中瞭解的內容(它似乎是一個很難的主題:/),所有拾取方法僅適用於在一個「場景」中進行選擇。除此之外,顯然,我仍然希望檢測建築模型中的「正常」採摘操作。

所以,我的問題:

  • 如何呈現到屏幕外緩衝區和塊傳送到另一個OpenGL上下文(與阿爾法混合&透明像圓環的中心)?
  • 如何在描述的場景中進行點擊測試?

回答

2

我不認爲你需要爲此進行離屏渲染。你應該能夠重新設置攝像機和viewport並在主場景之後渲染疊加層。你可能會遇到Z順序和/或緩衝的問題,但是「子場景」可能很簡單,不需要考慮,或者你當然可以在渲染之前清除Z緩衝區。

0

我同意@unwind;你不需要屏幕外的緩衝區。如果您想要,請搜索「渲染到紋理」。

至於命中測試,The OpenGL FAQ有一個條目。它描述了幾種解決方案:使用GL_SELECTION渲染模式,使用gluUnproject()獲取3D碰撞射線和使用獨特顏色的簡單2D解決方案。

1

就繪製torus/sphere而言,創建一個單獨的類並實現「繪製」方法。讓該類包含球體和圓環體的位置,並將draw()渲染到屏幕上。

然後,只需在您的主要繪圖方法中調用myRing.draw(),並且您將擁有一個球體和圓環!

如果你的意思是你想要在窗口的右上角有一個用2D渲染的圓圈/圓環(這可能更容易些),那麼同樣的想法將適用於你的hitbox文章(除非沒有令人討厭的投影計算!)

最後,我會考慮使用功能鍵結合鼠標拖動來實現您想要的功能...例如用戶持有「移位」,然後在屏幕上單擊拖動鼠標。這些鼠標事件被捕獲,並且x-delta用於計算旋轉角度。相機的位置更新,因爲這發生,你會得到一個平滑的滑動:)

+0

謝謝,爲未來讀者的完整性,這裏的鏈接到你提到的帖子:http://stackoverflow.com/questions/829786/ways -to-implement-manipulation-handles-in-3d-view/830909#830909。我認爲這裏有足夠的重複,儘管我現在的想法是渲染一個3d環面:) – Roel 2009-05-07 10:17:53