动画重定向
全库目录221
本文目录6
同名骨骼不一定使用同一坐标。源角色的手臂沿局部 X 轴,目标角色沿局部 Y 轴,直接复制旋转就会把抬手变成扭手。重定向先把动作从参考姿态中分离,再用对应基底表达这份变化。比例和接触点随后处理,因为旋转正确并不保证脚落在地面上。
参考姿态与旋转映射
先为两套骨架建立语义对应,例如左上臂对应左上臂,而不是按导出序号相等匹配。缺失扭转骨时可以把转角分配给现有链,缺失整条手臂则需要明确的动画回退。名字只提供候选,父子关系和参考轴用于确认。
以下采用列向量和右乘局部增量。源关节的参考局部旋转为 ,当前局部旋转为 ,二者都把关节局部坐标变到源父坐标。先求:
表示相对参考姿态的局部变化。设正交矩阵 把源关节的参考局部坐标变成目标关节的参考局部坐标,目标参考旋转为 ,则:
右侧先把目标向量变回源基底,执行源动作,再变回目标基底,因此同一解剖方向上的旋转得以保留。 来自两端对齐后的参考轴;它不能仅由骨骼名称推导。若骨架已在共同模型坐标中对齐,源、目标参考关节朝向分别是 、,可取 。导入坐标系的整体校正应在求这两个朝向之前完成。
取C为绕Z轴旋转90°的基底变换,源增量绕X轴旋转30°;共轭后的增量就绕目标Y轴旋转30°。直接复制增量仍会绕目标X轴,数值角度正确、解剖方向却错误。这个单轴输入比一段复杂走路动作更容易区分轴映射与动作本身。
当源姿态等于参考姿态时,,输出必然等于目标参考姿态。这是不依赖动作内容的检查。再给源骨绕自身长轴转动 30°,目标也应绕自己的长轴转动,而不是绕源模型的世界轴旋转。
局部求值
下面是矩阵算法片段,输入均为纯旋转,Transpose 因正交性等于逆矩阵;缩放已由导入器分离。输出仍为目标关节相对父关节的旋转,随后按父先子后的顺序累积模型姿态。
sourceDelta = Transpose(sourceReferenceLocal) * sourceCurrentLocal
targetDelta = basisMap * sourceDelta * Transpose(basisMap)
targetCurrentLocal = targetReferenceLocal * targetDelta
targetCurrentTranslation = targetReferenceTranslation目标局部平移保留参考骨长。若把源平移轨道逐骨复制,较短的目标前臂也会被拉成长前臂,角色比例随动作变化。带伸缩意图的非刚性骨骼需要独立的尺度规则;纯旋转映射不表达这种意图。
根运动与接触目标
旋转确定以后,两套不同长度的腿仍会走出不同步幅。根运动可用腿长比 缩放水平位移,并用角色朝向基底 转换方向:。长度统一为米, 无量纲。这里的腿长是参考姿态链长,而不是当前弯腿后的根脚距离,否则蹲下会改变缩放比例。
比例规则适合自由行走,但双手握同一把武器时,接触点由武器定义,不能随腿长缩放。此时先生成目标姿态,再将手部目标转到目标角色坐标,用 IK 修正链。脚的支撑阶段也保存接触点,摆动阶段释放约束。根运动、骨盆高度和 IK 目标各有所有者,避免控制器和动画重复应用同一位移。
扭转分配同样依赖目标结构。源前臂有三根扭转骨、目标只有一根时,可以从源链提取沿长轴的总扭转,再按目标权重分配;权重和为一。直接复制某一根会丢失其他骨的转角。把扭转和摆动混在一起平均又可能改变肘部弯曲,因此导入流程应先定义链轴与摆动分解。
验证与代价
使用参考姿态、单轴旋转、跨步和握持四组输入,分别观察参考误差、旋转轴、根轨迹和末端误差。末端误差用世界长度衡量,不能只比较四元数差。极限姿态下若目标不可达,记录目标距离与链长,选择有限伸长、骨盆补偿或释放接触的规则。
每骨基底映射是固定大小的矩阵或四元数运算,可缓存参考变换;IK 成本随链数与迭代预算增加。骨架版本改变后需重建映射,缓存命中以骨架内容身份为依据。
2026-10-22 执行 CPU参考测试通过,其中两项检查基底共轭的单位不变量与轴映射。它们支持坐标代数,不覆盖人体解剖映射、引擎导入或 IK 接触质量。目标引擎编译、动画运行和性能测量为未执行。
相关主题
参考资料
- Epic Games,IK Rig Retargeting,Retarget Pose 与链映射:用于参考姿态和接触目标的工程约束;2026-10-22 核对网页,正文矩阵是独立推导,不宣称复现引擎内部算法。
- Khronos,glTF Skins:关节变换和参考空间;蒙皮矩阵与本页动作映射分别使用。