剪辑保留源数据、动画器借用场景:两层覆盖式混合、每层事件与根运动提取,骨骼节点还能当挂点用。
// 从模型取剪辑,或加载独立的"纯动作" 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)