将顶点坐标转换为屏幕坐标"same"

Transform vertex coordinate to "same" screen coordinate

本文关键字:屏幕坐标 same 转换 顶点 坐标      更新时间:2023-10-16

我使用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则超出远剪切平面。

希望对你有帮助。