Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -32,20 +32,26 @@

package jme3test.model.anim;

import com.jme3.animation.*;
import com.jme3.anim.AnimComposer;
import com.jme3.anim.ArmatureMask;
import com.jme3.anim.Joint;
import com.jme3.anim.SkinningControl;
import com.jme3.anim.tween.action.Action;
import com.jme3.app.SimpleApplication;
import com.jme3.light.DirectionalLight;
import com.jme3.material.Material;
import com.jme3.math.*;
import com.jme3.math.ColorRGBA;
import com.jme3.math.FastMath;
import com.jme3.math.Quaternion;
import com.jme3.math.Vector3f;
import com.jme3.scene.Node;
import com.jme3.scene.debug.SkeletonDebugger;
import com.jme3.scene.debug.custom.ArmatureDebugger;

//TODO rework this Test when the new animation system is done.
public class TestOgreComplexAnim extends SimpleApplication {

private AnimControl control;
private SkinningControl skinningControl;

private float angle = 0;
private float scale = 1;
private float rate = 1;

public static void main(String[] args) {
Expand All @@ -64,75 +70,66 @@ public void simpleInitApp() {
dl.setColor(new ColorRGBA(1f, 1f, 1f, 1.0f));
rootNode.addLight(dl);

Node model = (Node) assetManager.loadModel("Models/Oto/OtoOldAnim.j3o");

control = model.getControl(AnimControl.class);
Node model = (Node) assetManager.loadModel("Models/Oto/Oto.mesh.xml");

AnimChannel feet = control.createChannel();
AnimChannel leftHand = control.createChannel();
AnimChannel rightHand = control.createChannel();
skinningControl = model.getControl(SkinningControl.class);
AnimComposer ac = model.getControl(AnimComposer.class);

// feet will dodge
feet.addFromRootBone("hip.right");
feet.addFromRootBone("hip.left");
feet.setAnim("Dodge");
feet.setSpeed(2);
feet.setLoopMode(LoopMode.Cycle);
ArmatureMask feet = ArmatureMask.createMask(skinningControl.getArmature(), "hip.right", "hip.left");
Action dodgeAction = ac.action("Dodge");
dodgeAction.setMask(feet);
dodgeAction.setSpeed(2f);
Action walkAction = ac.action("Walk");
walkAction.setMask(feet);
walkAction.setSpeed(0.25f);

// will blend over 15 seconds to stand
feet.setAnim("Walk", 15);
feet.setSpeed(0.25f);
feet.setLoopMode(LoopMode.Cycle);
ArmatureMask rightHand = ArmatureMask.createMask(skinningControl.getArmature(), "uparm.right");
Action pullAction = ac.action("pull");
pullAction.setMask(rightHand);
pullAction.setSpeed(0.5f);
Action standAction = ac.action("stand");
standAction.setMask(rightHand);
standAction.setSpeed(0.5f);

// left hand will pull
leftHand.addFromRootBone("uparm.right");
leftHand.setAnim("pull");
leftHand.setSpeed(.5f);
ac.actionSequence("complexAction",
ac.actionSequence("feetAction", dodgeAction, walkAction),
ac.actionSequence("rightHandAction", pullAction, standAction));

// will blend over 15 seconds to stand
leftHand.setAnim("stand", 15);
ac.setCurrentAction("complexAction");

// right hand will push
rightHand.addBone("spinehigh");
rightHand.addFromRootBone("uparm.left");
rightHand.setAnim("push");

SkeletonDebugger skeletonDebug = new SkeletonDebugger("skeleton", control.getSkeleton());
Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
mat.getAdditionalRenderState().setWireframe(true);
mat.setColor("Color", ColorRGBA.Green);
mat.setFloat("PointSize", 7f);
mat.setFloat("PointSize", 7f); // Bug ? do not change size of debug points ?
mat.getAdditionalRenderState().setDepthTest(false);
skeletonDebug.setMaterial(mat);

model.attachChild(skeletonDebug);
ArmatureDebugger armatureDebug = new ArmatureDebugger("armature", skinningControl.getArmature(),
skinningControl.getArmature().getJointList());
armatureDebug.setMaterial(mat);
model.attachChild(armatureDebug);

rootNode.attachChild(model);
}

@Override
public void simpleUpdate(float tpf){
Bone b = control.getSkeleton().getBone("spinehigh");
Bone b2 = control.getSkeleton().getBone("uparm.left");
public void simpleUpdate(float tpf) {
Joint j = skinningControl.getArmature().getJoint("spinehigh");
Joint j2 = skinningControl.getArmature().getJoint("uparm.left");

angle += tpf * rate;
if (angle > FastMath.HALF_PI / 2f){
if (angle > FastMath.HALF_PI / 2f) {
angle = FastMath.HALF_PI / 2f;
rate = -1;
}else if (angle < -FastMath.HALF_PI / 2f){
} else if (angle < -FastMath.HALF_PI / 2f) {
angle = -FastMath.HALF_PI / 2f;
rate = 1;
}

Quaternion q = new Quaternion();
q.fromAngles(0, angle, 0);

b.setUserControl(true);
b.setUserTransforms(Vector3f.ZERO, q, Vector3f.UNIT_XYZ);

b2.setUserControl(true);
b2.setUserTransforms(Vector3f.ZERO, Quaternion.IDENTITY, new Vector3f(1+angle,1+ angle, 1+angle));


j.setLocalRotation(j.getInitialTransform().getRotation().mult(q));
j2.setLocalScale(j.getInitialTransform().getScale().mult(new Vector3f(1 + angle, 1 + angle, 1 + angle)));
}

}