From 2a0fa2554a68afadffcad032bafbe660ca1686de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me?= Date: Tue, 7 Apr 2020 14:29:36 +0200 Subject: [PATCH] Migrate TestOgreComplexAnim to new anim system Lots of code that did nothing in old test (on feet, hand). Only eft hand anim with the bone anim in simpleUpdate works. So I rework the test to do how actionSquence work and manipulate Armature and Joint with ArmatureMask apply. So I think there is a bug in ArmatureDebugger when apply PointSize in material. In the render view all points on armature debug have same size. --- .../model/anim/TestOgreComplexAnim.java | 187 +++++++++--------- 1 file changed, 92 insertions(+), 95 deletions(-) diff --git a/jme3-examples/src/main/java/jme3test/model/anim/TestOgreComplexAnim.java b/jme3-examples/src/main/java/jme3test/model/anim/TestOgreComplexAnim.java index e83fa7a6b..aaeecd0ec 100644 --- a/jme3-examples/src/main/java/jme3test/model/anim/TestOgreComplexAnim.java +++ b/jme3-examples/src/main/java/jme3test/model/anim/TestOgreComplexAnim.java @@ -32,107 +32,104 @@ 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 float angle = 0; - private float scale = 1; - private float rate = 1; - - public static void main(String[] args) { - TestOgreComplexAnim app = new TestOgreComplexAnim(); - app.start(); - } - - @Override - public void simpleInitApp() { - flyCam.setMoveSpeed(10f); - cam.setLocation(new Vector3f(6.4013605f, 7.488437f, 12.843031f)); - cam.setRotation(new Quaternion(-0.060740203f, 0.93925786f, -0.2398315f, -0.2378785f)); - - DirectionalLight dl = new DirectionalLight(); - dl.setDirection(new Vector3f(-0.1f, -0.7f, -1).normalizeLocal()); - 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); - - AnimChannel feet = control.createChannel(); - AnimChannel leftHand = control.createChannel(); - AnimChannel rightHand = control.createChannel(); - - // feet will dodge - feet.addFromRootBone("hip.right"); - feet.addFromRootBone("hip.left"); - feet.setAnim("Dodge"); - feet.setSpeed(2); - feet.setLoopMode(LoopMode.Cycle); - - // will blend over 15 seconds to stand - feet.setAnim("Walk", 15); - feet.setSpeed(0.25f); - feet.setLoopMode(LoopMode.Cycle); - - // left hand will pull - leftHand.addFromRootBone("uparm.right"); - leftHand.setAnim("pull"); - leftHand.setSpeed(.5f); - - // will blend over 15 seconds to stand - leftHand.setAnim("stand", 15); - - // 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.getAdditionalRenderState().setDepthTest(false); - skeletonDebug.setMaterial(mat); - - model.attachChild(skeletonDebug); - rootNode.attachChild(model); - } - - @Override - public void simpleUpdate(float tpf){ - Bone b = control.getSkeleton().getBone("spinehigh"); - Bone b2 = control.getSkeleton().getBone("uparm.left"); - - angle += tpf * rate; - if (angle > FastMath.HALF_PI / 2f){ - angle = FastMath.HALF_PI / 2f; - rate = -1; - }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)); - - - } + private SkinningControl skinningControl; + + private float angle = 0; + private float rate = 1; + + public static void main(String[] args) { + TestOgreComplexAnim app = new TestOgreComplexAnim(); + app.start(); + } + + @Override + public void simpleInitApp() { + flyCam.setMoveSpeed(10f); + cam.setLocation(new Vector3f(6.4013605f, 7.488437f, 12.843031f)); + cam.setRotation(new Quaternion(-0.060740203f, 0.93925786f, -0.2398315f, -0.2378785f)); + + DirectionalLight dl = new DirectionalLight(); + dl.setDirection(new Vector3f(-0.1f, -0.7f, -1).normalizeLocal()); + dl.setColor(new ColorRGBA(1f, 1f, 1f, 1.0f)); + rootNode.addLight(dl); + + Node model = (Node) assetManager.loadModel("Models/Oto/Oto.mesh.xml"); + + skinningControl = model.getControl(SkinningControl.class); + AnimComposer ac = model.getControl(AnimComposer.class); + + 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); + + 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); + + ac.actionSequence("complexAction", + ac.actionSequence("feetAction", dodgeAction, walkAction), + ac.actionSequence("rightHandAction", pullAction, standAction)); + + ac.setCurrentAction("complexAction"); + + Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); + mat.getAdditionalRenderState().setWireframe(true); + mat.setColor("Color", ColorRGBA.Green); + mat.setFloat("PointSize", 7f); // Bug ? do not change size of debug points ? + mat.getAdditionalRenderState().setDepthTest(false); + + 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) { + Joint j = skinningControl.getArmature().getJoint("spinehigh"); + Joint j2 = skinningControl.getArmature().getJoint("uparm.left"); + + angle += tpf * rate; + if (angle > FastMath.HALF_PI / 2f) { + angle = FastMath.HALF_PI / 2f; + rate = -1; + } else if (angle < -FastMath.HALF_PI / 2f) { + angle = -FastMath.HALF_PI / 2f; + rate = 1; + } + + Quaternion q = new Quaternion(); + q.fromAngles(0, angle, 0); + + j.setLocalRotation(j.getInitialTransform().getRotation().mult(q)); + j2.setLocalScale(j.getInitialTransform().getScale().mult(new Vector3f(1 + angle, 1 + angle, 1 + angle))); + } }