用变换矩阵旋转3D矢量

时间:2018-04-23 13:13:58

标签: java opengl matrix vector transformation

描述

我有三个向量 d (向前向量),向上向右,如您在此处enter image description here所示。

p 表示相机的位置,d应始终面向前方,右侧应朝向右侧,向上应朝上。我相机旋转后应该更新三个矢量,它们仍然面向正确的方向。我的坐标系是:+ x向右,+ y向上,+ z在屏幕外:

enter image description here

方法

// 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的评论):

matrix

0 个答案:

没有答案