Matrix 一点关于三维透视投影&;矩阵变换 前言

Matrix 一点关于三维透视投影&;矩阵变换 前言,matrix,3d,camera,rendering,perspectivecamera,Matrix,3d,Camera,Rendering,Perspectivecamera,在阅读了大约两周的任何文章、在线教程和电子书(与3D相机空间的概念相关)后,我再次发现自己正试图跟随这些内容来创建一个合适的3D透视相机。 我对高中代数以外的任何学科都不太精通科学记数法,但是(在大多数情况下),我认为我理解位于页面中间的大型透视矩阵公式。不过为了安全起见,我来这里是为了澄清一下。。。为了记录在案,我意识到下面的问题事实上不仅仅是一个问题,所以我并不期望所有问题都有答案。。。在我开始在渲染引擎中实现另一个破碎的概念之前,只需多做一点指导 免责声明 在任何人误解之前… 不 这不是为

在阅读了大约两周的任何文章、在线教程和电子书(与3D相机空间的概念相关)后,我再次发现自己正试图跟随这些内容来创建一个合适的3D透视相机。 我对高中代数以外的任何学科都不太精通科学记数法,但是(在大多数情况下),我认为我理解位于页面中间的大型透视矩阵公式。不过为了安全起见,我来这里是为了澄清一下。。。为了记录在案,我意识到下面的问题事实上不仅仅是一个问题,所以我并不期望所有问题都有答案。。。在我开始在渲染引擎中实现另一个破碎的概念之前,只需多做一点指导

免责声明 在任何人误解之前…

这不是为学校准备的(我经常被问到这个问题)。
我甚至不是学生,只是一个长期的软件工程爱好者。
因此,我从中得到的唯一“分数”是以度为单位的,并转换成弧度…
(耶!数学笑话!我已经倾向于喜剧!)


问题: 好吧,首先。。。维基百科上的公式是左手坐标系,或者他们是这么说的。我需要做些什么才能使它在右手坐标系下工作(负Z从用户处移动到屏幕上)?第二,我假设公式中的每个3x3矩阵分别对应于绕X、Y和Z轴的旋转,对吗?如果是这样,那么每个θ符号(θx、θy和θz)是否代表相机当前的偏航、俯仰和滚动(我问这个问题是因为它提到了使用欧拉角)?此外,我还看到一些混合文章和在线教程使用4x4矩阵而不是3x3矩阵(或者根本没有!)。。。使用4x4矩阵进行透视变换是否有好处

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


谢谢你抽出时间

首先,一点解释
在标准3d API中,有三种转换称为:WorldMatrix、ViewMatrix和projection matrix。首先,它与摄影机无关,它是关于变换世界(对象的局部世界)以使其处于正确的旋转和平移状态。现在谈谈第二个。视图矩阵与世界非常相似,但它们不负责世界的旋转和变换,而是负责摄影机的旋转和变换,因此它们的创建基本上是将变换矩阵(旋转、变换和缩放)相乘

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

为什么选择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轴相关的第三行

对此的解释
我上面写的是DirectX用来创建透视投影矩阵的内容。但是你提供的链接是一个维基百科页面,上面有同一个矩阵的另一种形式,但是为什么我的矩阵没有任何关于三角学的内容呢?原因有二:

  • 摄像机的变换(包括旋转)在上一节中完成 管道的一部分(视图矩阵)
  • 我使用另一组不同于 维基百科文章使用了。我的发言如下:
  • w:近视图平面上视图体积的宽度。
    h:近视图平面上的视图体积高度。
    zn:近视图平面的Z值。
    zf:远视图平面的Z值。

    投票赞成关闭?有人不喜欢数学笑话。。。