首页 > 解决方案 > 将四元数从当前旋转角度旋转一定角度的正确方法是什么?

问题描述

我正在尝试使用来自 JOML 的四元数来使用四元数旋转:https ://github.com/JOML-CI/JOML/blob/main/src/org/joml/Quaternionf.java 。

我可以让物体旋转,但它们被卡住并且无法完成完整的旋转。每一帧都会更新对象。

编辑:删除了所有与欧拉相关的代码,我只是试图让对象基于某个角度在单个轴上旋转。

编辑2:我正在尝试使用共轭并将四元数相乘,就像我在一些视频中看到的那样。我并不完全在那里,因为模型出于某种原因将自己从屏幕上旋转了下来。

编辑 3:标准化四元数修复了消失的行为。问题似乎是没有简单的方法来旋转一定的量,而没有一个计时器来处理这在我的情况下不起作用,因为我试图旋转一个没有设置开始和结束的任意量的对象。

旋转功能

public void rotate(float angle, float x, float y, float z) {
    Quaternionf rot = new Quaternionf();
    rot.rotateAxis((float) Math.toRadians(angle), x, y, z);

    Quaternionf conjugate = rot.conjugate();

    rotation = rot.mul(rotation).mul(conjugate);
}

调用旋转函数

entity.transform.rotate( 1,0,1, 0);

标签: javarotationlwjglquaternionsjoml

解决方案


将欧拉角转换为矩阵或四元数或任何表示都没有关系:只要您使用欧拉角表示方向,Gimbal Lock 是不可避免的。

因此,为了避免万向节锁定的发生,您必须放弃使用欧拉角并保持一个方向表示(如 3x3 矩阵或四元数)并对它们应用增量更改,而不是尝试将完整方向表示为三个欧拉角。因此,每当您 - 比方说 - 将对象围绕某个轴旋转几度时,您就会将该增量变化或方向应用于矩阵/四元数。


推荐阅读