|
@@ -495,6 +495,53 @@ public abstract class Spatial implements Savable, Cloneable, Collidable, Cloneab
|
|
return worldTransform;
|
|
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);
|
|
|
|
+ }
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* <code>rotateUpTo</code> is a utility function that alters the
|
|
* <code>rotateUpTo</code> is a utility function that alters the
|
|
* local rotation to point the Y axis in the direction given by newUp.
|
|
* local rotation to point the Y axis in the direction given by newUp.
|