line_loop是由opengl創建的。我需要選取線段的頂點,然後將其拖動到2D屏幕中的某個位置。如何通過選擇頂點來拖動線段
我的想法是使用Opengl拾取方法拾取線的頂點,然後從glSelectBuffer
創建存儲匹配記錄的緩衝區。問題是我怎麼知道從返回緩衝區的信息中選擇哪個頂點?緩衝區存儲頂點的name
。但是,似乎頂點在GL_RENDER
模式中沒有名稱?
更新:有沒有其他方便的方法來拖動鼠標的線?
line_loop是由opengl創建的。我需要選取線段的頂點,然後將其拖動到2D屏幕中的某個位置。如何通過選擇頂點來拖動線段
我的想法是使用Opengl拾取方法拾取線的頂點,然後從glSelectBuffer
創建存儲匹配記錄的緩衝區。問題是我怎麼知道從返回緩衝區的信息中選擇哪個頂點?緩衝區存儲頂點的name
。但是,似乎頂點在GL_RENDER
模式中沒有名稱?
更新:有沒有其他方便的方法來拖動鼠標的線?
OpenGL不是一個場景圖(gah,它似乎在OpenGL上的每個其他問題我回答以此語句開頭)。繪製完東西后,OpenGL不再有任何回憶你實際發送的內容。舊的OpenGL選擇模式在技術上只是測試提交的幾何是否在投影剪輯空間範圍內。在大多數OpenGL實現中,選擇模式會回退到軟件渲染模式,因此您將獲得主要的性能提升。
有幾種更好的選擇方式(這就是爲什麼選擇模式已經從OpenGL中刪除了)。如果它只是特定幾何體中的單個頂點(如選擇橡皮筋),那麼您應該將這些點的整個變換自己執行到標準化的設備座標中,將它們分類到某個屏幕空間空間細分結構中(2d Kd樹,四叉樹等等),以便您可以確定點擊的時間點爲O(log n)時間 - 與您在選擇模式下使用的O(n)相比,您必須「繪製」整個橡皮筋,以便所有點都進行測試。
編輯/更新
由於OpenGL是(只)的繪圖API,您也不能 「拖動」 的事情。你將不得不重新繪製它們。從技術上講,您應該重繪整個場景,或者在開始拖動時繪製場景,而不將對象拖動到紋理(顏色和深度)中,然後對於每個拖動步驟將視圖清除到紋理中的緩存內容然後將拖動的對象添加到其更新的位置。
我有點困惑,如果你知道鼠標點擊的地方,以及屏幕空間中的行結束點,你當然可以計算出哪個最接近? – cmannett85
@cbamber85,我希望使用openGL的揀選和選擇方法。也就是說,我希望從返回的緩衝區中派生出要選擇哪個基元? – Sean
@ cbamber85,你的意思是我可以比較鼠標點和所有線點的x和y值,以確定哪個點被選中? – Sean