/src/away3d/animators/skeleton/SkeletonUtils.as

http://github.com/away3d/away3d-core-fp11 · ActionScript · 65 lines · 52 code · 10 blank · 3 comment · 4 complexity · f993e21ad3767959c851ecbbf04b5800 MD5 · raw file

  1. /**
  2. * Author: David Lenaerts
  3. */
  4. package away3d.animators.skeleton
  5. {
  6. import away3d.animators.data.SkeletonAnimationSequence;
  7. import away3d.arcane;
  8. import flash.geom.Matrix3D;
  9. import flash.geom.Orientation3D;
  10. import flash.geom.Vector3D;
  11. use namespace arcane;
  12. public class SkeletonUtils
  13. {
  14. public static function generateDifferenceClip(source : SkeletonAnimationSequence, referencePose : SkeletonPose) : SkeletonAnimationSequence
  15. {
  16. var diff : SkeletonAnimationSequence = new SkeletonAnimationSequence(source.name, true);
  17. var numFrames : uint = source._frames.length;
  18. for (var i : uint = 0; i < numFrames; ++i)
  19. diff.addFrame(generateDifferencePose(source._frames[i], referencePose), source._durations[i]);
  20. return diff;
  21. }
  22. public static function generateDifferencePose(source : SkeletonPose, reference : SkeletonPose) : SkeletonPose
  23. {
  24. if (source.numJointPoses != reference.numJointPoses)
  25. {
  26. throw new Error("joint counts don't match!");
  27. }
  28. var numJoints : uint = source.numJointPoses;
  29. var diff : SkeletonPose = new SkeletonPose();
  30. var srcPose : JointPose;
  31. var refPose : JointPose;
  32. var diffPose : JointPose;
  33. var mtx : Matrix3D = new Matrix3D();
  34. var tempMtx : Matrix3D = new Matrix3D();
  35. var vec : Vector.<Vector3D>;
  36. for (var i : int = 0; i < numJoints; ++i) {
  37. srcPose = source.jointPoses[i];
  38. refPose = reference.jointPoses[i];
  39. diffPose = new JointPose();
  40. diff.jointPoses[i] = diffPose;
  41. diffPose.name = srcPose.name;
  42. refPose.toMatrix3D(mtx);
  43. mtx.invert();
  44. mtx.append(srcPose.toMatrix3D(tempMtx));
  45. vec = mtx.decompose(Orientation3D.QUATERNION);
  46. diffPose.translation.copyFrom(vec[0]);
  47. diffPose.orientation.x = vec[1].x;
  48. diffPose.orientation.y = vec[1].y;
  49. diffPose.orientation.z = vec[1].z;
  50. diffPose.orientation.w = vec[1].w;
  51. }
  52. return diff;
  53. }
  54. }
  55. }