Lolilol the ragdoll
git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@7185 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
This commit is contained in:
parent
c6a3a78b1e
commit
0a82e1ee11
@ -6,6 +6,10 @@ import com.jme3.animation.Skeleton;
|
||||
import com.jme3.animation.SkeletonControl;
|
||||
import com.jme3.asset.AssetManager;
|
||||
import com.jme3.bullet.PhysicsSpace;
|
||||
import com.jme3.bullet.collision.PhysicsCollisionEvent;
|
||||
import com.jme3.bullet.collision.PhysicsCollisionGroupListener;
|
||||
import com.jme3.bullet.collision.PhysicsCollisionListener;
|
||||
import com.jme3.bullet.collision.PhysicsCollisionObject;
|
||||
import com.jme3.bullet.collision.shapes.BoxCollisionShape;
|
||||
import com.jme3.bullet.collision.shapes.HullCollisionShape;
|
||||
import com.jme3.bullet.joints.ConeJoint;
|
||||
@ -36,7 +40,7 @@ import java.util.List;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
public class RagdollControl implements PhysicsControl {
|
||||
public class RagdollControl implements PhysicsControl, PhysicsCollisionListener {
|
||||
|
||||
protected static final Logger logger = Logger.getLogger(RagdollControl.class.getName());
|
||||
protected List<PhysicsBoneLink> boneLinks = new LinkedList<PhysicsBoneLink>();
|
||||
@ -51,6 +55,7 @@ public class RagdollControl implements PhysicsControl {
|
||||
protected Vector3f initPosition;
|
||||
protected Quaternion initRotation;
|
||||
protected Vector3f initScale;
|
||||
protected boolean control = false;
|
||||
|
||||
//Normen: Think you have the system you want, with movement
|
||||
//Normen: but the rootBone movement and translation is also accessible like getRootBoneLocation()
|
||||
@ -73,9 +78,10 @@ public class RagdollControl implements PhysicsControl {
|
||||
if (!enabled) {
|
||||
return;
|
||||
}
|
||||
|
||||
TempVars vars = TempVars.get();
|
||||
assert vars.lock();
|
||||
if (control) {
|
||||
|
||||
Quaternion q2 = vars.quat1;
|
||||
// skeleton.reset();
|
||||
for (PhysicsBoneLink link : boneLinks) {
|
||||
@ -94,10 +100,23 @@ public class RagdollControl implements PhysicsControl {
|
||||
link.bone.setUserTransformsWorld(p, q2);
|
||||
|
||||
}
|
||||
}else{
|
||||
for (PhysicsBoneLink link : boneLinks) {
|
||||
|
||||
Vector3f position = vars.vect1;
|
||||
Quaternion rotation = vars.quat1;
|
||||
Vector3f scale= vars.vect2;
|
||||
|
||||
position.set(link.bone.getModelSpacePosition());
|
||||
rotation.set(link.bone.getModelSpaceRotation()).multLocal(link.bone.getWorldBindInverseRotation());
|
||||
scale.set(link.bone.getModelSpaceScale());
|
||||
link.rigidBody.setPhysicsLocation(position);
|
||||
link.rigidBody.setPhysicsRotation(rotation);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
assert vars.unlock();
|
||||
|
||||
//baseRigidBody.getMotionState().applyTransform(targetModel);
|
||||
|
||||
}
|
||||
@ -173,6 +192,7 @@ public class RagdollControl implements PhysicsControl {
|
||||
//creating the collision shape from the bone's associated vertices
|
||||
PhysicsRigidBody shapeNode = new PhysicsRigidBody(makeShape(bone, model), 10.0f / (float) reccount);
|
||||
shapeNode.setPhysicsLocation(pos);
|
||||
|
||||
// shapeNode.setPhysicsRotation(rot);
|
||||
|
||||
PhysicsBoneLink link = new PhysicsBoneLink();
|
||||
@ -369,6 +389,7 @@ public class RagdollControl implements PhysicsControl {
|
||||
this.space = space;
|
||||
addToPhysicsSpace();
|
||||
}
|
||||
this.space.addCollisionListener(this);
|
||||
}
|
||||
|
||||
public PhysicsSpace getPhysicsSpace() {
|
||||
@ -383,6 +404,62 @@ public class RagdollControl implements PhysicsControl {
|
||||
throw new UnsupportedOperationException("Not supported yet.");
|
||||
}
|
||||
|
||||
public void collision(PhysicsCollisionEvent event) {
|
||||
PhysicsCollisionObject objA = event.getObjectA();
|
||||
PhysicsCollisionObject objB = event.getObjectB();
|
||||
// System.out.println("----------------------------");
|
||||
// System.out.println("NodeA "+event.getNodeA());
|
||||
// System.out.println("NodeB "+event.getNodeB());
|
||||
if (event == null) {
|
||||
return;
|
||||
}
|
||||
if (event.getNodeA() != null && "Floor".equals(event.getNodeA().getName())) {
|
||||
return;
|
||||
}
|
||||
if (event.getNodeB() != null && "Floor".equals(event.getNodeB().getName())) {
|
||||
return;
|
||||
}
|
||||
// if(event.getNodeB() == null && event.getNodeA() ==null){
|
||||
// return;
|
||||
// }
|
||||
if (event.getAppliedImpulse() < 3.0) {
|
||||
return;
|
||||
}
|
||||
|
||||
boolean hit = false;
|
||||
|
||||
|
||||
|
||||
if (objA instanceof PhysicsRigidBody) {
|
||||
PhysicsRigidBody prb = (PhysicsRigidBody) objA;
|
||||
for (PhysicsBoneLink physicsBoneLink : boneLinks) {
|
||||
if (physicsBoneLink.rigidBody == prb) {
|
||||
hit = true;
|
||||
// System.out.println("objA " + physicsBoneLink.bone.getName() + " " + event.getAppliedImpulse() + " " + event.getAppliedImpulseLateral1() + " " + event.getAppliedImpulseLateral2());
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
if (objB instanceof PhysicsRigidBody) {
|
||||
PhysicsRigidBody prb = (PhysicsRigidBody) objB;
|
||||
for (PhysicsBoneLink physicsBoneLink : boneLinks) {
|
||||
if (physicsBoneLink.rigidBody == prb) {
|
||||
hit = false;
|
||||
// System.out.println("objB " + physicsBoneLink.bone.getName() + " " + event.getAppliedImpulse() + " " + event.getAppliedImpulseLateral1() + " " + event.getAppliedImpulseLateral2());
|
||||
}
|
||||
}
|
||||
}
|
||||
if (hit && event.getAppliedImpulse() > 10.0) {
|
||||
control = true;
|
||||
}
|
||||
|
||||
// System.out.println("----------------------------");
|
||||
}
|
||||
|
||||
public boolean collide(PhysicsCollisionObject nodeA, PhysicsCollisionObject nodeB) {
|
||||
throw new UnsupportedOperationException("Not supported yet.");
|
||||
}
|
||||
|
||||
protected static class PhysicsBoneLink {
|
||||
|
||||
Bone bone;
|
||||
|
@ -79,10 +79,15 @@ public class TestBoneRagdoll extends SimpleApplication {
|
||||
public void simpleInitApp() {
|
||||
initCrossHairs();
|
||||
initMaterial();
|
||||
|
||||
cam.setLocation(new Vector3f(0.26924422f, 6.646658f, 22.265987f));
|
||||
cam.setRotation(new Quaternion(-2.302544E-4f, 0.99302495f, -0.117888905f, -0.0019395084f));
|
||||
|
||||
|
||||
bulletAppState = new BulletAppState();
|
||||
bulletAppState.setEnabled(false);
|
||||
bulletAppState.setEnabled(true);
|
||||
stateManager.attach(bulletAppState);
|
||||
bulletAppState.getPhysicsSpace().enableDebug(assetManager);
|
||||
// bulletAppState.getPhysicsSpace().enableDebug(assetManager);
|
||||
PhysicsTestHelper.createPhysicsTestWorld(rootNode, assetManager, bulletAppState.getPhysicsSpace());
|
||||
setupLight();
|
||||
|
||||
@ -98,7 +103,7 @@ public class TestBoneRagdoll extends SimpleApplication {
|
||||
mat2.getAdditionalRenderState().setDepthTest(false);
|
||||
skeletonDebug.setMaterial(mat2);
|
||||
skeletonDebug.setLocalTranslation(model.getLocalTranslation());
|
||||
control.createChannel().setAnim("Dodge");
|
||||
control.createChannel().setAnim("Walk");
|
||||
|
||||
//Note: PhysicsRagdollControl is still TODO, constructor will change
|
||||
RagdollControl ragdoll = new RagdollControl();
|
||||
@ -115,10 +120,11 @@ public class TestBoneRagdoll extends SimpleApplication {
|
||||
|
||||
rootNode.attachChild(model);
|
||||
rootNode.attachChild(skeletonDebug);
|
||||
flyCam.setEnabled(false);
|
||||
// flyCam.setMoveSpeed(10);
|
||||
ChaseCamera chaseCamera=new ChaseCamera(cam, inputManager);
|
||||
model.addControl(chaseCamera);
|
||||
// flyCam.setEnabled(false);
|
||||
flyCam.setMoveSpeed(50);
|
||||
// ChaseCamera chaseCamera=new ChaseCamera(cam, inputManager);
|
||||
// chaseCamera.setLookAtOffset(Vector3f.UNIT_Y.mult(4));
|
||||
// model.addControl(chaseCamera);
|
||||
|
||||
inputManager.addListener(new ActionListener() {
|
||||
|
||||
@ -130,9 +136,9 @@ public class TestBoneRagdoll extends SimpleApplication {
|
||||
Geometry bulletg = new Geometry("bullet", bullet);
|
||||
bulletg.setMaterial(matBullet);
|
||||
bulletg.setLocalTranslation(cam.getLocation());
|
||||
RigidBodyControl bulletNode = new BombControl(assetManager, bulletCollisionShape, 1);
|
||||
// RigidBodyControl bulletNode = new RigidBodyControl(bulletCollisionShape, 1);
|
||||
bulletNode.setLinearVelocity(cam.getDirection().mult(60));
|
||||
// RigidBodyControl bulletNode = new BombControl(assetManager, bulletCollisionShape, 1);
|
||||
RigidBodyControl bulletNode = new RigidBodyControl(bulletCollisionShape, 20);
|
||||
bulletNode.setLinearVelocity(cam.getDirection().mult(80));
|
||||
bulletg.addControl(bulletNode);
|
||||
rootNode.attachChild(bulletg);
|
||||
getPhysicsSpace().add(bulletNode);
|
||||
|
Loading…
x
Reference in New Issue
Block a user