Math 计算注视矩阵

Math 计算注视矩阵,math,graphics,3d,projection,Math,Graphics,3d,Projection,我正在编写一个3d引擎,我遇到了DirectX文档中描述的LookAt算法: 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

我正在编写一个3d引擎,我遇到了DirectX文档中描述的LookAt算法:

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)  1
现在我知道它是如何在旋转端工作的,但我不太明白的是为什么它把矩阵的平移分量设为那些点积。稍微检查一下,它似乎在根据新基向量到眼睛/相机位置的投影来调整相机位置


问题是为什么它需要这样做?它完成了什么?

点积只是将一个点投影到一个轴上,以获得眼睛的x、y或z分量。您正在向后移动相机,因此从(10,0,0)和从(100000,0,0)查看(0,0)将产生不同的效果。

该平移组件通过在原点处使用您的“眼睛”以及以该原点(您的“眼睛”)和三个轴表示的所有其他内容来帮助您创建

这个概念并不是说矩阵在调整摄像机的位置。相反,它试图简化数学:当你想呈现一幅你能从“眼睛”位置看到的所有东西的图片时,最容易假装你的眼睛是宇宙的中心

因此,简单的回答是,这使数学变得更容易


回答评论中的问题:你不只是从所有东西中减去“眼睛”位置的原因与操作顺序有关。这样想:一旦你进入了新的参照系(即,由xaxis、yaxis和zaxis表示的头部位置),你现在想要用这个新的(旋转的)参照系来表示距离。这就是为什么使用新轴与眼睛位置的点积:这表示物体需要移动的相同距离,但它使用新的坐标系。

我通过创建一个3x3旋转矩阵来构建一个注视矩阵,就像您在这里所做的那样,然后将其扩展为一个4x4,带有零,右下角有一个1。然后,我使用负视点坐标(无点积)构建一个4x4平移矩阵,并将两个矩阵相乘。我的猜测是,这个乘法产生的结果相当于示例底部一行的点积,但我需要在纸上计算出来才能确定


三维旋转将变换轴。因此,如果不将视点转换为新的坐标系,则无法直接使用该视点。这就是矩阵乘法——或者在本例中是3点积值——的作用。

只是一些一般信息:

注视矩阵是一个矩阵,它定位/旋转某物,使其从空间中的另一点指向(注视)空间中的某一点

该方法获取相机视图的所需“中心”、表示相机方向“向上”的“向上”矢量(向上几乎总是(0,1,0),但不一定是),以及表示相机位置的“眼睛”矢量

这主要用于相机,但也可用于阴影、聚光灯等其他技术


坦白地说,我不完全确定为什么翻译组件会被设置成这种方法。在
gluLookAt
(来自OpenGL)中,平移组件设置为0,0,0,因为相机始终被视为处于0,0,0。

lookat矩阵执行以下两个步骤:

  • 将模型转换为原点
  • 根据上方向向量和外观设置的方向旋转它
    方向

  • 点积的意思很简单,就是先进行平移,然后旋转。点积不是将两个矩阵相乘,而是将一行与一列相乘。

    变换4x4矩阵包含两个三个分量: 1.旋转矩阵 2.要添加的翻译。 3.缩放(许多引擎不直接在矩阵中使用此功能)

    它们的组合将把一个点从空间a变换到空间B,所以这是一个变换矩阵M_ab

    现在,摄影机的位置在空间A中,因此它不是空间B的有效变换,因此需要将此位置与旋转变换相乘

    唯一悬而未决的问题是为什么会出现这些点? 如果你把这三个点写在一张纸上,你会发现这三个点加上X,Y和Z,就像乘以旋转矩阵一样

    第四行/第四列的示例是在世界空间中取零点-(0,0,0)。它不是摄影机空间中的零点,因此您需要知道摄影机空间中的表示是什么,因为旋转和缩放将其保留为零


    干杯

    注意,给出的示例是一个左手的行主矩阵

    因此操作是:首先平移到原点(通过眼睛移动),然后旋转,使从眼睛到At的向量与+z对齐:

    如果将旋转矩阵与平移眼相乘,基本上可以得到相同的结果:

    [1 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.z1][01] [xaxis.xyaxis.xzaxis.x0] =[xaxis.y yaxis.y zaxis.y 0] [xaxis.zyaxis.zzaxis.z0] [dot(xaxis,-眼)dot(yaxis,-眼)dot(zaxis,-眼)1] 补充说明: 请注意,查看变换是(有意地)反转的:将每个顶点乘以该矩阵以“移动世界”,以便希望查看的部分最终位于规范视图体积中

    还要注意,注视矩阵的旋转矩阵(称为R)分量是基矩阵的反向变化,其中R的行是关于旧基向量的新基向量(因此变量名为xaxis.x,…)。。 [ 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 ] [ dot(xaxis,-eye) dot(yaxis,-eye) dot(zaxis,-eye) 1 ]