将顶点坐标转换为“相同”屏幕坐标

时间:2013-05-09 16:54:24

标签: c++ directx rendering transformation direct3d

我正在使用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)等等?< / p>

1 个答案:

答案 0 :(得分:1)

首先值得注意的是,在投影空间(-1,1,z,w)中,转换为(0,0)和(1,-1,z,w)为(1,1)。

因此,在您希望将给定顶点转换为其投影空间的基础上,只需执行以下操作即可:

T' = W * V * P

(其中W是世界矩阵,V是视图矩阵,P是投影矩阵)。

现在可以将任何齐次坐标(即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超出远剪裁平面。

希望有所帮助。