Godot中使用相同轴角参数旋转骨骼时旋转轴异常偏移问题求助
问题原因
核心问题是坐标空间不匹配,和模型/骨架制作规范无关,你的轴角参数计算逻辑、Mesh Instance测试用法都没有问题,问题出在骨骼姿态的默认计算空间和你所用旋转轴的所在空间不一致。
你用来计算旋转轴的向量是全局空间下的坐标,而get_bone_pose()/set_bone_pose()操作的是骨骼的局部姿态,这个空间的坐标系是相对于骨骼绑定位、基于父骨骼的局部空间定义的,和全局空间的轴向不统一,直接套用全局空间的旋转轴自然会出现旋转方向偏移。
解决方法
方案1:将全局旋转轴转换为骨骼局部空间后再使用
# 获取骨骼当前全局姿态的基变换 var bone_global_basis = skel.get_bone_global_pose(id).basis # 把全局旋转轴转到骨骼局部空间 var local_rotate_axis = bone_global_basis.inverse() * axis # 用转换后的局部轴执行旋转 var bone_pose = skel.get_bone_pose(id) bone_pose = bone_pose.rotated(local_rotate_axis, angle) skel.set_bone_pose(id, bone_pose)
方案2:直接操作骨骼全局姿态,无需做空间转换
var bone_global_pose = skel.get_bone_global_pose(id) bone_global_pose = bone_global_pose.rotated(axis, angle) skel.set_bone_global_pose(id, bone_global_pose)
额外校验点
确认你通过叉乘得到的旋转轴已经做了归一化处理,轴角旋转要求输入的旋转轴为单位向量,未归一化的轴也会导致旋转结果异常。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

