我已經看過很多Screen-Coordinate的世界座標帖子,但還沒有看到相反的情況。從我看過的任何角度看,有沒有一種簡單的方法可以從3d點獲取屏幕座標?我使用C++和OpenGL如何從3D點獲取屏幕座標? Opengl
回答
屏幕座標的頂點就是它的投影和模型視圖矩陣乘法這樣頂點的結果:
screen_coordinates = projection_matrix * modelview_matrix * world_coordinates
您可以自己動手完成它(尤其是如果你用一些數學庫在基質上做操作),或者使用gluProject,例如:
std::array<GLfloat, 16> projection;
std::array<GLfloat, 16> modelview;
std::array<GLfloat, 3> screen_coords;
glGetFloatv(GL_PROJECTION_MATRIX, projection.data());
glGetFloatv(GL_MODELVIEW_MATRIX, modelview.data());
gluProject(world_coords[0], world_coords[1], world_coords[2],
modelview.data(), projection.data(),
screen_coords.data(), screen_coords.data() + 1, screen_coords.data() + 2);
Downvote。 gluProject做正確的事情,但你的解釋不。將一個點與模型視圖矩陣和投影矩陣相乘即可得出剪輯空間座標,但*之前*除以w。它不會給你屏幕空間的座標。見巴巴爾的答案。 – 2010-09-25 10:49:06
要判斷它是否提供了正確的空間座標,您需要更多關於OP的世界設置的詳細信息,例如我幾乎沒有使用視角設置爲我的2D遊戲。但看起來你的水晶球完美無缺,所以thv爲downvote :) – erjot 2010-09-26 21:04:03
PS。不是OpenGL的(固定功能流水線)視口的PROJECTION矩陣包含設置?你需要明確地除以w的情況是什麼? GLSL默認是這樣做的。你使用的是視口,不管你是否知道,你使用的是 – erjot 2010-09-26 21:09:26
erjot的答案是不完整的。
還有兩件事要考慮。
- 與
homogeneous = P . M . world
,homogeneous
向量是均勻空間中的4維向量。特別是,要使其回到[-1:1]^3立方體,需要將其前3個座標除以homogeneous.w
。cube.x = homogeneous.x/homogeneous.w
(有人稱之爲投影鴻溝)。 - 然後,您需要通過對其應用視口轉換將[-1:1]^3立方體轉換爲窗口座標。
window.x = viewport.x + viewport.width * (cube.x+1)/2
如果你關心最終的Z,轉換不是通過視口,而是通過DepthRange。
另一件事。記住,gluProject給出座標系的起點在左下角開始的座標。屏幕座標從左上角開始。爲了獲得正確的屏幕座標值,必須從OpenGL設備的高度中減去y的值。
例如,在Qt的GLWidget繪製在(0,1,2)世界座標不言而喻文本:
gluProject(0,1,2,modelMatrix,projMatrix,sc.x,sc.y, sc.z); renderText(sc.x,height() - sc.y,「(0,1,2)」);
- 1. 如何從opengl es2.0的屏幕座標獲取世界座標?
- 2. 使用2D屏幕座標獲取3D模型座標gluUnproject
- 3. OpenGL屏幕座標
- 4. 如何從OpenGL中的世界座標獲取屏幕座標android
- 5. 獲取鼠標屏幕座標點擊
- 6. 從3D點獲取2D屏幕點
- 7. 如何從屏幕座標獲取對象座標?
- 8. OpenGL座標匹配屏幕座標?
- 9. OpenGL場景座標到屏幕座標
- 10. OSMdroid如何獲取屏幕座標?
- 11. 從UILongPressGestureRecognizer獲取屏幕座標
- 12. 來自頂點座標的OpenGl ES 1.1屏幕座標
- 13. 如何屏幕座標轉換成2D OpenGL的座標
- 14. OpenGL:如何將世界座標轉換爲屏幕座標?
- 15. 如何在屏幕的0,0,-1 opengl座標上繪製黑點?
- 16. 獲取Papervision 2.0中3D對象的2D屏幕座標
- 17. 如何根據鼠標點擊獲取3D中點的座標?
- 18. 如何點擊屏幕上的座標?
- 19. 項目3D指向2D屏幕座標
- 20. 將3D點投影到2D屏幕座標OpenTK
- 21. OpenGL ES座標屏幕像素
- 22. 獲取屏幕座標的css
- 23. 獲取DOM元素的屏幕座標
- 24. 獲取某個UITableViewCell的屏幕座標?
- 25. 取所有屏幕座標
- 26. 如何獲取ogl中觸摸屏點的座標?
- 27. 如何將頂點座標轉換爲屏幕像素座標?
- 28. Xna將3D座標轉換爲2D屏幕座標
- 29. 如何獲取WPF中的當前鼠標屏幕座標?
- 30. 屏幕座標
這是一個確切的副本http://stackoverflow.com/questions/724219/how-to-convert-a-3d-point-into-2d-perspective-projection/866749#866749 – 2010-09-25 10:53:13
@Mads Elvheim:幾乎一個確切的副本。這個問題是針對C++和OpenGL的。另一個問題不是。事實上,另一個問題被標記爲「Java」。 – 2011-11-18 19:20:01