将顶点坐标转换为屏幕坐标"same"
Transform vertex coordinate to "same" screen coordinate
我使用Direct3D从顶点缓冲区中绘制顶点,顶点格式为FVF_XYZ
。
我现在想实现绘制线条的功能。当在3D空间中绘制一条线时,我将端点投影到2D屏幕空间,并使用我的函数从2D空间中绘制一条线。我的问题是这个功能。
顶点缓冲区包含坐标为(0,0,0)
和(1,0,0)
的两个顶点。我打算用基本的数学和变换把这条基本线转换成我的最后一行。
问题是,当我想渲染一个顶点到屏幕坐标(0,0)
时,例如,我不知道如何设置变换矩阵。
根据我的理解,在设置世界,视图和投影矩阵来识别时,我应该结束和屏幕坐标(0,0)
,但(0,0,0)
最终在屏幕的中心。
我需要如何设置世界,视图和投影矩阵,以便我从(0,0,0)
转换到(0,0)
,从(1,0,0)
转换到(1,0)
等等?
首先值得注意的是,在投影空间中(-1,1,z, w)变换为(0,0),(1,-1,z, w)变换为(1,1)。
在这个基础上,你想把一个给定的顶点变换到它的投影空间只需要做下面的事情:
T' = W * V * P
(其中W为世界矩阵,V为视图矩阵,p为投影矩阵)。
你现在可以将任何齐次坐标(4即x,y,z,1)乘以投影空间
现在,如果您希望执行透视图除法,只需执行除以w的除法即可。
x' = x / w;
y' = y / w;
z' = z / w;
w' = w / w; // or 1
现在你有了一组坐标,其中x,y坐标在-1,-1到(1,1)的范围内。如果你希望将它们转换成0 -> 1的空间,你建议你做以下事情:
x'' = (x' + 1) / 2;
y'' = (-y' + 1) / 2;
你现在有了你在空间中的坐标,0,0是左上角,0,1是右下角。
同样值得注意的是,在透视图分隔之后的z'值可以放入z缓冲区中。如果z值小于0(或者大于我想不起来的值),则它被前平面剪切,大于/小于+/-1则超出远剪切平面。
希望对你有帮助。
相关文章:
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 跳转到通过输入坐标定义的控制台屏幕位置
- 如何在Openscenegraph中从二维鼠标点击的屏幕坐标点计算三维点(世界坐标)
- 检测屏幕上的坐标是否可交互
- OpenGL屏幕坐标到世界坐标
- 将 2D 屏幕坐标转换为 3D 世界坐标
- 如何获得世界坐标屏幕(DX11,C )的射线方向
- 屏幕坐标和设备坐标有什么区别?
- 使用二维屏幕坐标gluUnproject获取三维模型坐标
- 对话框单位到屏幕坐标
- 将文本光标移动到特定的屏幕坐标
- 在 OpenGL 中将 3D 坐标转换为屏幕坐标
- 原点直接到屏幕坐标
- 将屏幕坐标转换为游戏坐标
- 俯仰和偏航至2d屏幕坐标
- 将顶点坐标转换为屏幕坐标"same"
- OpenGL转换在NDC坐标而不是屏幕坐标(2D)
- 在路径跟踪器中查找屏幕坐标背后的数学
- 笛卡尔坐标和屏幕坐标之间的转换
- 排序屏幕坐标