소스 검색

Bugfix: fixed error in Inverse Kinematics constraint (animations with
these constraint should look better now, although not yet perfect ;).

jmekaelthas 9 년 전
부모
커밋
153cb27d78
1개의 변경된 파일16개의 추가작업 그리고 7개의 파일을 삭제
  1. 16 7
      jme3-blender/src/main/java/com/jme3/scene/plugins/blender/constraints/definitions/ConstraintDefinitionIK.java

+ 16 - 7
jme3-blender/src/main/java/com/jme3/scene/plugins/blender/constraints/definitions/ConstraintDefinitionIK.java

@@ -174,7 +174,7 @@ public class ConstraintDefinitionIK extends ConstraintDefinition {
     private static class BonesChain extends ArrayList<BoneContext> {
         private static final long serialVersionUID = -1850524345643600718L;
 
-        private List<Matrix> bonesMatrices = new ArrayList<Matrix>();
+        private List<Matrix> localBonesMatrices = new ArrayList<Matrix>();
 
         public BonesChain(Bone bone, boolean useTail, int bonesAffected, Collection<Long> alteredOmas, BlenderContext blenderContext) {
             if (bone != null) {
@@ -187,12 +187,21 @@ public class ConstraintDefinitionIK extends ConstraintDefinition {
                     this.add(boneContext);
                     alteredOmas.add(boneContext.getBoneOma());
 
-                    Space space = this.size() < bonesAffected ? Space.CONSTRAINT_SPACE_LOCAL : Space.CONSTRAINT_SPACE_WORLD;
-                    Transform transform = constraintHelper.getTransform(boneContext.getArmatureObjectOMA(), boneContext.getBone().getName(), space);
-                    bonesMatrices.add(new DTransform(transform).toMatrix());
+                    Transform transform = constraintHelper.getTransform(boneContext.getArmatureObjectOMA(), boneContext.getBone().getName(), Space.CONSTRAINT_SPACE_WORLD);
+                    localBonesMatrices.add(new DTransform(transform).toMatrix());
 
                     bone = bone.getParent();
                 }
+                
+                if(localBonesMatrices.size() > 0) {
+                	// making the matrices describe the local transformation
+                    Matrix parentWorldMatrix = localBonesMatrices.get(localBonesMatrices.size() - 1);
+                    for(int i=localBonesMatrices.size() - 2;i>=0;--i) {
+                    	SimpleMatrix m = parentWorldMatrix.invert().mult(localBonesMatrices.get(i));
+                    	parentWorldMatrix = localBonesMatrices.get(i);
+                    	localBonesMatrices.set(i, new Matrix(m));
+                    }
+                }
             }
         }
 
@@ -211,16 +220,16 @@ public class ConstraintDefinitionIK extends ConstraintDefinition {
                 SimpleMatrix m = parentWorldMatrix.invert().mult(boneMatrix);
                 boneMatrix = new Matrix(m);
             }
-            bonesMatrices.set(index, boneMatrix);
+            localBonesMatrices.set(index, boneMatrix);
         }
 
         public Matrix getWorldMatrix(int index) {
             if (index == this.size() - 1) {
-                return new Matrix(bonesMatrices.get(this.size() - 1));
+                return new Matrix(localBonesMatrices.get(this.size() - 1));
             }
 
             SimpleMatrix result = this.getWorldMatrix(index + 1);
-            result = result.mult(bonesMatrices.get(index));
+            result = result.mult(localBonesMatrices.get(index));
             return new Matrix(result);
         }
     }