diff --git a/engine/src/core/com/jme3/animation/Bone.java b/engine/src/core/com/jme3/animation/Bone.java index 62ea58e80..5da1751db 100644 --- a/engine/src/core/com/jme3/animation/Bone.java +++ b/engine/src/core/com/jme3/animation/Bone.java @@ -39,6 +39,7 @@ import com.jme3.export.Savable; import com.jme3.math.Matrix3f; import com.jme3.math.Matrix4f; import com.jme3.math.Quaternion; +import com.jme3.math.Transform; import com.jme3.math.Vector3f; import com.jme3.scene.Node; import com.jme3.util.TempVars; @@ -92,6 +93,9 @@ public final class Bone implements Savable { private Vector3f worldPos = new Vector3f(); private Quaternion worldRot = new Quaternion(); private Vector3f worldScale = new Vector3f(); + + //used for getCombinedTransform + private Transform tmpTransform=new Transform(); /** * Creates a new bone with the given name. @@ -372,17 +376,19 @@ public final class Bone implements Savable { worldPos.set(translation); worldRot.set(rotation); } - protected Vector3f tmpVec = new Vector3f(); - protected Quaternion tmpQuat = new Quaternion(); - - public Quaternion getTmpQuat() { - return tmpQuat; - } - - public Vector3f getTmpVec() { - return tmpVec; + + /** + * Returns teh local transform of this bone combined with the given position and rotation + * @param position a position + * @param rotation a rotation + * @return + */ + public Transform getCombinedTransform(Vector3f position, Quaternion rotation){ + rotation.mult(localPos, tmpTransform.getTranslation()).addLocal(position); + tmpTransform.setRotation(rotation).getRotation().multLocal(localRot); + return tmpTransform; } - + /** * Returns the attachment node. * Attach models and effects to this node to make diff --git a/engine/src/jbullet/com/jme3/bullet/control/RagdollControl.java b/engine/src/jbullet/com/jme3/bullet/control/RagdollControl.java index aef81be78..1d0a63d88 100644 --- a/engine/src/jbullet/com/jme3/bullet/control/RagdollControl.java +++ b/engine/src/jbullet/com/jme3/bullet/control/RagdollControl.java @@ -50,6 +50,7 @@ import com.jme3.bullet.objects.PhysicsRigidBody; import com.jme3.export.JmeExporter; import com.jme3.export.JmeImporter; import com.jme3.math.Quaternion; +import com.jme3.math.Transform; import com.jme3.math.Vector3f; import com.jme3.renderer.RenderManager; import com.jme3.renderer.ViewPort; @@ -83,7 +84,7 @@ public class RagdollControl implements PhysicsControl, PhysicsCollisionListener protected Skeleton skeleton; protected PhysicsSpace space; protected boolean enabled = true; - protected boolean debug = false; + protected boolean debug = false; protected PhysicsRigidBody baseRigidBody; protected float weightThreshold = 1.0f; protected Spatial targetModel; @@ -186,12 +187,8 @@ public class RagdollControl implements PhysicsControl, PhysicsCollisionListener bone.setUserTransformsWorld(pos, rot); for (Bone childBone : bone.getChildren()) { if (!boneList.contains(childBone.getName())) { - Vector3f tmpVec = childBone.getTmpVec(); - Quaternion tmpQuat = childBone.getTmpQuat(); - rot.mult(childBone.getLocalPosition(), tmpVec).addLocal(pos); - tmpQuat.set(rot).multLocal(childBone.getLocalRotation()); - setTransform(childBone, tmpVec, tmpQuat); - + Transform t = childBone.getCombinedTransform(pos, rot); + setTransform(childBone, t.getTranslation(), t.getRotation()); } } } @@ -592,7 +589,7 @@ public class RagdollControl implements PhysicsControl, PhysicsCollisionListener } } - if (hit && event.getAppliedImpulse() > eventDispatchImpulseThreshold) { + if (hit && event.getAppliedImpulse() > eventDispatchImpulseThreshold) { for (RagdollCollisionListener listener : listeners) { listener.collide(hitBone, hitObject, event); } @@ -680,6 +677,4 @@ public class RagdollControl implements PhysicsControl, PhysicsCollisionListener public void setEventDispatchImpulseThreshold(float eventDispatchImpulseThreshold) { this.eventDispatchImpulseThreshold = eventDispatchImpulseThreshold; } - - }