我想移動一個框跟隨鼠標位置,但我不知道如何將我從sf :: Mouse :: getPosition()獲取的位置轉換爲OpenGL中的座標如何將鼠標從SFML位置轉換爲OpenGL座標?
回答
如果可以,請嘗試使用GLU庫中的gluUnproject
函數。否則,您需要通過計算模型視圖和投影的逆矩陣來重新實現它,然後以相反的順序(即反向投影,然後逆向模型視圖)將它們應用到屏幕點。您可能需要添加額外的步驟才能將窗口畫布座標轉換回投影屏幕座標(該步驟取決於您的投影設置)。
我提供了一個使用SDL的示例程序,並在that answer中提供了gluUnproject
。
注意的是:
模型視圖逆可以通過successivelly施加opposit變換以相反的順序平凡計算。例如,如果您通過翻譯首先通過身份設置您的模型視圖,然後輪換,那麼您只需將其設置爲< -a,-b,-c>旋轉,然後應用< -x,-y,-z>翻譯以獲得逆模型視圖。
對於投影逆矩陣,the red book appendix F - that gamedev.net page指示器(雖然鏈接在那裏被打破) - 給出了一個解決方案。
這隻會爲您提供矩陣,從同類opengl投影空間中取消投影點。您需要首先從該空間中選擇一個點。這一點可以選擇使用首先轉換回投影空間的屏幕座標。在我的例子中,這涉及翻轉關於畫布尺寸的座標(但事情可能與另一個投影設置可能不同),然後通過添加仔細選擇的z分量將它們擴展到3D。
也就是說,在另一個問題的示例程序中,目標是將穿過投影像素的光線投射到場景中,並計算出該線與場景中的點之間的距離,並選擇最接近一。您可能可以通過注意到鼠標始終移動到相機投影計劃中來避免整個未投資業務。因此,對象的平移向量必須由相機的單位向量(我假設Z是垂直於屏幕的軸,如通常在OpenGL中那樣)組成,這兩個向量的縮放比例因數取決於物體到相機的距離。
你會得到這樣的事情:
+--------+ object translation plane
| /
| /
| /
| /
+----+ screen plane
| /
| /
|/
|/
+ camera eye position
您可以從Intercept theorem得到的縮放因子,並從模型視圖矩陣的第一和第二列的X和ÿ相機載體。
最終平移矢量應沿的線的東西:
T = f * (dx * X + dy * Y)
其中f
是縮放因子,X
和Y
相機載體和<dx,dy>
鼠標座標德爾塔矢量中的投影空間。
您知道您的窗口分辨率,和鼠標相對於窗口的位置。從那裏你可以確定一個標準化的座標[0,1]。從這個座標中,您可以將光線投影到您的場景中,並使用投影*視圖矩陣的逆矩陣,可以將其轉化爲世界空間射線。
然後,由您決定將世界空間射線與您的場景對象相交(通過碰撞檢測)以確定「單擊」對象(請注意,由於深度可能會有多於一個;通常您需要最接近的命中)。這一切都取決於你如何組織你的場景的空間信息,如果你有一些空間分區結構(例如八叉樹或BSP)用於快速剔除和簡化你的「場景對象」上的邊界框(例如AABB或球體)爲一個快速廣泛的階段。
我會說更多,但「OpenGL中的座標」是高度不詳的。通常,你不僅對座標感興趣,而且對它有意義的「場景對象」以及一大堆其他屬性感興趣。
- 1. 將Glut鼠標座標轉換爲opengl
- 2. Java Slick2d - 如何將鼠標座標轉換爲世界座標
- 3. glm :: unProject將鼠標位置轉換爲3個座標
- 4. 如何更改OpenGL/SFML中鼠標光標的位置?
- 5. gluUnProject嘗試將鼠標座標轉換爲opengl座標的奇怪行爲
- 6. OpenGL:如何將世界座標轉換爲屏幕座標?
- 7. 如何將窗口座標轉換爲2D OpenGL ES座標?
- 8. 將鼠標座標轉換爲Qt中的標籤座標
- 9. 如何將轉換後的座標轉換爲OpenGL中的世界座標?
- 10. 將鼠標轉換爲屏幕位置
- 11. 如何將ContextMenuEventArgs光標位置轉換爲窗口座標
- 12. 從鼠標位置設置X座標
- 13. OpenGL座標轉換
- 14. 將鼠標監聽器座標轉換爲圖表座標
- 15. 將屏幕鼠標座標轉換爲窗口座標
- 16. 如何將屏幕鼠標座標轉換爲POINTS結構
- 17. 如何將鼠標轉換爲世界座標?
- 18. C++/OpenGL將世界座標轉換爲屏幕(2D)座標
- 19. 在OpenGL中將窗口座標轉換爲軸座標
- 20. android opengl es 2.0將屏幕座標轉換爲世界座標
- 21. Opengl將相對身體座標轉換爲世界座標
- 22. 將對象座標轉換爲屏幕座標Android OpenGL ES
- 23. 將OpenGL畫布座標轉換爲HTML5畫布座標
- 24. iOS將TouchBegan座標轉換爲OpenGL ES座標
- 25. 將屏幕座標轉換爲OpenGL座標
- 26. 如何將單擊pictureBox時鼠標光標座標轉換爲屏幕相對鼠標光標座標?
- 27. 在OpenGL ES中,如何將屏幕座標轉換爲世界座標?
- 28. 如何將OpenGL ES中的「世界座標轉換爲對象座標」for android?
- 29. 如何將2D屏幕座標轉換爲openGL中的2D地圖座標?
- 30. 如何將世界座標轉換爲OpenGL ES 2.0中的屏幕座標
你的屏幕座標是2D的,而opengl的是3D的。整個錐形的opengl點可能轉換爲給定的屏幕像素。 – didierc