package jme3test.model.anim; | |
import com.jme3.animation.AnimControl; | |
import com.jme3.animation.AnimationFactory; | |
import com.jme3.app.SimpleApplication; | |
import com.jme3.light.AmbientLight; | |
import com.jme3.light.DirectionalLight; | |
import com.jme3.math.FastMath; | |
import com.jme3.math.Quaternion; | |
import com.jme3.math.Vector3f; | |
import com.jme3.scene.Geometry; | |
import com.jme3.scene.Node; | |
import com.jme3.scene.shape.Box; | |
import com.jme3.util.TangentBinormalGenerator; | |
public class TestAnimationFactory extends SimpleApplication { | |
public static void main(String[] args) { | |
TestSpatialAnim app = new TestSpatialAnim(); | |
app.start(); | |
} | |
@Override | |
public void simpleInitApp() { | |
AmbientLight al = new AmbientLight(); | |
rootNode.addLight(al); | |
DirectionalLight dl = new DirectionalLight(); | |
dl.setDirection(Vector3f.UNIT_XYZ.negate()); | |
rootNode.addLight(dl); | |
// Create model | |
Box box = new Box(1, 1, 1); | |
Geometry geom = new Geometry("box", box); | |
geom.setMaterial(assetManager.loadMaterial("Textures/Terrain/BrickWall/BrickWall.j3m")); | |
Node model = new Node("model"); | |
model.attachChild(geom); | |
Box child = new Box(0.5f, 0.5f, 0.5f); | |
Geometry childGeom = new Geometry("box", child); | |
childGeom.setMaterial(assetManager.loadMaterial("Textures/Terrain/BrickWall/BrickWall.j3m")); | |
Node childModel = new Node("childmodel"); | |
childModel.setLocalTranslation(2, 2, 2); | |
childModel.attachChild(childGeom); | |
model.attachChild(childModel); | |
TangentBinormalGenerator.generate(model); | |
//creating quite complex animation witht the AnimationHelper | |
// animation of 6 seconds named "anim" and with 25 frames per second | |
AnimationFactory animationFactory = new AnimationFactory(6, "anim", 25); | |
//creating a translation keyFrame at time = 3 with a translation on the x axis of 5 WU | |
animationFactory.addTimeTranslation(3, new Vector3f(5, 0, 0)); | |
//reseting the translation to the start position at time = 6 | |
animationFactory.addTimeTranslation(6, new Vector3f(0, 0, 0)); | |
//Creating a scale keyFrame at time = 2 with the unit scale. | |
animationFactory.addTimeScale(2, new Vector3f(1, 1, 1)); | |
//Creating a scale keyFrame at time = 4 scaling to 1.5 | |
animationFactory.addTimeScale(4, new Vector3f(1.5f, 1.5f, 1.5f)); | |
//reseting the scale to the start value at time = 5 | |
animationFactory.addTimeScale(5, new Vector3f(1, 1, 1)); | |
//Creating a rotation keyFrame at time = 0.5 of quarter PI around the Z axis | |
animationFactory.addTimeRotation(0.5f,new Quaternion().fromAngleAxis(FastMath.QUARTER_PI, Vector3f.UNIT_Z)); | |
//rotating back to initial rotation value at time = 1 | |
animationFactory.addTimeRotation(1,Quaternion.IDENTITY); | |
//Creating a rotation keyFrame at time = 2. Note that i used the Euler angle version because the angle is higher than PI | |
//this should result in a complete revolution of the spatial around the x axis in 1 second (from 1 to 2) | |
animationFactory.addTimeRotationAngles(2, FastMath.TWO_PI,0, 0); | |
AnimControl control = new AnimControl(); | |
control.addAnim(animationFactory.buildAnimation()); | |
model.addControl(control); | |
rootNode.attachChild(model); | |
//run animation | |
control.createChannel().setAnim("anim"); | |
} | |
} |