From 824e99c96e6e183d81f13fbaef00db2cf8252c14 Mon Sep 17 00:00:00 2001 From: Nehon Date: Mon, 2 Apr 2018 09:36:29 +0200 Subject: [PATCH] Fixes attachement node when model ignore transforms --- .../main/java/com/jme3/animation/Bone.java | 6 ++- .../src/main/java/com/jme3/scene/Spatial.java | 47 ------------------- 2 files changed, 4 insertions(+), 49 deletions(-) diff --git a/jme3-core/src/main/java/com/jme3/animation/Bone.java b/jme3-core/src/main/java/com/jme3/animation/Bone.java index b60273ecc..edc1b8894 100644 --- a/jme3-core/src/main/java/com/jme3/animation/Bone.java +++ b/jme3-core/src/main/java/com/jme3/animation/Bone.java @@ -540,8 +540,10 @@ public final class Bone implements Savable, JmeCloneable { * The animated meshes ignore transforms: match the world transform * of the attachments node to the bone's transform. */ - Transform combined = new Transform(modelPos, modelRot, modelScale); - attachNode.setWorldTransform(combined); + attachNode.setLocalTranslation(modelPos); + attachNode.setLocalRotation(modelRot); + attachNode.setLocalScale(modelScale); + attachNode.getLocalTransform().combineWithParent(attachNode.getParent().getWorldTransform().invert()); } else { Spatial loopSpatial = targetGeometry; diff --git a/jme3-core/src/main/java/com/jme3/scene/Spatial.java b/jme3-core/src/main/java/com/jme3/scene/Spatial.java index ec2d992f7..c44db734b 100644 --- a/jme3-core/src/main/java/com/jme3/scene/Spatial.java +++ b/jme3-core/src/main/java/com/jme3/scene/Spatial.java @@ -495,53 +495,6 @@ public abstract class Spatial implements Savable, Cloneable, Collidable, Cloneab return worldTransform; } - /** - * Alter the local transform so that the world transform approximates the - * specified value. - * - * @param world desired world transform (not null, unaffected) - * @throws IllegalArgumentException if the spatial ignores transform OR the - * parent's world transform isn't invertible - */ - public void setWorldTransform(Transform world) { - if (this instanceof Geometry && ((Geometry) this).ignoreTransform) { - throw new RuntimeException("spatial ignores transforms"); - } - - if (parent == null) { - /* - * special case: for a root spatial, the world transform is - * precisely the local transform - */ - setLocalTransform(world); - return; - } - - Transform parentTransform = parent.getWorldTransform(); - Vector3f parentScale = parentTransform.getScale(); - if (parentScale.x == 0f || parentScale.y == 0f || parentScale.z == 0f) { - throw new RuntimeException("parent scale isn't invertible"); - } - Quaternion parentInvRotation = parentTransform.getRotation().inverse(); - if (parentInvRotation == null) { - throw new RuntimeException("parent rotation isn't invertible"); - } - /* - * Undo the operations of Transform.combineWithParent() - */ - Transform tmpLocal = world.clone(); - Vector3f translation = tmpLocal.getTranslation(); - Quaternion rotation = tmpLocal.getRotation(); - tmpLocal.getScale().divideLocal(parentScale); - parentInvRotation.mult(rotation, rotation); - Vector3f parentTranslation = parentTransform.getTranslation(); - translation.subtractLocal(parentTranslation); - parentInvRotation.multLocal(translation); - translation.divideLocal(parentScale); - - setLocalTransform(tmpLocal); - } - /** * rotateUpTo is a utility function that alters the * local rotation to point the Y axis in the direction given by newUp.