【问题标题】:What's the difference between these two ways of computing a LookAt matrix?这两种计算 LookAt 矩阵的方法有什么区别?
【发布时间】:2015-09-11 11:18:56
【问题描述】:

我一直试图了解如何在给定相机位置、观察点和向上向量的情况下构造视图矩阵。

我找到了两个教程,herehere,可以解释这一点。但是,它们在视图矩阵的构建方式上有所不同。以前,他们创建平移和旋转,然后将它们相乘以获得视图矩阵。但是,在后者中,他们只是将翻译放在最后一行(列,取决于约定行/列主要)。

所以我的问题是,为什么有这两种方式? lookAt 矩阵不是唯一的吗?在我的理解和阅读和思考之后,在我看来,第一个博客有正确的方法。我错过了什么吗?

【问题讨论】:

    标签: graphics 3d coordinate-transformation


    【解决方案1】:

    (假设行优先顺序,因为这是我通常使用的)

    这样想:起初,你有一个未转换的世界,在某个位置有一个摄像机并进行了一些旋转。你知道,为了从那个世界到相机位于原点并指向 +z 或 -z 或你有什么东西的变换世界,你需要做一些翻译(因为相机是'不在中心)和某种旋转(因为相机可能指向任何方向)。

    由于当您旋转的点(相机)位于原点时最容易执行旋转,因此您首先需要平移相机以使其位于原点。这是矩阵的样子:

    1 0 0 -camera_x
    0 1 0 -camera_y
    0 0 1 -camera_z
    0 0 0     1
    

    执行此旋转后,相机位于中心。现在你可以旋转它,让它指向你想要的方向。旋转可以通过多种方式完成,因此我将仅提供一个占位符,而不是编写一个实际的矩阵:

    a b c 0
    d e f 0
    g h i 0
    0 0 0 1
    

    现在,我们如何结合这些矩阵来得到我们的视图矩阵?规则是你将矩阵全部相乘,从右到左的顺序。所以计算如下:

    view = rotation * translation
    

    因为你先翻译,然后再旋转。

    回答你的问题:如果你先旋转,然后平移,像这样:

    view = translation * rotation
    

    那么view 将等于:

    a b c -camera_x
    d e f -camera_y
    g h i -camera_z
    0 0 0     1
    

    这是因为,当您使用纯平移矩阵变换矩阵时,您会得到原始矩阵,其中 xyz 偏移量添加到最后一列中的前三个值。这可能是第二个教程试图做的事情。

    然而,矩阵乘法是可交换的。当以更简单的方式组装视图矩阵时(首先平移,然后旋转),您不能只从旋转矩阵中减去相机位置,因为您正在旋转平移而不是平移旋转,这只是一件更复杂的事情手工完成。在这种情况下,您需要将两个矩阵相乘。

    【讨论】:

    • 好的。我明白你的意思,尽管我有一些观察。行主要顺序不应该在最后一行进行翻译吗?我还读到in here,在行优先中,乘法是从左到右完成的。
    • 最后,我理解了这两个结果之间的区别,即view = translation * rotationview=rotation*translation。然而,根据我的理解,哪种方法会给我在现实生活中的表示,首先翻译然后旋转会给出在现实中可以看到的结果。我是不是误会了什么?
    • 关于乘法顺序:虽然矩阵乘法不是可交换的(您不能切换矩阵的顺序),但它关联的(如果您有矩阵 A 、B 和 C,A * B * C = (A * B) * C = A * (B * C))。至于您的另一个问题:视图矩阵的目标是,当您使用它来变换世界时,结果将 始终 使相机位于同一点(原点)且方向相同.任何达到这种效果的矩阵都可以,但正如我所说,在这种情况下最简单的方法是先平移,然后旋转。
    • 我同意@BRabbit27。假设行主要顺序,平移矩阵以及视图矩阵的乘法顺序是错误的。另请参阅:link
    猜你喜欢
    • 2013-09-08
    • 2019-03-31
    • 2010-09-25
    • 1970-01-01
    • 2020-02-14
    • 2011-01-10
    • 2016-07-01
    相关资源
    最近更新 更多