import com.jme3.export.JmeExporter;
import com.jme3.export.JmeImporter;
import com.jme3.export.OutputCapsule;
-import com.jme3.math.FastMath;
import com.jme3.math.Quaternion;
import com.jme3.scene.Spatial;
+import com.jme3.util.TempVars;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
public class RotationTrack extends AbstractCinematicEvent {
private static final Logger log = Logger.getLogger(RotationTrack.class.getName());
- private float[] startRotation;
- private float[] endRotation;
+ private Quaternion startRotation = new Quaternion();
+ private Quaternion endRotation = new Quaternion();
private Spatial spatial;
private String spatialName = "";
private float value = 0;
public RotationTrack() {
}
- public RotationTrack(Spatial spatial, float[] endRotation) {
- this.endRotation = endRotation;
+ public RotationTrack(Spatial spatial, Quaternion endRotation) {
+ this.endRotation.set(endRotation);
this.spatial = spatial;
spatialName = spatial.getName();
}
- public RotationTrack(Spatial spatial, float[] endRotation, float initialDuration, LoopMode loopMode) {
+ public RotationTrack(Spatial spatial, Quaternion endRotation, float initialDuration, LoopMode loopMode) {
super(initialDuration, loopMode);
- this.endRotation = endRotation;
+ this.endRotation.set(endRotation);
this.spatial = spatial;
spatialName = spatial.getName();
}
- public RotationTrack(Spatial spatial, float[] endRotation, LoopMode loopMode) {
+ public RotationTrack(Spatial spatial, Quaternion endRotation, LoopMode loopMode) {
super(loopMode);
- this.endRotation = endRotation;
+ this.endRotation.set(endRotation);
this.spatial = spatial;
spatialName = spatial.getName();
}
- public RotationTrack(Spatial spatial, float[] endRotation, float initialDuration) {
+ public RotationTrack(Spatial spatial, Quaternion endRotation, float initialDuration) {
super(initialDuration);
- this.endRotation = endRotation;
+ this.endRotation.set(endRotation);
this.spatial = spatial;
spatialName = spatial.getName();
}
@Override
public void onPlay() {
if (playState != playState.Paused) {
- startRotation = spatial.getWorldRotation().toAngles(null);
+ startRotation.set(spatial.getWorldRotation());
}
if (duration == 0 && spatial != null) {
- spatial.setLocalRotation(new Quaternion().fromAngles(endRotation));
+ spatial.setLocalRotation(endRotation);
stop();
}
}
public void onUpdate(float tpf) {
if (spatial != null) {
value += Math.min(tpf * speed / duration, 1.0f);
- float[] rot = new float[3];
- rot[0] = FastMath.interpolateLinear(value, startRotation[0], endRotation[0]);
- rot[1] = FastMath.interpolateLinear(value, startRotation[1], endRotation[1]);
- rot[2] = FastMath.interpolateLinear(value, startRotation[2], endRotation[2]);
- spatial.setLocalRotation(new Quaternion().fromAngles(rot));
+ TempVars vars = TempVars.get();
+ Quaternion q = vars.quat1;
+ q.set(startRotation).slerp(endRotation, value);
+
+ spatial.setLocalRotation(q);
+ vars.release();
}
}
super.read(im);
InputCapsule ic = im.getCapsule(this);
spatialName = ic.readString("spatialName", "");
- endRotation = ic.readFloatArray("endRotation", null);
+ endRotation = (Quaternion) ic.readSavable("endRotation", null);
}
}
import com.jme3.material.Material;\r
import com.jme3.math.ColorRGBA;\r
import com.jme3.math.FastMath;\r
+import com.jme3.math.Quaternion;\r
import com.jme3.math.Vector3f;\r
import com.jme3.post.FilterPostProcessor;\r
import com.jme3.post.filters.FadeFilter;\r
});\r
cinematic.addCinematicEvent(0, new PositionTrack(teapot, new Vector3f(10, 0, 10), 0));\r
cinematic.addCinematicEvent(0, new ScaleTrack(teapot, new Vector3f(1, 1, 1), 0));\r
- float[] rotation = {0, 0, 0};\r
- cinematic.addCinematicEvent(0, new RotationTrack(teapot, rotation, 0));\r
+ Quaternion q = new Quaternion();\r
+ q.loadIdentity();\r
+ cinematic.addCinematicEvent(0, new RotationTrack(teapot, q, 0));\r
\r
cinematic.addCinematicEvent(0, new PositionTrack(teapot, new Vector3f(10, 0, -10), 20));\r
cinematic.addCinematicEvent(0, new ScaleTrack(teapot, new Vector3f(4, 4, 4), 10));\r
cinematic.addCinematicEvent(10, new ScaleTrack(teapot, new Vector3f(1, 1, 1), 10));\r
- float[] rotation2 = {0, FastMath.TWO_PI, 0};\r
+ Quaternion rotation2 = new Quaternion().fromAngleAxis(FastMath.PI, Vector3f.UNIT_Y);\r
cinematic.addCinematicEvent(0, new RotationTrack(teapot, rotation2, 20));\r
\r
cinematic.activateCamera(0, "aroundCam");\r