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

旋转Gizmo转换回欧拉角时出现符号翻转的问题求助

旋转Gizmo转换回欧拉角时出现符号翻转的问题求助

我正在开发一款3D物体动画制作工具,最近碰到了一个棘手的问题,实在搞不定,想求助大家:

我已经实现了一个旋转Gizmo,本身的旋转功能是正常的,但因为这是动画工具,每次旋转操作结束后我需要得到对应的欧拉角。现在的问题是,我先把物体当前旋转转换成四元数来执行绕轴旋转操作,再转回欧拉角时,到特定角度就会出现符号翻转的情况——比如角度升到180度后突然跳变成-180度,反过来也是一样。

虽然渲染出来的旋转效果看起来没问题,但这种符号跳变在做动画插值的时候会引发严重问题,比如物体会莫名其妙地反向旋转。

我的核心代码大概是这样的:

local rotation = object:GetQuaternionRotation();
rotation:RotateAroundAxis(direction, mouseDiff);
local newRotation = rotation:ToEuler();

这里补充几个细节:

  • direction是旋转的轴方向向量(x,y,z):在世界空间下绕Z轴旋转时就是(0, 0, 1),在局部空间下则是物体当前的向上向量
  • mouseDiff是根据鼠标移动量计算出的正负角度增量
  • 另外RotateAroundAxis方法的具体实现如下:
function Quaternion:RotateAroundAxis(axis, angle)
    -- Calculate half angle
    local halfAngle = angle * 0.5

    -- Calculate sine and cosine of half angle
    local sinHalfAngle = math.sin(halfAngle)
    local cosHalfAngle = math.cos(halfAngle)

    -- Normalize the axis
    axis:Normalize()

    local rotationQuat = Quaternion:New(
        axis.x * sinHalfAngle,
        axis.y * sinHalfAngle,
        axis.z * sinHalfAngle,
        cosHalfAngle
    )

    self:Multiply(rotationQuat)
end

操作时能看到明显的角度跳变:比如旋转到接近180度时,数值会突然跳到-180度,导致动画插值异常。

我试过直接对欧拉角进行累加,但显然当旋转轴不是坐标轴对齐的情况下,这种方法根本行不通。

补充说明:
我清楚四元数只能表示球面旋转,不像欧拉角那样可以记录超过360度的累积旋转值。我真正想实现的是跨360度的连续累积旋转,就像Unity、3DS Max这类软件里的Gizmo那样,能记录用户旋转的总圈数和方向。我也查过ImGuizmo这类开源库,但它们好像并没有解决这个问题,只是返回变换矩阵——而矩阵同样只能存储0-360度的旋转信息。

备注:内容来源于stack exchange,提问作者Zee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 12:48:09