@ -32,107 +32,104 @@
package jme3test.model.anim ;
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.app.SimpleApplication ;
import com.jme3.light.DirectionalLight ;
import com.jme3.light.DirectionalLight ;
import com.jme3.material.Material ;
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.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 {
public class TestOgreComplexAnim extends SimpleApplication {
private AnimControl control ;
private SkinningControl skinningControl ;
private float angle = 0 ;
private float scale = 1 ;
private float angle = 0 ;
private float rate = 1 ;
private float rate = 1 ;
public static void main ( String [ ] args ) {
public static void main ( String [ ] args ) {
TestOgreComplexAnim app = new TestOgreComplexAnim ( ) ;
TestOgreComplexAnim app = new TestOgreComplexAnim ( ) ;
app . start ( ) ;
app . start ( ) ;
}
}
@Override
@Override
public void simpleInitApp ( ) {
public void simpleInitApp ( ) {
flyCam . setMoveSpeed ( 10f ) ;
flyCam . setMoveSpeed ( 10f ) ;
cam . setLocation ( new Vector3f ( 6 . 4013605f , 7 . 488437f , 12 . 843031f ) ) ;
cam . setLocation ( new Vector3f ( 6 . 4013605f , 7 . 488437f , 12 . 843031f ) ) ;
cam . setRotation ( new Quaternion ( - 0 . 060740203f , 0 . 93925786f , - 0 . 2398315f , - 0 . 2378785f ) ) ;
cam . setRotation ( new Quaternion ( - 0 . 060740203f , 0 . 93925786f , - 0 . 2398315f , - 0 . 2378785f ) ) ;
DirectionalLight dl = new DirectionalLight ( ) ;
DirectionalLight dl = new DirectionalLight ( ) ;
dl . setDirection ( new Vector3f ( - 0 . 1f , - 0 . 7f , - 1 ) . normalizeLocal ( ) ) ;
dl . setDirection ( new Vector3f ( - 0 . 1f , - 0 . 7f , - 1 ) . normalizeLocal ( ) ) ;
dl . setColor ( new ColorRGBA ( 1f , 1f , 1f , 1 . 0f ) ) ;
dl . setColor ( new ColorRGBA ( 1f , 1f , 1f , 1 . 0f ) ) ;
rootNode . addLight ( dl ) ;
rootNode . addLight ( dl ) ;
Node model = ( Node ) assetManager . loadModel ( "Models/Oto/OtoOldAnim.j3o" ) ;
Node model = ( Node ) assetManager . loadModel ( "Models/Oto/Oto.mesh.xml" ) ;
control = model . getControl ( AnimControl . class ) ;
skinningControl = model . getControl ( SkinningControl . class ) ;
AnimComposer ac = model . getControl ( AnimComposer . class ) ;
AnimChannel feet = control . createChannel ( ) ;
AnimChannel leftHand = control . createChannel ( ) ;
ArmatureMask feet = ArmatureMask . createMask ( skinningControl . getArmature ( ) , "hip.right" , "hip.left" ) ;
AnimChannel rightHand = control . createChannel ( ) ;
Action dodgeAction = ac . action ( "Dodge" ) ;
dodgeAction . setMask ( feet ) ;
// feet will dodge
dodgeAction . setSpeed ( 2f ) ;
feet . addFromRootBone ( "hip.right" ) ;
Action walkAction = ac . action ( "Walk" ) ;
feet . addFromRootBone ( "hip.left" ) ;
walkAction . setMask ( feet ) ;
feet . setAnim ( "Dodge" ) ;
walkAction . setSpeed ( 0 . 25f ) ;
feet . setSpeed ( 2 ) ;
feet . setLoopMode ( LoopMode . Cycle ) ;
ArmatureMask rightHand = ArmatureMask . createMask ( skinningControl . getArmature ( ) , "uparm.right" ) ;
Action pullAction = ac . action ( "pull" ) ;
// will blend over 15 seconds to stand
pullAction . setMask ( rightHand ) ;
feet . setAnim ( "Walk" , 15 ) ;
pullAction . setSpeed ( 0 . 5f ) ;
feet . setSpeed ( 0 . 25f ) ;
Action standAction = ac . action ( "stand" ) ;
feet . setLoopMode ( LoopMode . Cycle ) ;
standAction . setMask ( rightHand ) ;
standAction . setSpeed ( 0 . 5f ) ;
// left hand will pull
leftHand . addFromRootBone ( "uparm.right" ) ;
ac . actionSequence ( "complexAction" ,
leftHand . setAnim ( "pull" ) ;
ac . actionSequence ( "feetAction" , dodgeAction , walkAction ) ,
leftHand . setSpeed ( . 5f ) ;
ac . actionSequence ( "rightHandAction" , pullAction , standAction ) ) ;
// will blend over 15 seconds to stand
ac . setCurrentAction ( "complexAction" ) ;
leftHand . setAnim ( "stand" , 15 ) ;
Material mat = new Material ( assetManager , "Common/MatDefs/Misc/Unshaded.j3md" ) ;
// right hand will push
mat . getAdditionalRenderState ( ) . setWireframe ( true ) ;
rightHand . addBone ( "spinehigh" ) ;
mat . setColor ( "Color" , ColorRGBA . Green ) ;
rightHand . addFromRootBone ( "uparm.left" ) ;
mat . setFloat ( "PointSize" , 7f ) ; // Bug ? do not change size of debug points ?
rightHand . setAnim ( "push" ) ;
mat . getAdditionalRenderState ( ) . setDepthTest ( false ) ;
SkeletonDebugger skeletonDebug = new SkeletonDebugger ( "skeleton" , control . getSkeleton ( ) ) ;
ArmatureDebugger armatureDebug = new ArmatureDebugger ( "armature" , skinningControl . getArmature ( ) ,
Material mat = new Material ( assetManager , "Common/MatDefs/Misc/Unshaded.j3md" ) ;
skinningControl . getArmature ( ) . getJointList ( ) ) ;
mat . getAdditionalRenderState ( ) . setWireframe ( true ) ;
armatureDebug . setMaterial ( mat ) ;
mat . setColor ( "Color" , ColorRGBA . Green ) ;
model . attachChild ( armatureDebug ) ;
mat . setFloat ( "PointSize" , 7f ) ;
mat . getAdditionalRenderState ( ) . setDepthTest ( false ) ;
rootNode . attachChild ( model ) ;
skeletonDebug . setMaterial ( mat ) ;
}
model . attachChild ( skeletonDebug ) ;
@Override
rootNode . attachChild ( model ) ;
public void simpleUpdate ( float tpf ) {
}
Joint j = skinningControl . getArmature ( ) . getJoint ( "spinehigh" ) ;
Joint j2 = skinningControl . getArmature ( ) . getJoint ( "uparm.left" ) ;
@Override
public void simpleUpdate ( float tpf ) {
angle + = tpf * rate ;
Bone b = control . getSkeleton ( ) . getBone ( "spinehigh" ) ;
if ( angle > FastMath . HALF_PI / 2f ) {
Bone b2 = control . getSkeleton ( ) . getBone ( "uparm.left" ) ;
angle = FastMath . HALF_PI / 2f ;
rate = - 1 ;
angle + = tpf * rate ;
} else if ( angle < - FastMath . HALF_PI / 2f ) {
if ( angle > FastMath . HALF_PI / 2f ) {
angle = - FastMath . HALF_PI / 2f ;
angle = FastMath . HALF_PI / 2f ;
rate = 1 ;
rate = - 1 ;
}
} else if ( angle < - FastMath . HALF_PI / 2f ) {
angle = - FastMath . HALF_PI / 2f ;
Quaternion q = new Quaternion ( ) ;
rate = 1 ;
q . fromAngles ( 0 , angle , 0 ) ;
}
j . setLocalRotation ( j . getInitialTransform ( ) . getRotation ( ) . mult ( q ) ) ;
Quaternion q = new Quaternion ( ) ;
j2 . setLocalScale ( j . getInitialTransform ( ) . getScale ( ) . mult ( new Vector3f ( 1 + angle , 1 + angle , 1 + angle ) ) ) ;
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 ) ) ;
}
}
}