|
|
|
@ -25,19 +25,20 @@ import com.jme3.scene.plugins.blender.math.Vector3d; |
|
|
|
|
* @author Marcin Roguski (Kaelthas) |
|
|
|
|
*/ |
|
|
|
|
public class ConstraintDefinitionIK extends ConstraintDefinition { |
|
|
|
|
private static final float MIN_DISTANCE = 0.001f; |
|
|
|
|
private static final int FLAG_USE_TAIL = 0x01; |
|
|
|
|
private static final int FLAG_POSITION = 0x20; |
|
|
|
|
private static final float MIN_DISTANCE = 0.001f; |
|
|
|
|
private static final float MIN_ANGLE_CHANGE = 0.001f; |
|
|
|
|
private static final int FLAG_USE_TAIL = 0x01; |
|
|
|
|
private static final int FLAG_POSITION = 0x20; |
|
|
|
|
|
|
|
|
|
private BonesChain bones; |
|
|
|
|
private BonesChain bones; |
|
|
|
|
/** The number of affected bones. Zero means that all parent bones of the current bone should take part in baking. */ |
|
|
|
|
private int bonesAffected; |
|
|
|
|
private int bonesAffected; |
|
|
|
|
/** Indicates if the tail of the bone should be used or not. */ |
|
|
|
|
private boolean useTail; |
|
|
|
|
private boolean useTail; |
|
|
|
|
/** The amount of iterations of the algorithm. */ |
|
|
|
|
private int iterations; |
|
|
|
|
private int iterations; |
|
|
|
|
/** The count of bones' chain. */ |
|
|
|
|
private int bonesCount = -1; |
|
|
|
|
private int bonesCount = -1; |
|
|
|
|
|
|
|
|
|
public ConstraintDefinitionIK(Structure constraintData, Long ownerOMA, BlenderContext blenderContext) { |
|
|
|
|
super(constraintData, ownerOMA, blenderContext); |
|
|
|
@ -117,7 +118,9 @@ public class ConstraintDefinitionIK extends ConstraintDefinition { |
|
|
|
|
Matrix J_1 = J.pseudoinverse(); |
|
|
|
|
|
|
|
|
|
SimpleMatrix deltaThetas = J_1.mult(deltaP); |
|
|
|
|
|
|
|
|
|
if (deltaThetas.elementMaxAbs() < MIN_ANGLE_CHANGE) { |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
for (int j = 0; j < deltaThetas.numRows(); ++j) { |
|
|
|
|
double angle = deltaThetas.get(j, 0); |
|
|
|
|
Vector3d rotationVector = rotationVectors[j]; |
|
|
|
@ -171,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> bonesMatrices = new ArrayList<Matrix>(); |
|
|
|
|
|
|
|
|
|
public BonesChain(Bone bone, boolean useTail, int bonesAffected, Collection<Long> alteredOmas, BlenderContext blenderContext) { |
|
|
|
|
if (bone != null) { |
|
|
|
|