Zut*_*tty 6 java opengl matrix lwjgl glulookat
我正在使用LWJGL学习OpenGL 3.我试图实现一个等效的gluLookAt(),虽然它的工作原因我有点困惑为什么.
我承认只是从网络上的各种来源复制这些代码,但经过深入研究后,我认为理解它背后的数学,并且我理解LWJGL在做什么.
但是,"正确" gluLookAt代码在我的应用程序中表现不正确,因为相机似乎转向了错误的方式.我只设法获得通过转置正交向量的工作我的代码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;
}
Run Code Online (Sandbox Code Playgroud)
我不认为我应该进行转置,但没有它就无法工作.我放了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 ]
Run Code Online (Sandbox Code Playgroud)
我认为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;
...
}
Run Code Online (Sandbox Code Playgroud)
所以我对于我搞砸了哪一部分感到非常困惑.是我对lookAt矩阵的理解,列/行主要(是一个单词?!)Matrix4f还是别的什么?我的其余代码是否已损坏?它真的是正确的,我只是担心太多了吗?我只是个白痴?
谢谢.
Mic*_* IV 11
你不应该转置任何东西.你应该否定lookAt()矩阵的"眼睛"向量和看方向."EYE"对应于应该总是反转的摄像机位置.所有这一切都在lookAt()中完成
这是来自着名的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));
}
Run Code Online (Sandbox Code Playgroud)
我将它用于基于LWJGL的OpenGL 4渲染器,它就像一个魅力:)
| 归档时间: |
|
| 查看次数: |
4901 次 |
| 最近记录: |