我正在使用 Direct3D 从顶点格式 FVF_XYZ
的顶点缓冲区中绘制顶点。
我现在想实现画线的功能。在 3D 空间中绘制一条线时,我将端点投影到 2D 屏幕空间并使用我的函数从 2D 空间绘制一条线。我的问题出在这个函数上。
我的顶点缓冲区包含两个坐标为 (0,0,0)
和 (1,0,0)
的顶点。我计划使用基本数学和转换将这条基本线转换为我的最终线。
问题是当我想渲染一个顶点到屏幕坐标 (0,0)
例如我不知道如何设置变换矩阵。
根据我的理解,在将世界、 View 和投影矩阵设置为标识时,我应该结束屏幕坐标 (0,0)
,但是 (0,0,0)
然后在屏幕中央结束。
我需要如何设置世界、 View 和投影矩阵,以便从 (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 是 View 矩阵,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 超出远裁剪平面。
希望对您有所帮助。
关于c++ - 将顶点坐标转换为 "same"屏幕坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16467000/