@ -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.Armature Debugger ;
//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 ) {
@ -64,61 +70,57 @@ public class TestOgreComplexAnim extends SimpleApplication {
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 ;
}
@ -126,13 +128,8 @@ public class TestOgreComplexAnim extends SimpleApplication {
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 ) ) ) ;
}
}