我已经看过很多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