描述
我有三个向量 d (向前向量),向上和向右,如您在此处所示。
p 表示相机的位置,d应始终面向前方,右侧应朝向右侧,向上应朝上。我相机旋转后应该更新三个矢量,它们仍然面向正确的方向。我的坐标系是:+ x向右,+ y向上,+ z在屏幕外:
方法:
// create the three vectors
// Vector4f because opengl only allows to transform with Matrix4f
d = new Vector4f(0, 0, -1, 0);
right = new Vector4f(1, 0, 0, 0);
// create a transformation matrix
Matrix4f matrix = new Matrix4f();
matrix.setIdentity();
Matrix4f.rotate((float) Math.toRadians(cam.getPitch()), new Vector3f(1, 0, 0), matrix, matrix);
Matrix4f.rotate((float) Math.toRadians(cam.getYaw()), new Vector3f(0, 1, 0), matrix, matrix);
Matrix4f.rotate((float) Math.toRadians(cam.getRoll()), new Vector3f(0, 0, 1), matrix, matrix);
// Transform the 3 vectors with the matrix
Matrix4f.transform(matrix, d, d);
Matrix4f.transform(matrix, right, right);
up = Vector3f.cross(right.xyz, d.xyz, null);
// normalize them
d.normalise(); up.normalise(); right.normalise();
问题
当摄像机指向x轴方向时,矢量为:
Cam Pos(-63, 15, 100) Cam Rot(0, 90, 15)
d(-1, 0, 0); up(0, 1, 0); right(0, 0, -1)
期望: d(1, 0, 0); up(0, 1, 0); right(0, 0, 1)
z轴方向:
Cam Pos(-15, -15, 51) Cam Rot(0, 0, 15)
d(0, 0, 1); up(0, 1, 0); right(-1, 0, 0)
期望: d(0, 0, 1); up(0, 1, 0); right(-1, 0, 0)
y轴方向(在天空中看)
Cam Pos(-11, -48, 104) Cam Rot(0, 90, -90)
d(-1, 0, 0); up(0, 0, -1); right(0, -1, 0)
期望: d(0, 1, 0); up(-1, 0, 0); right(0, 0, 1)
你可以看到没有坐标是正确的,我不确定,为什么不......
也许有人可以弄明白,旋转矢量时出了什么问题。
如果您需要更多信息,请随时提出,我将编辑帖子
编辑1:
我对坐标系感到困惑。现在是对的。
编辑2: 我取得了一些进展并编辑了源代码和示例。结果好多了,但仍然不对。对我来说,它看起来像一个小错误,也许有人会找到一个。轮换有条件吗? (例如,只有-180°到+ 180°或类似的东西?)
这就是我的矩阵的样子(来自Spektre的评论):