C++ 将顶点坐标变换为“;“相同”;屏幕坐标
我正在使用Direct3D从顶点缓冲区绘制顶点,顶点格式为C++ 将顶点坐标变换为“;“相同”;屏幕坐标,c++,directx,rendering,transformation,direct3d,C++,Directx,Rendering,Transformation,Direct3d,我正在使用Direct3D从顶点缓冲区绘制顶点,顶点格式为FVF_XYZ 我现在想实现画线的功能。在三维空间中绘制直线时,我将端点投影到二维屏幕空间,并使用我的功能从二维空间绘制直线。我的问题是这个函数 我的顶点缓冲区包含两个坐标为(0,0,0)和(1,0,0)的顶点。我计划用基本的数学和变换把这条基本线变换成我的最后一条线 问题是,例如,当我想渲染顶点到屏幕坐标(0,0)时,我不知道如何设置变换矩阵 根据我的理解,在将world、view和projection matrix设置为identit
FVF_XYZ
我现在想实现画线的功能。在三维空间中绘制直线时,我将端点投影到二维屏幕空间,并使用我的功能从二维空间绘制直线。我的问题是这个函数
我的顶点缓冲区包含两个坐标为(0,0,0)
和(1,0,0)
的顶点。我计划用基本的数学和变换把这条基本线变换成我的最后一条线
问题是,例如,当我想渲染顶点到屏幕坐标(0,0)
时,我不知道如何设置变换矩阵
根据我的理解,在将world、view和projection matrix设置为identity时,我应该结束并使用屏幕坐标(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
x'' = (x' + 1) / 2;
y'' = (-y' + 1) / 2;
(其中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空间,建议您执行以下操作:
T' = W * V * P
x'' = (x' + 1) / 2;
y'' = (-y' + 1) / 2;
现在,您的坐标位于空间中,其中0,0是左上角,0,1是右下角。任何超出该范围的内容都是屏幕外的
同样值得注意的是,透视图分割后的z'值可以放入z缓冲区。如果Z值小于0(或者大于我头顶上记不起来的值),则被前平面剪裁,大于/小于+/-1超出远剪裁平面
希望能有所帮助。首先值得注意的是,在投影空间中(-1,1,z,w)变换为(0,0)和(1,-1,z,w)变换为(1,1) 因此,在您希望将给定顶点变换为其投影空间的基础上,只需执行以下操作:
T' = W * V * P
x'' = (x' + 1) / 2;
y'' = (-y' + 1) / 2;
(其中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空间,建议您执行以下操作:
T' = W * V * P
x'' = (x' + 1) / 2;
y'' = (-y' + 1) / 2;
现在,您的坐标位于空间中,其中0,0是左上角,0,1是右下角。任何超出该范围的内容都是屏幕外的
同样值得注意的是,透视图分割后的z'值可以放入z缓冲区。如果Z值小于0(或者大于我头顶上记不起来的值),则被前平面剪裁,大于/小于+/-1超出远剪裁平面
希望能有所帮助。谢谢。我的错误是,我假设你所说的投影空间已经是以像素为单位的屏幕空间了。我的目标是从0,0到screenMaxX,screenMaxY的空间,但这只是一个简单的缩放问题。@typ1232:很高兴我能帮忙:)谢谢。我的错误是,我假设你所说的投影空间已经是以像素为单位的屏幕空间了。我的目标是从0,0到screenMaxX,screenMaxY的空间,但这只是一个简单的缩放问题。@typ1232:很高兴我能帮忙:)