我正在使用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>
答案 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超出远剪裁平面。
希望有所帮助。