【发布时间】:2017-10-30 20:15:51
【问题描述】:
我的 3D 模型围绕错误的轴旋转。除了 X 轴之外的所有东西都可以工作。当我将 Y 和 Z 的角度设置为 0 时,X 工作正常,但如果旋转它,例如。绕 Z 轴 90 度并绕 X 旋转,然后它也绕 Z 旋转。所以当使用 Y 或 Z 时,X 围绕 Z 旋转。所以如果我让我的模型围绕 Z 旋转 90 度并围绕 X 旋转 -90 度,它会完全保持静止。
我的转换矩阵函数。如果我将matrix.translate(position); 移动到旋转下,我的模型会旋转一个大圆圈(可能围绕世界原点)。
public static Matrix4f createTransformationMatrix(Vector3f position, Vector3f rotation, Vector3f scale) {
Matrix4f matrix = new Matrix4f();
matrix.scale(scale);
matrix.translate(position);
matrix.rotate((float) Math.toRadians(rotation.x), new Vector3f(1, 0, 0));
matrix.rotate((float) Math.toRadians(rotation.y), new Vector3f(0, 1, 0));
matrix.rotate((float) Math.toRadians(rotation.z), new Vector3f(0, 0, 1));
return matrix;
}
将矩阵转换为浮点缓冲区,以便我可以将其传递给着色器:
public static FloatBuffer toFloatBuffer(Matrix4f matrix) {
FloatBuffer buffer = BufferUtils.createFloatBuffer(16);
buffer.put(matrix.m00());
buffer.put(matrix.m01());
buffer.put(matrix.m02());
buffer.put(matrix.m03());
buffer.put(matrix.m10());
buffer.put(matrix.m11());
buffer.put(matrix.m12());
buffer.put(matrix.m13());
buffer.put(matrix.m20());
buffer.put(matrix.m21());
buffer.put(matrix.m22());
buffer.put(matrix.m23());
buffer.put(matrix.m30());
buffer.put(matrix.m31());
buffer.put(matrix.m32());
buffer.put(matrix.m33());
buffer.flip();
return buffer;
}
在着色器中的使用:
gl_Position = transformationMatrix * vec4(position, 1.0) * viewMatrix * projectionMatrix;
模型的零点已设置为其原点,我确信发送到这些函数的所有数据都是正确的。我已经调试了一段时间了。我正在使用 LWJGL 3。
【问题讨论】:
-
如果组合旋转,则在第一次平移后在坐标系中应用第二次旋转。示例:如果围绕 X 旋转 90 度,则局部 Y 轴将沿全局 Z 轴指向,依此类推。
-
不相关,但着色器中的转换顺序看起来错误。除非视图和投影被转置,否则从右侧将它们相乘是没有意义的。
-
@Rabbid76 仍然无法解决我的问题 –
-
@Rabbid76 我真的不明白你的意思,但你不能看看上面的代码。输入向量旋转仅包含度数 (0-360)。我认为这是因为 Y 旋转输入为 90 而有人回答的 Gimbal Lock。我只是不知道如何修复它。
-
@Rabbid76 必须有其他人使用的解决方案
标签: opengl matrix rotation lwjgl