Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.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
Math 透视投影视图平面距离计算混乱?_Math_Graphics_Rendering_Projection_Perspectivecamera - Fatal编程技术网

Math 透视投影视图平面距离计算混乱?

Math 透视投影视图平面距离计算混乱?,math,graphics,rendering,projection,perspectivecamera,Math,Graphics,Rendering,Projection,Perspectivecamera,我正在学习一本3D计算机图形学书籍,试图实现我自己的软件渲染器,用于教育目的。一切都很顺利,直到这本书开始谈论透视投影,它变得有点混乱 这本书(3D游戏编程大师的技巧)谈论的是计算d:从视点到视图平面的距离。如果我们看这本书中的扫描图像(我希望安德烈不介意,因为我试着联系他询问,但没有回复): 很明显,作者的意思是0.5*Width,而不是Width 然后他继续说: tan(θ) = opposite/adjacent = y/x, and in this case, y is the dis

我正在学习一本3D计算机图形学书籍,试图实现我自己的软件渲染器,用于教育目的。一切都很顺利,直到这本书开始谈论透视投影,它变得有点混乱

这本书(3D游戏编程大师的技巧)谈论的是计算
d
:从视点到视图平面的距离。如果我们看这本书中的扫描图像(我希望安德烈不介意,因为我试着联系他询问,但没有回复):

很明显,作者的意思是0.5*Width,而不是Width

然后他继续说:

tan(θ) = opposite/adjacent = y/x, and in this case, y is the distance and x is related to the width.
看这个图,我看不出这是怎么正确的,因为角度
θ/2
的对立面是
W/2
,相邻的是
d
。因此:

tan(θ/2) = (W/2) / d =>
d * tan(θ/2) = (W/2) =>
d = (W/2) / tan(θ/2)
我错了吗?我遗漏了什么吗?作者还有别的意思吗

任何想法/想法/解释都将不胜感激


编辑:尽管在本书的代码中,当使用乘法时,它确实“起作用”,但它并不正确。因为使用的FOV值越高,对象应该越小,所以分割是正确的。但是如果使用乘法,视野越高,物体越大。我想作者没有注意到这一点,因为他大多数时候都使用90度视场角,并且
tan(90/2)=1
,所以我们乘还是除都没有关系。

Q
只是图中的θ-视野角。(编辑/将Q改为θ符号)@willywonka_dailyblah你能详细说明一下“d抵消”吗?我只是不确定你指的是哪一个“最终方程式”。但如果你认为你的解释会有帮助,请回答。发布它,这样我就可以接受它作为一个答案,因为我现在几乎有我的答案。哎呀,为我的错误评论道歉
d
实际上本身并没有抵消,但实际上被视为相机空间中点的Z坐标(因此,数字被存储在“Z缓冲区”中)。是的,d基本上是视图平面的Z坐标。Q只是图中的θ-视野角度。(编辑/更改Q为θ符号)@willywonka_dailyblah你能详细解释一下“d抵消”吗?我只是不确定你指的是哪一个“最终方程式”。但是如果你认为你的解释会有帮助,请说。把它贴出来,这样我就可以接受它作为答案,因为我现在几乎有了我的答案。哎呀,我为我的错误评论道歉。
d
实际上并不是cancel本身,但实际上被视为相机空间中点的Z坐标(因此数字存储在“Z缓冲区”中)。是的,d基本上是视图平面的Z坐标。