有点关于3D透视投影&矩阵变换

时间:2014-06-06 18:35:13

标签: matrix 3d camera rendering perspectivecamera

前言

经过大约两个星期阅读我可以看到的任何文章,在线教程和电子书(与3D相机空间的概念相关)后,我再次发现自己试图关注this article为了创造一个合适的3D透视相机。 对于除了高中水平代数之外的任何事情我都不能完全流利地使用科学记数法,但是(在大多数情况下),我认为我理解位于页面大约一半的大视角矩阵公式。为了安全起见,我来到这里是为了一点清晰......而且为了记录,我意识到以下事实上不仅仅是一个问题,所以我不希望所有的答案都是他们......在我将另一个破碎的概念实现到我的渲染引擎之前,还有一点方向。

声明

之前任何人都有错误的想法......
这不是为了学校(我被问了很多) 我甚至不是一个学生,只是一个长期的软件工程爱好者/爱好者 因此,我将从中获得的唯一“成绩”以度数衡量,并转换为弧度......
(是的!数学笑话!我已经倾向于喜剧!)


问题(S)

好的,首先关闭......维基百科上的那个公式是左手坐标系,或者他们说。我需要做些什么来使它适用于右手坐标系(负Z从用户到屏幕的远离)?其次,假设公式中的每个3x3矩阵都分别对应于围绕X,Y和Z轴的旋转,我是否正确?如果是这样,那么每个θ符号(θx,θy和θz)代表相机的当前偏航,俯仰和滚动(我问因为它提到了使用欧拉角)?另外,我看过一些使用4x4矩阵而不是3x3矩阵的混合文章和在线教程(或者根本没有!)...使用4x4矩阵进行透视变换是否有任何好处?

最后,我目前的目标要求我手动执行所有矩阵计算(因为我没有使用任何外部库,如OpenGL或DirectX)。在执行变换时,我相信我应该在每个矩阵的行中相乘并求和,对吗?如果是这种情况,那么如何从它们各自的变换矩阵中“去掉”得到的X,Y和Z坐标(...或者我对这个公式应该如何工作完全错误的想法)?

感谢您的时间!

1 个答案:

答案 0 :(得分:2)

首先,一点解释
在标准的3D API中,有三种转换称为:WorldMatrix,ViewMatrix和投影矩阵。首先与相机无关,它是关于改变世界(物体的局部世界)以使其正确旋转和平移。现在关于第二个。视图矩阵与世界非常相似,但它们不是世界的旋转和变换,而是负责摄像机的旋转和变换,因此它们的创建几乎与变换矩阵(旋转,变换和尺度)相乘。

最后和最相关的相机概念是投影矩阵:

为什么选择4x4?:
这个矩阵通常以4x4表示的原因是这三个矩阵形成了一个将3d坐标转换为像素的管道,因此,由于平移矩阵必须以4x4方式定义,因此在管道中定义每个其他矩阵更为实际,包括投影矩阵,同样。

右手或左手的事:
这就是左手所需要的:

2*zn/w  0       0              0
0       2*zn/h  0              0
0       0       zf/(zf-zn)     1
0       0       zn*zf/(zn-zf)  0

并与右手进行比较:

2*zn/w  0       0              0
0       2*zn/h  0              0
0       0       zf/(zn-zf)    -1
0       0       zn*zf/(zn-zf)  0

正如您所看到的,区别在于与Z轴相关的第3行。

对此Article 的说明 我上面写的是DirectX用来创建透视投影矩阵的内容。但是你提供的链接是维基百科页面,它具有相同矩阵的另一种形式,但为什么我的矩阵没有任何三角函数?有两个原因:

  1. 相机的转换(包括旋转)在之前完成 管道的一部分(View Matrix)
  2. 我使用的另一组输入与那些输入不同 维基百科文章使用。我的如下:
  3. w:近视平面处视图体积的宽度 h:近视平面处视图体积的高度 zn:近视平面的Z值 zf:远视图平面的Z值。