计算LookAtmatrix
我正在编写一个3d引擎,我遇到了DirectX文档中描述的LookAtalgorithm:
zaxis = normal(At - Eye) xaxis = normal(cross(Up, zaxis)) yaxis = cross(zaxis, xaxis) xaxis.x yaxis.x zaxis.x 0 xaxis.y yaxis.y zaxis.y 0 xaxis.z yaxis.z zaxis.z 0 -dot(xaxis, eye) -dot(yaxis, eye) -dot(zaxis, eye) l
现在我知道它是如何工作在旋转的一面,但我不明白为什么它把matrix的翻译部分是那些点积。 仔细检查一下,似乎是根据新的基本vector投影到眼睛/相机的位置上来调整相机的位置。
问题是为什么需要这样做? 它完成了什么?
我通过创build一个3×3旋转matrix来创build一个查看matrix,就像您在这里完成的一样,然后将其扩展为4×4的零和右下angular的单个1。 然后,我使用负视点坐标(无点积)build立一个4×4平移matrix,并将这两个matrix相乘。 我的猜测是,这种乘法产生在你的例子的最后一行点产品的等价物,但我需要在纸上工作,以确保。
3D旋转转换您的轴。 因此,不能直接使用眼点,也不能将其转换为新的坐标系。 这就是matrix乘法 – 或在这种情况下,3点乘积值 – 完成。
注意给出的例子是一个左手行主matrix 。
所以操作是:首先转换到原点(移动 – 眼睛 ),然后旋转,使眼睛的vector与At +
基本上,如果预先将旋转matrix乘以翻译眼睛,您会得到相同的结果:
[1 0 0 0] [xaxis.x yaxis.x zaxis.x 0] [0 1 0 0] * [xaxis.y yaxis.y zaxis.y 0] [0 0 1 0] [xaxis.z yaxis.z zaxis.z 0] [-eye.x -eye.y -eye.z 1] [0 0 0 1] [xaxis.x yaxis.x zaxis.x 0] = [xaxis.y yaxis.y zaxis.y 0] [xaxis.z yaxis.z zaxis.z 0] [点(x轴,眼睛)点(y轴,眼睛)点(z轴, - 眼)1]
补充笔记:
请注意,观看转换是(有意) 颠倒的 :您将每个顶点乘以此matrix以“移动世界”,以便您想要查看的部分在规范视图体中结束。
还要注意,LookAtmatrix的旋转matrix(称为R )是基matrix的反转变化,其中R的行是以旧基向量(因此variables名称为xaxis.x,…)为基础的新基向量。 xaxis是基础改变后的新的 x轴)。 然而,由于倒置,行和列被换位。
只是一些一般的信息:
lookatmatrix是一个matrix,用于定位/旋转某物以指向(看)空间中的另一个点。
该方法采用摄像机视图的期望“中心”,即“向上”向量,其表示摄像机的向上方向(向上几乎总是(0,1,0),但不一定是)以及作为照相机位置的“眼睛”vector。
这主要用于相机,但也可以用于其他技术,如阴影,聚光灯等。
坦率地说,我不完全确定为什么翻译组件被设置为这个方法。 在gluLookAt
(来自OpenGL)中,翻译组件被设置为0,0,0,因为相机总是被视为0,0,0。
点积只需将一个点投影到一个轴上即可获得眼睛的x,y或z分量。 您正在向后移动摄像机,以便从(10,0,0)和(100000,0,0)看(0,0,0)将会产生不同的效果。
这个翻译部分通过创build一个与原点相关的“眼睛”的正交基础 ,以及根据这个原点(你的“眼睛”)和三个轴表示的所有其他东西来帮助你。
这个概念并不是说matrix正在调整相机的位置。 相反,它试图简化math:当你想渲染一张从你的“眼睛”位置可以看到的所有图片时,假装你的眼睛是宇宙的中心是最容易的。
所以,简单的答案是,这使得math更容易。
在评论中回答这个问题:你不只是从一切中减去“眼睛”的位置,而是与操作的顺序有关。 你可以这样想:一旦你在新的参照系(即由xaxis,yaxis和zaxis表示的头位置),你现在想用这个新的(旋转的)参照系表示距离。 这就是为什么您使用新坐标轴的点积与眼图位置的关系:它表示需要移动的距离,但是它使用新的坐标系。
lookatmatrix执行这两个步骤:
- 将模型翻译成原点,
- 根据向上和向前设置的方向旋转
方向。
点产品意味着您首先进行翻译,然后旋转。 点积不是将两个matrix相乘,而是将行乘以一列。
一个变换4x4matrix包含二三个分量:1.旋转matrix2.平移加。 3.规模(许多引擎不直接在matrix中使用)。
它们的组合将把一个点从空间A转换到空间B,因此这是一个变换matrixM_ab
现在,相机的位置在空间A,所以它不是空间B的有效变换,所以你需要将这个位置乘以旋转变换。
唯一未解决的问题是为什么点? 那么,如果你在一张纸上写出3个点,你会发现X,Y和Z三点与旋转matrix完全相同。
第四行/列的例子是在世界空间中取零点(0,0,0)。 这不是相机空间中的零点,所以您需要知道相机空间中的表示是什么,因为旋转和缩放将其保留为零!
干杯
有必要把眼点放在你的轴心空间,而不是在世界空间。 当你用一个坐标单位基vector,一个x,y,z给一个vector,它给你在那个空间的眼睛的坐标。 你通过在最后一个地方应用三个翻译来转换位置,在这个例子中是最后一行。 然后向后移动一个负面的眼睛,就等于把所有剩下的空间向前移动。 就像在电梯里向上移动,让你感觉到世界其他地方正在从你的下面掉下来。
使用左手matrix,翻译作为最后一行,而不是最后一列,这是一个宗教差异,与答案完全无关。 但是,这是一个应该严格避免的教条。 在绘制树图时,最好按照自然的阅读顺序从左到右将全局到局部(正向运动学)变换链接起来。 使用左手matrix迫使您从右向左书写。