Quellcode durchsuchen

- add Tests for physics raytest and sweeptest (thanks to @wezrule)

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@9435 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
nor..67 vor 13 Jahren
Ursprung
Commit
9292ac9898

+ 60 - 0
engine/src/test/jme3test/bullet/TestPhysicsRayCast.java

@@ -0,0 +1,60 @@
+package jme3test.bullet;
+ 
+import com.jme3.app.SimpleApplication;
+import com.jme3.bullet.BulletAppState;
+import com.jme3.bullet.collision.PhysicsCollisionObject;
+import com.jme3.bullet.collision.PhysicsRayTestResult;
+import com.jme3.bullet.collision.shapes.CollisionShape;
+import com.jme3.bullet.control.RigidBodyControl;
+import com.jme3.bullet.util.CollisionShapeFactory;
+import com.jme3.font.BitmapText;
+import com.jme3.scene.Node;
+import com.jme3.scene.Spatial;
+import java.util.List;
+/**
+ *
+ * @author @wezrule
+ */
+public class TestPhysicsRayCast extends SimpleApplication {
+ 
+    private BulletAppState bulletAppState = new BulletAppState();
+ 
+    public static void main(String[] args) {
+        new TestPhysicsRayCast().start();
+    }
+ 
+    @Override
+    public void simpleInitApp() {
+        stateManager.attach(bulletAppState);
+        initCrossHair();
+ 
+        Spatial s = assetManager.loadModel("Models/Elephant/Elephant.mesh.xml");
+        s.setLocalScale(0.1f);
+ 
+        CollisionShape collisionShape = CollisionShapeFactory.createMeshShape(s);
+        Node n = new Node("elephant");
+        n.addControl(new RigidBodyControl(collisionShape, 1));
+        n.getControl(RigidBodyControl.class).setKinematic(true);
+        bulletAppState.getPhysicsSpace().add(n);
+        rootNode.attachChild(n);
+        bulletAppState.getPhysicsSpace().enableDebug(assetManager);
+    }
+ 
+    @Override
+    public void simpleUpdate(float tpf) {
+        List<PhysicsRayTestResult> rayTest = bulletAppState.getPhysicsSpace().rayTest(cam.getLocation(), cam.getLocation().add(cam.getDirection()));
+        if (rayTest.size() > 0) {
+            PhysicsRayTestResult get = rayTest.get(0);
+            PhysicsCollisionObject collisionObject = get.getCollisionObject();
+            //do stuff
+            fpsText.setText(collisionObject.getUserObject().toString());
+        }
+    }
+ 
+    private void initCrossHair() {
+        BitmapText bitmapText = new BitmapText(guiFont);
+        bitmapText.setText("+");
+        bitmapText.setLocalTranslation((settings.getWidth() - bitmapText.getLineWidth())*0.5f, (settings.getHeight() + bitmapText.getLineHeight())*0.5f, 0);
+        guiNode.attachChild(bitmapText);
+    }
+}

+ 71 - 0
engine/src/test/jme3test/bullet/TestSweepTest.java

@@ -0,0 +1,71 @@
+package jme3test.bullet;
+
+import com.jme3.app.SimpleApplication;
+import com.jme3.bullet.BulletAppState;
+import com.jme3.bullet.collision.PhysicsCollisionObject;
+import com.jme3.bullet.collision.PhysicsSweepTestResult;
+import com.jme3.bullet.collision.shapes.CapsuleCollisionShape;
+import com.jme3.bullet.control.RigidBodyControl;
+import com.jme3.math.Transform;
+import com.jme3.scene.Node;
+import java.util.List;
+
+/**
+ *
+ * A spatial moves and sweeps its next movement for obstacles before moving
+ * there Run this example with Vsync enabled
+ *
+ * @author
+ * @wezrule
+ */
+public class TestSweepTest extends SimpleApplication {
+
+    private BulletAppState bulletAppState = new BulletAppState();
+    private CapsuleCollisionShape obstacleCollisionShape = new CapsuleCollisionShape(0.3f, 0.5f);
+    private CapsuleCollisionShape capsuleCollisionShape = new CapsuleCollisionShape(1f, 1f);
+    private Node capsule;
+    private Node obstacle;
+    private float dist = .5f;
+
+    public static void main(String[] args) {
+        new TestSweepTest().start();
+    }
+
+    @Override
+    public void simpleInitApp() {
+        stateManager.attach(bulletAppState);
+
+        capsule = new Node("capsule");
+        capsule.addControl(new RigidBodyControl(capsuleCollisionShape, 1));
+        capsule.getControl(RigidBodyControl.class).setKinematic(true);
+        capsule.move(-2, 0, 0);
+        bulletAppState.getPhysicsSpace().add(capsule);
+        rootNode.attachChild(capsule);
+
+        obstacle = new Node("obstacle");
+        RigidBodyControl bodyControl = new RigidBodyControl(obstacleCollisionShape, 0);
+        obstacle.move(2, 0, 0);
+        obstacle.addControl(bodyControl);
+        bulletAppState.getPhysicsSpace().add(obstacle);
+        rootNode.attachChild(obstacle);
+
+        bulletAppState.getPhysicsSpace().enableDebug(assetManager);
+    }
+
+    @Override
+    public void simpleUpdate(float tpf) {
+
+        float move = tpf * 1;
+
+        List<PhysicsSweepTestResult> sweepTest = bulletAppState.getPhysicsSpace().sweepTest(capsuleCollisionShape, new Transform(capsule.getWorldTranslation()), new Transform(capsule.getWorldTranslation().add(dist, 0, 0)));
+
+        if (sweepTest.size() > 0) {
+            PhysicsSweepTestResult get = sweepTest.get(0);
+            PhysicsCollisionObject collisionObject = get.getCollisionObject();
+            fpsText.setText("Almost colliding with " + collisionObject.getUserObject().toString());
+        } else {
+            // if the sweep is clear then move the spatial
+            capsule.move(move, 0, 0);
+        }
+    }
+}