c++ /OpenGL转换世界坐标到屏幕(2D)坐标
C++/OpenGL convert world coords to screen(2D) coords
我正在用OpenGL制作一款游戏,在世界空间中我有一些对象。我想做一个函数,我可以在一个对象的位置(3D),并将其转换为屏幕的位置(2D),并返回它。
我知道物体的三维位置,投影矩阵和视图矩阵在以下变量中:
Matrix projectionMatrix;
Matrix viewMatrix;
Vector3 point3D;
要进行此转换,必须首先获取模型空间位置并将其转换为剪辑空间。这是用矩阵乘法完成的。我将使用glsl风格的代码使我所做的事情更明显:
vec4 clipSpacePos = projectionMatrix * (viewMatrix * vec4(point3D, 1.0));
注意我是如何在乘法之前将你的3D向量转换成4D向量的。这是必要的,因为矩阵是4x4的,而你不能将4x4矩阵与3D向量相乘。你需要第四个组件。
下一步是将该位置从clip-space转换为归一化设备坐标空间(NDC空间)。NDC空间在所有三个轴上都在[- 1,1]范围内。这是通过将前三个坐标除以第四个坐标来完成的:
vec3 ndcSpacePos = clipSpacePos.xyz / clipSpacePos.w;
显然,如果clipSpacePos.w
为零,则有问题,因此您应该事先检查。如果它是零,那就意味着物体在投影平面上;它的视空间深度为0。这些顶点被OpenGL自动裁剪。
下一步是将这个[- 1,1]空间转换为窗口相对坐标。这需要使用传递给glViewport
的值。前两个参数是窗口左下角的偏移量(vec2 viewOffset
),后两个参数是视口区域的宽度/高度(vec2 viewSize
)。给定这些,窗口空间位置为:
vec2 windowSpacePos = ((ndcSpacePos.xy + 1.0) / 2.0) * viewSize + viewOffset;
你就到这里了。记住:OpenGL的窗口空间是相对于窗口左下角的,而不是左上角。
相关文章:
- 在 cv::Mat 中生成 2D 坐标网格
- 用于将笛卡尔 (x,y,z) 转换为圆柱坐标 (ρ,θ,z) 坐标 2D/3D 的代码
- 将 2D 图像坐标转换为 z = 0 的 3D 世界坐标
- 在 C++ 中实现 1D 数组中的 2D 数组坐标
- 此方法是否不适合在 std::unordered_map 中使用 2D 坐标作为键
- 将 2D 屏幕坐标转换为 3D 世界坐标
- OpenCV从2D像素获取3D坐标
- OPENCV(C ) - 从已知的3D对象和相机位置计算图像的2D坐标
- 如何在2D矩阵中找到最短路径,以免避免某些坐标?C
- 在OpenGL 2.1中,即使在2D空间(具有2D纹理),也可以安全使用3D TEX坐标
- C++:在 2D 数组中的 2 个坐标之间"Distance"
- 在没有2D阵列的情况下从矩阵文件中读取坐标
- 从2D纹理上的位置(x,y)计算.obj文件中的vt(u,v)坐标
- OpenCV立体视觉3D坐标到2D相机平面投影不同于将2D点三角化到3D
- 鼠标世界坐标框2D
- 从 2d 坐标的列表(矢量)中提取上限和下边界
- 2D 坐标到 3D 坐标分辨率和相机矩阵
- c++ /OpenGL转换世界坐标到屏幕(2D)坐标
- 在2D坐标中缩放到屏幕的中心
- 从3D坐标转换到2D坐标的问题