• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * To change this template, choose Tools | Templates
3  * and open the template in the editor.
4  */
5 package jme3test.bullet;
6 
7 import com.jme3.app.SimpleApplication;
8 import com.jme3.bullet.BulletAppState;
9 import com.jme3.bullet.PhysicsSpace;
10 import com.jme3.bullet.collision.shapes.CapsuleCollisionShape;
11 import com.jme3.bullet.control.RigidBodyControl;
12 import com.jme3.bullet.joints.ConeJoint;
13 import com.jme3.bullet.joints.PhysicsJoint;
14 import com.jme3.input.controls.ActionListener;
15 import com.jme3.input.controls.MouseButtonTrigger;
16 import com.jme3.math.Vector3f;
17 import com.jme3.scene.Node;
18 
19 /**
20  *
21  * @author normenhansen
22  */
23 public class TestRagDoll extends SimpleApplication implements ActionListener {
24 
25     private BulletAppState bulletAppState = new BulletAppState();
26     private Node ragDoll = new Node();
27     private Node shoulders;
28     private Vector3f upforce = new Vector3f(0, 200, 0);
29     private boolean applyForce = false;
30 
main(String[] args)31     public static void main(String[] args) {
32         TestRagDoll app = new TestRagDoll();
33         app.start();
34     }
35 
36     @Override
simpleInitApp()37     public void simpleInitApp() {
38         bulletAppState = new BulletAppState();
39         stateManager.attach(bulletAppState);
40         bulletAppState.getPhysicsSpace().enableDebug(assetManager);
41         inputManager.addMapping("Pull ragdoll up", new MouseButtonTrigger(0));
42         inputManager.addListener(this, "Pull ragdoll up");
43         PhysicsTestHelper.createPhysicsTestWorld(rootNode, assetManager, bulletAppState.getPhysicsSpace());
44         createRagDoll();
45     }
46 
createRagDoll()47     private void createRagDoll() {
48         shoulders = createLimb(0.2f, 1.0f, new Vector3f(0.00f, 1.5f, 0), true);
49         Node uArmL = createLimb(0.2f, 0.5f, new Vector3f(-0.75f, 0.8f, 0), false);
50         Node uArmR = createLimb(0.2f, 0.5f, new Vector3f(0.75f, 0.8f, 0), false);
51         Node lArmL = createLimb(0.2f, 0.5f, new Vector3f(-0.75f, -0.2f, 0), false);
52         Node lArmR = createLimb(0.2f, 0.5f, new Vector3f(0.75f, -0.2f, 0), false);
53         Node body = createLimb(0.2f, 1.0f, new Vector3f(0.00f, 0.5f, 0), false);
54         Node hips = createLimb(0.2f, 0.5f, new Vector3f(0.00f, -0.5f, 0), true);
55         Node uLegL = createLimb(0.2f, 0.5f, new Vector3f(-0.25f, -1.2f, 0), false);
56         Node uLegR = createLimb(0.2f, 0.5f, new Vector3f(0.25f, -1.2f, 0), false);
57         Node lLegL = createLimb(0.2f, 0.5f, new Vector3f(-0.25f, -2.2f, 0), false);
58         Node lLegR = createLimb(0.2f, 0.5f, new Vector3f(0.25f, -2.2f, 0), false);
59 
60         join(body, shoulders, new Vector3f(0f, 1.4f, 0));
61         join(body, hips, new Vector3f(0f, -0.5f, 0));
62 
63         join(uArmL, shoulders, new Vector3f(-0.75f, 1.4f, 0));
64         join(uArmR, shoulders, new Vector3f(0.75f, 1.4f, 0));
65         join(uArmL, lArmL, new Vector3f(-0.75f, .4f, 0));
66         join(uArmR, lArmR, new Vector3f(0.75f, .4f, 0));
67 
68         join(uLegL, hips, new Vector3f(-.25f, -0.5f, 0));
69         join(uLegR, hips, new Vector3f(.25f, -0.5f, 0));
70         join(uLegL, lLegL, new Vector3f(-.25f, -1.7f, 0));
71         join(uLegR, lLegR, new Vector3f(.25f, -1.7f, 0));
72 
73         ragDoll.attachChild(shoulders);
74         ragDoll.attachChild(body);
75         ragDoll.attachChild(hips);
76         ragDoll.attachChild(uArmL);
77         ragDoll.attachChild(uArmR);
78         ragDoll.attachChild(lArmL);
79         ragDoll.attachChild(lArmR);
80         ragDoll.attachChild(uLegL);
81         ragDoll.attachChild(uLegR);
82         ragDoll.attachChild(lLegL);
83         ragDoll.attachChild(lLegR);
84 
85         rootNode.attachChild(ragDoll);
86         bulletAppState.getPhysicsSpace().addAll(ragDoll);
87     }
88 
createLimb(float width, float height, Vector3f location, boolean rotate)89     private Node createLimb(float width, float height, Vector3f location, boolean rotate) {
90         int axis = rotate ? PhysicsSpace.AXIS_X : PhysicsSpace.AXIS_Y;
91         CapsuleCollisionShape shape = new CapsuleCollisionShape(width, height, axis);
92         Node node = new Node("Limb");
93         RigidBodyControl rigidBodyControl = new RigidBodyControl(shape, 1);
94         node.setLocalTranslation(location);
95         node.addControl(rigidBodyControl);
96         return node;
97     }
98 
join(Node A, Node B, Vector3f connectionPoint)99     private PhysicsJoint join(Node A, Node B, Vector3f connectionPoint) {
100         Vector3f pivotA = A.worldToLocal(connectionPoint, new Vector3f());
101         Vector3f pivotB = B.worldToLocal(connectionPoint, new Vector3f());
102         ConeJoint joint = new ConeJoint(A.getControl(RigidBodyControl.class), B.getControl(RigidBodyControl.class), pivotA, pivotB);
103         joint.setLimit(1f, 1f, 0);
104         return joint;
105     }
106 
onAction(String string, boolean bln, float tpf)107     public void onAction(String string, boolean bln, float tpf) {
108         if ("Pull ragdoll up".equals(string)) {
109             if (bln) {
110                 shoulders.getControl(RigidBodyControl.class).activate();
111                 applyForce = true;
112             } else {
113                 applyForce = false;
114             }
115         }
116     }
117 
118     @Override
simpleUpdate(float tpf)119     public void simpleUpdate(float tpf) {
120         if (applyForce) {
121             shoulders.getControl(RigidBodyControl.class).applyForce(upforce, Vector3f.ZERO);
122         }
123     }
124 }
125