Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将顶点坐标变换为“;“相同”;屏幕坐标_C++_Directx_Rendering_Transformation_Direct3d - Fatal编程技术网

C++ 将顶点坐标变换为“;“相同”;屏幕坐标

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

我正在使用Direct3D从顶点缓冲区绘制顶点,顶点格式为
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:很高兴我能帮忙:)