gpt4 book ai didi

java - 向上或向下看时 LookAt 矩阵会变形

转载 作者:行者123 更新时间:2023-12-01 22:18:46 25 4
gpt4 key购买 nike

我正在使用一个在我为 LWJGL 找到的名为 JOML 的开源数学库中计算的 LookAt 矩阵。在我的游戏中获得免费摄像头。它在左右旋转时效果很好,但向上和向下看似乎会导致严重的扭曲问题,类似于大幅增加视场。

向前看: Regular

但是当查找时: Looking up

向下看时: Looking down

我还没有找到有类似错误的人,也没有人使用 JOML 报告过这一问题。我不是最擅长矩阵数学,所以我所有计算自己的 LookAt 矩阵的尝试都失败了。如果有人可以使用 JOML 制作一个 LookAt 矩阵,或者说出我的任何一个(最有可能)可能的错误,我将不胜感激,谢谢。

最佳答案

好吧,该库提供的lookAt代码就是这样(我将实际的源代码保留下来,只保留注释,因为它们很好地解释了所完成的步骤):

public final static void lookAt(Vector3f position, Vector3f centre, Vector3f up, Matrix4f dest) {
// Compute direction from position to lookAt
// Normalize direction
// Normalize up
// right = direction x up
// up = right x direction
// Set matrix elements
}

这段代码是错误的。有趣的是,我以前见过这个错误。这实际上与 "official" gluLookAt() manpage 是相同的错误。仍然包含(实际的 glu 实现没有错误,只是文档错误)。

这段代码的作用是构建正交基。问题是上 vector 在计算的叉积之前被归一化。假设似乎是,当构建两个单位长度 vector 的叉积时,结果也将是一个单位长度 vector 。但这是一个常见的误解。真正正确的是:

length( cross( a, b) ) == lenght(a) * length(b) * sin(alpha)

其中 alpha 是 ab 之间的角度。因此,只有当 vector 已经正交时,单位长度假设才成立。由于 vector 在叉积后永远不会重新归一化,因此所得的基不是正交的,而是会引入一些非均匀缩放。 lookAt 假设可以通过转置矩阵计算逆旋转,在这种情况下将完全失败。

当观看方向和向上 vector 之间的角度远离 90 度时,您看到的扭曲会变得更加严重。

处理这个问题的正确方法就是在不同的点进行标准化。不要在叉积之前对上 vector 进行归一化,而是对其结果进行归一化。然后,您有两个彼此正交的单位长度 vector ,第二个叉积也将按预期工作。所以实际的lookAt函数应该是:

        // Compute direction from position to lookAt
// Normalize direction
// right = direction x up
// Normalize right
// up = right x direction
// Set matrix elements

关于java - 向上或向下看时 LookAt 矩阵会变形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30409318/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com