You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用JOML的Quaternionf实现四元数按指定角度旋转的正确方法是什么

你的代码存在两个核心错误,修正后就可以实现预期的增量旋转效果:

错误原因

  1. 共轭运算使用场景错误
    rot.mul(rotation).mul(conjugate)是将三维向量(封装为虚部等于向量、实部为0的纯四元数)应用旋转的标准公式,不适用于两个旋转四元数的叠加计算,这是导致物体旋转异常、飞出视野的核心原因。
  2. 多余的计算逻辑
    无固定起止状态的增量旋转不需要插值,也不需要额外的共轭计算,直接叠加增量旋转四元数即可。

正确实现代码

public void rotate(float angle, float x, float y, float z) {
    float angleRad = (float) Math.toRadians(angle);
    // 构造本次增量旋转四元数
    Quaternionf deltaRot = new Quaternionf().rotateAxis(angleRad, x, y, z);
    
    // 绕物体局部轴旋转用这个写法(JOML采用列向量约定,新旋转左乘原有旋转)
    rotation = deltaRot.mul(rotation);
    // 若需要绕世界坐标系轴旋转,替换为下面的写法
    // rotation = rotation.mul(deltaRot);
    
    // 归一化避免浮点精度误差累积导致四元数失效
    rotation.normalize();
}

调用说明

你给出的调用代码entity.transform.rotate(1, 0, 1, 0)是绕Y轴每帧旋转1度,用上述修正后的代码即可实现连续360度旋转,不会出现卡住的问题。如果旋转方向和预期不符,可调整角度符号,或者切换乘法顺序适配你需要的旋转坐标系。

内容的提问来源于stack exchange,提问作者Althaen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 19:15:06