1

我正在使用 Direct3D 从具有顶点格式的顶点缓冲区中绘制顶点FVF_XYZ

我现在想实现画线的功能。在 3D 空间中绘制一条线时,我将端点投影到 2D 屏幕空间并使用我的函数从 2D 空间中绘制一条线。我的问题是这个功能。

我的顶点缓冲区包含两个顶点,其坐标(0,0,0)(1,0,0). 我打算用基本的数学和转换将这条基本线转换为我的最后一行。

问题是,例如,当我想将顶点渲染到屏幕坐标(0,0)时,我不知道如何设置转换矩阵。

(0,0)根据我的理解,在将世界、视图和投影矩阵设置为身份时,我应该结束屏幕坐标,但(0,0,0)最终会出现在屏幕的中心。

我需要如何设置世界、视图和投影矩阵,以便从(0,0,0)to(0,0)和 from (1,0,0)to(1,0)等进行转换?

4

1 回答 1

1

首先值得注意的是,在投影空间中 (-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 即可。IE

x' = x / w;
y' = y / w;
z' = z / w;
w' = w / w; // or 1

现在您有了一组坐标,其中 x,y 坐标在 -1, -1 到 (1, 1) 的范围内。因此,如果您希望将它们转换为 he 0 -> 1 空间,您建议您执行以下操作:

x'' = (x'  + 1) / 2;
y'' = (-y' + 1) / 2;

您现在在空间中拥有坐标,其中 0, 0 是左上角,0, 1 是右下角。超出该范围的任何内容都在屏幕外。

还值得注意的是,可以将透视除法后的 z' 值放入 Z 缓冲区。如果 Z 值小于 0(或者它大于我无法记住的头顶),则它被前平面剪裁,大于/小于 +/-1 超出远剪裁平面。

希望有帮助。

于 2013-05-09T17:27:29.530 回答