- Added a test case for the add kinematic object to physic space to tets with native bullet
- made a workaround in PhysicSpace for non native git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@7369 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
This commit is contained in:
parent
dcf3f3c061
commit
93d0ed73e3
@ -559,7 +559,20 @@ public class PhysicsSpace {
|
||||
|
||||
private void addRigidBody(PhysicsRigidBody node) {
|
||||
physicsNodes.put(node.getObjectId(), node);
|
||||
|
||||
//Workaround
|
||||
//It seems that adding a Kinematic RigidBody to the dynamicWorld prevent it from being non kinematic again afterward.
|
||||
//so we add it non kinematic, then set it kinematic again.
|
||||
boolean kinematic = false;
|
||||
if (node.isKinematic()) {
|
||||
kinematic = true;
|
||||
node.setKinematic(false);
|
||||
}
|
||||
dynamicsWorld.addRigidBody(node.getObjectId());
|
||||
if (kinematic) {
|
||||
node.setKinematic(true);
|
||||
}
|
||||
|
||||
Logger.getLogger(PhysicsSpace.class.getName()).log(Level.INFO, "Adding RigidBody {0} to physics space.", node.getObjectId());
|
||||
if (node instanceof PhysicsVehicle) {
|
||||
Logger.getLogger(PhysicsSpace.class.getName()).log(Level.INFO, "Adding vehicle constraint {0} to physics space.", ((PhysicsVehicle) node).getVehicleId());
|
||||
@ -735,7 +748,6 @@ public class PhysicsSpace {
|
||||
results.add(new PhysicsSweepTestResult(obj, Converter.convert(lcr.hitNormalLocal), lcr.hitFraction, bln));
|
||||
return lcr.hitFraction;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -0,0 +1,80 @@
|
||||
/*
|
||||
* To change this template, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
package jme3test.bullet;
|
||||
|
||||
import com.jme3.app.SimpleApplication;
|
||||
import com.jme3.bullet.BulletAppState;
|
||||
import com.jme3.bullet.PhysicsSpace;
|
||||
import com.jme3.bullet.collision.shapes.MeshCollisionShape;
|
||||
import com.jme3.bullet.collision.shapes.PlaneCollisionShape;
|
||||
import com.jme3.bullet.collision.shapes.SphereCollisionShape;
|
||||
import com.jme3.bullet.control.RigidBodyControl;
|
||||
import com.jme3.math.Plane;
|
||||
import com.jme3.math.Vector3f;
|
||||
import com.jme3.scene.Node;
|
||||
import com.jme3.scene.shape.Sphere;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Nehon
|
||||
*/
|
||||
public class TestKinematicAddToPhysicsSpaceIssue extends SimpleApplication {
|
||||
|
||||
public static void main(String[] args) {
|
||||
TestKinematicAddToPhysicsSpaceIssue app = new TestKinematicAddToPhysicsSpaceIssue();
|
||||
app.start();
|
||||
}
|
||||
BulletAppState bulletAppState;
|
||||
|
||||
@Override
|
||||
public void simpleInitApp() {
|
||||
|
||||
bulletAppState = new BulletAppState();
|
||||
stateManager.attach(bulletAppState);
|
||||
bulletAppState.getPhysicsSpace().enableDebug(assetManager);
|
||||
// Add a physics sphere to the world
|
||||
Node physicsSphere = PhysicsTestHelper.createPhysicsTestNode(assetManager, new SphereCollisionShape(1), 1);
|
||||
physicsSphere.getControl(RigidBodyControl.class).setPhysicsLocation(new Vector3f(3, 6, 0));
|
||||
rootNode.attachChild(physicsSphere);
|
||||
|
||||
//Setting the rigidBody to kinematic before adding it to the physic space
|
||||
physicsSphere.getControl(RigidBodyControl.class).setKinematic(true);
|
||||
//adding it to the physic space
|
||||
getPhysicsSpace().add(physicsSphere);
|
||||
//Making it not kinematic again, it should fall under gravity, it doesn't
|
||||
physicsSphere.getControl(RigidBodyControl.class).setKinematic(false);
|
||||
|
||||
// Add a physics sphere to the world using the collision shape from sphere one
|
||||
Node physicsSphere2 = PhysicsTestHelper.createPhysicsTestNode(assetManager, new SphereCollisionShape(1), 1);
|
||||
physicsSphere2.getControl(RigidBodyControl.class).setPhysicsLocation(new Vector3f(5, 6, 0));
|
||||
rootNode.attachChild(physicsSphere2);
|
||||
|
||||
//Adding the rigid body to physic space
|
||||
getPhysicsSpace().add(physicsSphere2);
|
||||
//making it kinematic
|
||||
physicsSphere2.getControl(RigidBodyControl.class).setKinematic(false);
|
||||
//Making it not kinematic again, it works properly, the rigidbody is affected by grvity.
|
||||
physicsSphere2.getControl(RigidBodyControl.class).setKinematic(false);
|
||||
|
||||
|
||||
|
||||
// an obstacle mesh, does not move (mass=0)
|
||||
Node node2 = PhysicsTestHelper.createPhysicsTestNode(assetManager, new MeshCollisionShape(new Sphere(16, 16, 1.2f)), 0);
|
||||
node2.getControl(RigidBodyControl.class).setPhysicsLocation(new Vector3f(2.5f, -4, 0f));
|
||||
rootNode.attachChild(node2);
|
||||
getPhysicsSpace().add(node2);
|
||||
|
||||
// the floor mesh, does not move (mass=0)
|
||||
Node node3 = PhysicsTestHelper.createPhysicsTestNode(assetManager, new PlaneCollisionShape(new Plane(new Vector3f(0, 1, 0), 0)), 0);
|
||||
node3.getControl(RigidBodyControl.class).setPhysicsLocation(new Vector3f(0f, -6, 0f));
|
||||
rootNode.attachChild(node3);
|
||||
getPhysicsSpace().add(node3);
|
||||
|
||||
}
|
||||
|
||||
private PhysicsSpace getPhysicsSpace() {
|
||||
return bulletAppState.getPhysicsSpace();
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user