- 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
This commit is contained in:
parent
33a69d4536
commit
9292ac9898
60
engine/src/test/jme3test/bullet/TestPhysicsRayCast.java
Normal file
60
engine/src/test/jme3test/bullet/TestPhysicsRayCast.java
Normal file
@ -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
engine/src/test/jme3test/bullet/TestSweepTest.java
Normal file
71
engine/src/test/jme3test/bullet/TestSweepTest.java
Normal file
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user