|
@@ -35,6 +35,7 @@ module BABYLON {
|
|
|
private _tmpAmmoVectorC: any;
|
|
|
private _tmpContactCallbackResult = false;
|
|
|
|
|
|
+ private static readonly DISABLE_COLLISION_FLAG = 4;
|
|
|
private static readonly KINEMATIC_FLAG = 2;
|
|
|
private static readonly DISABLE_DEACTIVATION_FLAG = 4;
|
|
|
|
|
@@ -240,6 +241,11 @@ module BABYLON {
|
|
|
body.setActivationState(AmmoJSPlugin.DISABLE_DEACTIVATION_FLAG);
|
|
|
}
|
|
|
|
|
|
+ // Disable collision if NoImpostor, but keep collision if shape is btCompoundShape
|
|
|
+ if (impostor.type == BABYLON.PhysicsImpostor.NoImpostor && !colShape.getChildShape) {
|
|
|
+ body.setCollisionFlags(body.getCollisionFlags() | AmmoJSPlugin.DISABLE_COLLISION_FLAG);
|
|
|
+ }
|
|
|
+
|
|
|
body.setRestitution(impostor.getParam("restitution"));
|
|
|
this.world.addRigidBody(body);
|
|
|
impostor.physicsBody = body;
|
|
@@ -362,7 +368,13 @@ module BABYLON {
|
|
|
var childImpostor = childMesh.getPhysicsImpostor();
|
|
|
if (childImpostor) {
|
|
|
var shape = this._createShape(childImpostor);
|
|
|
- this._tmpAmmoTransform.getOrigin().setValue(childMesh.position.x, childMesh.position.y, childMesh.position.z);
|
|
|
+
|
|
|
+ // Position needs to be scaled based on parent's scaling
|
|
|
+ var parentMat = childMesh.parent!.getWorldMatrix().clone();
|
|
|
+ var s = new BABYLON.Vector3();
|
|
|
+ parentMat.decompose(s);
|
|
|
+ this._tmpAmmoTransform.getOrigin().setValue(childMesh.position.x * s.x, childMesh.position.y * s.y, childMesh.position.z * s.z);
|
|
|
+
|
|
|
this._tmpAmmoQuaternion.setValue(childMesh.rotationQuaternion!.x, childMesh.rotationQuaternion!.y, childMesh.rotationQuaternion!.z, childMesh.rotationQuaternion!.w);
|
|
|
this._tmpAmmoTransform.setRotation(this._tmpAmmoQuaternion);
|
|
|
returnValue.addChildShape(this._tmpAmmoTransform, shape);
|
|
@@ -374,7 +386,6 @@ module BABYLON {
|
|
|
var shape = this._createShape(impostor, true);
|
|
|
if (shape) {
|
|
|
this._tmpAmmoTransform.getOrigin().setValue(0, 0, 0);
|
|
|
- //this._tmpAmmoQuaternion = new this.BJSAMMO.btQuaternion(0,0,0,1);
|
|
|
this._tmpAmmoQuaternion.setValue(0, 0, 0, 1);
|
|
|
this._tmpAmmoTransform.setRotation(this._tmpAmmoQuaternion);
|
|
|
|
|
@@ -408,6 +419,10 @@ module BABYLON {
|
|
|
returnValue = new Ammo.btBvhTriangleMeshShape(tetraMesh);
|
|
|
}
|
|
|
break;
|
|
|
+ case PhysicsImpostor.NoImpostor:
|
|
|
+ // Fill with sphere but collision is disabled on the rigid body in generatePhysicsBody, using an empty shape caused unexpected movement with joints
|
|
|
+ returnValue = new Ammo.btSphereShape(extendSize.x / 2);
|
|
|
+ break;
|
|
|
}
|
|
|
|
|
|
return returnValue;
|