Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 观察矩阵在向上或向下观察时会扭曲_Java_Opengl_Matrix_Lwjgl - Fatal编程技术网

Java 观察矩阵在向上或向下观察时会扭曲

Java 观察矩阵在向上或向下观察时会扭曲,java,opengl,matrix,lwjgl,Java,Opengl,Matrix,Lwjgl,我正在使用一个lookAt矩阵,该矩阵是在一个开源数学库中计算出来的,我在游戏中为LWJGL找到了一个名为“免费cam”的数学库。它在左右旋转时效果很好,但上下观察似乎会导致严重的扭曲问题,类似于大幅增加FOV 展望未来: 但是当你抬头看的时候: 俯视时: 我还没有找到有类似错误的人,而且没有人使用JOML报告过这一情况。我并不擅长矩阵数学,所以我所有计算自己的lookAt矩阵的尝试都失败了。 如果有人能用JOML创建一个lookAt矩阵,或者说出我(最有可能)的任何一个错误,那将不胜感激

我正在使用一个lookAt矩阵,该矩阵是在一个开源数学库中计算出来的,我在游戏中为LWJGL找到了一个名为“免费cam”的数学库。它在左右旋转时效果很好,但上下观察似乎会导致严重的扭曲问题,类似于大幅增加FOV

展望未来:

但是当你抬头看的时候:

俯视时:

我还没有找到有类似错误的人,而且没有人使用JOML报告过这一情况。我并不擅长矩阵数学,所以我所有计算自己的lookAt矩阵的尝试都失败了。
如果有人能用JOML创建一个lookAt矩阵,或者说出我(最有可能)的任何一个错误,那将不胜感激,谢谢。

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

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

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

length( cross( a, b) ) == lenght(a) * length(b) * sin(alpha)
其中alpha是
a
b
之间的角度。因此,单位长度假设仅在向量已经正交时成立。由于向量在叉积之后永远不会重新标准化,因此生成的基不是正交的,而是会引入一些非均匀缩放。
lookAt
假设可以通过转置矩阵计算反向旋转,在这种情况下,转置矩阵将完全失败

当观察方向和上方向向量之间的角度偏离90度时,您看到的失真将变得更严重

正确的处理方法是在不同的点进行规范化。不要在叉积之前规格化上向量,而是规格化它的结果。然后,你有两个相互正交的单位长度向量,第二个叉积也将按预期工作。因此,实际的lookAt函数应该是:

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

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

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

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

length( cross( a, b) ) == lenght(a) * length(b) * sin(alpha)
其中alpha是
a
b
之间的角度。因此,单位长度假设仅在向量已经正交时成立。由于向量在叉积之后永远不会重新标准化,因此生成的基不是正交的,而是会引入一些非均匀缩放。
lookAt
假设可以通过转置矩阵计算反向旋转,在这种情况下,转置矩阵将完全失败

当观察方向和上方向向量之间的角度偏离90度时,您看到的失真将变得更严重

正确的处理方法是在不同的点进行规范化。不要在叉积之前规格化上向量,而是规格化它的结果。然后,你有两个相互正交的单位长度向量,第二个叉积也将按预期工作。因此,实际的lookAt函数应该是:

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

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

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

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

length( cross( a, b) ) == lenght(a) * length(b) * sin(alpha)
其中alpha是
a
b
之间的角度。因此,单位长度假设仅在向量已经正交时成立。由于向量在叉积之后永远不会重新标准化,因此生成的基不是正交的,而是会引入一些非均匀缩放。
lookAt
假设可以通过转置矩阵计算反向旋转,在这种情况下,转置矩阵将完全失败

当观察方向和上方向向量之间的角度偏离90度时,您看到的失真将变得更严重

正确的处理方法是在不同的点进行规范化。不要在叉积之前规格化上向量,而是规格化它的结果。然后,你有两个相互正交的单位长度向量,第二个叉积也将按预期工作。因此,实际的lookAt函数应该是: