diff --git a/cocos/animation/marionette/animation-graph-context.ts b/cocos/animation/marionette/animation-graph-context.ts index 14cd791ce15..16ddeeeac09 100644 --- a/cocos/animation/marionette/animation-graph-context.ts +++ b/cocos/animation/marionette/animation-graph-context.ts @@ -915,9 +915,12 @@ class AnimationGraphEvaluationContext { break; } case TransformSpace.LOCAL: { // Local -> * - const nodeComponentTransform = pose.transforms.getTransform(poseTransformIndex, cacheParentTransform_spaceConversion); - const invNodeComponentTransform = Transform.invert(nodeComponentTransform, nodeComponentTransform); - Transform.multiply(transform, invNodeComponentTransform, transform); + // Bone_Local_Transform * result = input + // result = inv(Bone_Local_Transform) * input + assertIsTrue(poseSpace === PoseTransformSpace.COMPONENT || poseSpace === PoseTransformSpace.LOCAL); + const boneTransform = pose.transforms.getTransform(poseTransformIndex, cacheParentTransform_spaceConversion); + const invBoneTransform = Transform.invert(boneTransform, boneTransform); + Transform.multiply(transform, invBoneTransform, transform); break; } } @@ -975,6 +978,9 @@ class AnimationGraphEvaluationContext { break; } case TransformSpace.LOCAL: { + assertIsTrue(poseSpace === PoseTransformSpace.COMPONENT || poseSpace === PoseTransformSpace.LOCAL); + // Bone_Local_Transform * result = input + // result = inv(Bone_Local_Transform) * input const currentTransform = pose.transforms.getTransform(poseTransformIndex, cacheParentTransform_spaceConversion); Transform.multiply(transform, currentTransform, transform); break; @@ -1005,7 +1011,7 @@ class AnimationGraphEvaluationContext { const { _parentTable: parentTable } = this; Transform.setIdentity(out); - for (let iTransform = transformIndex; iTransform >= 0; iTransform = parentTable[iTransform]) { + for (let iTransform = parentTable[transformIndex]; iTransform >= 0; iTransform = parentTable[iTransform]) { const localTransform = pose.transforms.getTransform(iTransform, cacheTransform_spaceConversion); Transform.multiply(out, localTransform, out); } diff --git a/cocos/animation/marionette/pose-graph/pose-nodes/apply-transform.ts b/cocos/animation/marionette/pose-graph/pose-nodes/apply-transform.ts index 6425f6b69fd..31ce2fef83a 100644 --- a/cocos/animation/marionette/pose-graph/pose-nodes/apply-transform.ts +++ b/cocos/animation/marionette/pose-graph/pose-nodes/apply-transform.ts @@ -17,7 +17,7 @@ import { PoseGraphType } from '../foundation/type-system'; import { TransformSpace } from './transform-space'; import { Transform } from '../../../core/transform'; -enum TransformOperation { +export enum TransformOperation { LEAVE_UNCHANGED, REPLACE, diff --git a/tests/animation/new-gen-anim/pose-graph/pose-transform-space.test.ts b/tests/animation/new-gen-anim/pose-graph/pose-transform-space.test.ts index 5009af42742..f1856cc8fbf 100644 --- a/tests/animation/new-gen-anim/pose-graph/pose-transform-space.test.ts +++ b/tests/animation/new-gen-anim/pose-graph/pose-transform-space.test.ts @@ -106,7 +106,7 @@ describe(`Pose transform space`, () => { hierarchy.getComponentToWorldTransform(), // Component -> World hierarchy.computeComponentSpaceTransform( // Local -> Component localSpacePoseRecord, - nodeName, + hierarchy.getParentNodeName(nodeName), ), ); }], @@ -116,7 +116,7 @@ describe(`Pose transform space`, () => { [PoseTransformSpace.LOCAL, TransformSpace.COMPONENT, (hierarchy, localSpacePoseRecord, nodeName) => { return hierarchy.computeComponentSpaceTransform( localSpacePoseRecord, - nodeName, + hierarchy.getParentNodeName(nodeName), ); }],