gpt4 book ai didi

java - OpenGL 3 (LWJGL) LookAt 矩阵混淆

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:55:59 25 4
gpt4 key购买 nike

我正在使用 LWJGL 学习 OpenGL 3。我试图实现相当于 gluLookAt() 的功能,虽然它有效,但我对为什么有些困惑。

我承认只是从网络上的各种来源复制这段代码,但经过大量研究后,我认为理解它背后的数学原理,并且我理解 LWJGL 在做什么。

但是“正确”gluLookAt代码在我的应用程序中表现不正确,因为相机似乎转向了错误的方向。我只设法通过转置正交 vector 来让我的代码工作 forward , side , 和 up (希望我使用的是正确的术语!),我很确定这是错误的...

private static final Vector3f forward = new Vector3f();
private static final Vector3f side = new Vector3f();
private static final Vector3f up = new Vector3f();
private static final Vector3f eye = new Vector3f();

public static Matrix4f lookAt(float eyeX, float eyeY, float eyeZ,
float centerX, float centerY, float centerZ,
float upX, float upY, float upZ) {
forward.set(centerX - eyeX, centerY - eyeY, centerZ - eyeZ);
forward.normalise();

up.set(upX, upY, upZ);

Vector3f.cross(forward, up, side);
side.normalise();

Vector3f.cross(side, forward, up);
up.normalise();

Matrix4f matrix = new Matrix4f();
matrix.m00 = side.x;
matrix.m01 = side.y;
matrix.m02 = side.z;

matrix.m10 = up.x;
matrix.m11 = up.y;
matrix.m12 = up.z;

matrix.m20 = -forward.x;
matrix.m21 = -forward.y;
matrix.m22 = -forward.z;

matrix.transpose(); // <------ My dumb hack

eye.set(-eyeX, -eyeY, -eyeZ);
matrix.translate(eye);

return matrix;
}

我认为我不应该进行转置,但没有它就无法工作。我把transpose()因为顺便说一句,我懒得重新输入所有矩阵单元格的位置!

我的理解是lookAt矩阵的形式应该是这样的

[ side.x  up.x  fwd.x  0 ] [ 1  0  0  -eye.x ]
[ side.y up.y fwd.y 0 ] [ 0 1 0 -eye.y ]
[ side.z up.z fwd.z 0 ] [ 0 0 1 -eye.z ]
[ 0 0 0 1 ] [ 0 0 0 1 ]

而且我认为 LWJGL Matrix4f类将矩阵单元表示为 m<col><row> . translate(Vector3f)方法执行以下操作

public static Matrix4f translate(Vector3f vec, Matrix4f src, Matrix4f dest) {
...
dest.m30 += src.m00 * vec.x + src.m10 * vec.y + src.m20 * vec.z;
dest.m31 += src.m01 * vec.x + src.m11 * vec.y + src.m21 * vec.z;
dest.m32 += src.m02 * vec.x + src.m12 * vec.y + src.m22 * vec.z;
dest.m33 += src.m03 * vec.x + src.m13 * vec.y + src.m23 * vec.z;
...
}

因此,我对我搞砸了其中的哪一部分感到非常困惑。这是我对 lookAt 矩阵的理解,Matrix4f 的列/行主要性(这是一个词吗?!) , 或者是其他东西?我的其余代码是否已损坏?它实际上是正确的吗,我只是担心太多了?我只是个白痴吗?

谢谢。

最佳答案

你不应该转置任何东西。你应该否定 lookAt() 矩阵的“眼睛” vector 和观察方向。“EYE”对应于相机位置,它应该总是倒置。所有这些都在 lookAt() 中完成

这是来自 famous GLM math lib 的 Java 端口的 lookAt() 方法.

 public static Mat4 lookAt(Vec3 eye, Vec3 center, Vec3 up) {

Vec3 f = normalize(Vec3.sub(center, eye));
Vec3 u = normalize(up);
Vec3 s = normalize(cross(f, u));
u = cross(s, f);

Mat4 result = new Mat4(1.0f);
result.set(0, 0, s.x);
result.set(1, 0, s.y);
result.set(2, 0, s.z);
result.set(0, 1, u.x);
result.set(1, 1, u.y);
result.set(2, 1, u.z);
result.set(0, 2, -f.x);
result.set(1, 2, -f.y);
result.set(2, 2, -f.z);

return translate(result, new Vec3(-eye.x,-eye.y,-eye.z));
}

我将它与基于 LWJGL 的 OpenGL 4 渲染器一起使用,它的效果非常好:)

关于java - OpenGL 3 (LWJGL) LookAt 矩阵混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14866325/

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