Chapter 219 · 3D 图形

骨骼动画

剪辑保留源数据、动画器借用场景:两层覆盖式混合、每层事件与根运动提取,骨骼节点还能当挂点用。

219

剪辑与动画器

// 从模型取剪辑,或加载独立的"纯动作" glTF
xge3d_clip *pWalk, *pRun;
xge3dClipFromModel(pModel, 0, &pWalk);
xge3dClipLoad("actions/run.gltf", 0, &pRun);

xge3d_animator *pAnim;
xge3dAnimatorCreate(pScene, tActorRoot, &pAnim);

层混合与更新

xge3d_animation_layer_t tLayer = xge3dAnimationLayerDefault();
tLayer.speed = 1.0f;  tLayer.loop = 1;
xge3dAnimatorSetLayer(pAnim, 0, pWalk, &tLayer);   // 基础层
tLayer.weight = 0.6f;
xge3dAnimatorSetLayer(pAnim, 1, pRun, &tLayer);    // 覆盖层,对静息姿混合

xge3dAnimatorUpdate(pAnim, fDeltaSeconds);

绑定失败保留旧层;自动绑定按唯一骨骼名,或对来自同一模型的剪辑按源索引。层可带遮罩(mask 数组按目标源节点序)与跨骨架骨绑定表。事件用 xge3dAnimatorSetEvents 登记,xge3dAnimatorNextEvent 按剪辑时间序取出(每层最多 1024,待处理超 4096 时 Update 直接失败防积压)。

根运动与挂点

xge3dAnimatorSetRootMotion(pAnim, tTargetBone,
                            XGE3D_ROOT_X | XGE3D_ROOT_Z);   // 抽取水平位移
xge3d_root_motion_t tMotion;
xge3dAnimatorTakeRootMotion(pAnim, &tMotion);  // 应用前先做你自己的碰撞检查

xge3d_node_t tHand;
xge3dAnimatorBoneNode(pAnim, "hand_r", &tHand);  // 骨骼节点当挂点(socket)
注意:运行时按名/索引绑定不调整骨骼长度与轴——不同骨架的动作必须先走离线重定向(C 工具已验证两套不同参考姿态的目标骨架)。