旋转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
相关产品推荐
相关产品推荐

