internal override bool _BuildCollisionObject() { BPhysicsWorld world = BPhysicsWorld.Get(); if (m_collisionObject != null) { if (isInWorld && world != null) { world.RemoveCollisionObject(this); } } if (transform.localScale != UnityEngine.Vector3.one) { Debug.LogError("The local scale on this collision shape is not one. Bullet physics does not support scaling on a rigid body world transform. Instead alter the dimensions of the CollisionShape."); } m_collisionShape = GetComponent <BCollisionShape>(); if (m_collisionShape == null) { Debug.LogError("There was no collision shape component attached to this BRigidBody. " + name); return(false); } CollisionShape cs = m_collisionShape.GetCollisionShape(); //rigidbody is dynamic if and only if mass is non zero, otherwise static if (m_collisionObject == null) { m_collisionObject = new BulletSharp.PairCachingGhostObject(); m_collisionObject.CollisionShape = cs; BulletSharp.Math.Matrix worldTrans; BulletSharp.Math.Quaternion q = transform.rotation.ToBullet(); BulletSharp.Math.Matrix.RotationQuaternion(ref q, out worldTrans); worldTrans.Origin = transform.position.ToBullet(); m_collisionObject.WorldTransform = worldTrans; m_collisionObject.UserObject = this; m_collisionObject.CollisionFlags = m_collisionObject.CollisionFlags | BulletSharp.CollisionFlags.KinematicObject; m_collisionObject.CollisionFlags &= ~BulletSharp.CollisionFlags.StaticObject; } else { BulletSharp.Math.Matrix worldTrans; BulletSharp.Math.Quaternion q = transform.rotation.ToBullet(); BulletSharp.Math.Matrix.RotationQuaternion(ref q, out worldTrans); worldTrans.Origin = transform.position.ToBullet(); m_collisionObject.WorldTransform = worldTrans; m_collisionObject.CollisionShape = cs; m_collisionObject.CollisionFlags = m_collisionObject.CollisionFlags | BulletSharp.CollisionFlags.KinematicObject; m_collisionObject.CollisionFlags &= ~BulletSharp.CollisionFlags.StaticObject; } return(true); }
//called by Physics World just before rigid body is added to world. //the current rigid body properties are used to rebuild the rigid body. internal override bool _BuildCollisionObject() { if (td == null) { Debug.LogError("Must be attached to an object with a terrain "); return(false); } BPhysicsWorld world = BPhysicsWorld.Get(); if (m_collisionObject != null) { if (isInWorld && world != null) { isInWorld = false; world.RemoveCollisionObject(m_collisionObject); } } if (transform.localScale != UnityEngine.Vector3.one) { Debug.LogError("The local scale on this collision shape is not one. Bullet physics does not support scaling on a rigid body world transform. Instead alter the dimensions of the CollisionShape."); } m_collisionShape = GetComponent <BCollisionShape>(); if (m_collisionShape == null) { Debug.LogError("There was no collision shape component attached to this BRigidBody. " + name); return(false); } if (!(m_collisionShape is BHeightfieldTerrainShape)) { Debug.LogError("The collision shape needs to be a BHeightfieldTerrainShape. " + name); return(false); } CollisionShape cs = m_collisionShape.GetCollisionShape(); //rigidbody is dynamic if and only if mass is non zero, otherwise static if (m_collisionObject == null) { m_collisionObject = new CollisionObject(); m_collisionObject.CollisionShape = cs; m_collisionObject.UserObject = this; BulletSharp.Math.Matrix worldTrans = BulletSharp.Math.Matrix.Identity; Vector3 pos = transform.position + new Vector3(td.size.x * .5f, td.size.y * .5f, td.size.z * .5f); worldTrans.Origin = pos.ToBullet(); m_collisionObject.WorldTransform = worldTrans; m_collisionObject.CollisionFlags = m_collisionFlags; } else { m_collisionObject.CollisionShape = cs; BulletSharp.Math.Matrix worldTrans = BulletSharp.Math.Matrix.Identity; Vector3 pos = transform.position + new Vector3(td.size.x * .5f, td.size.y * .5f, td.size.z * .5f); worldTrans.Origin = pos.ToBullet(); m_collisionObject.WorldTransform = worldTrans; m_collisionObject.CollisionFlags = m_collisionFlags; } return(true); }
internal override bool _BuildCollisionObject() { BPhysicsWorld world = BPhysicsWorld.Get(); if (m_collisionObject != null) { if (isInWorld && world != null) { isInWorld = false; world.RemoveCollisionObject(this); } } if (transform.localScale != UnityEngine.Vector3.one) { Debug.LogError("The local scale on this collision shape is not one. Bullet physics does not support scaling on a rigid body world transform. Instead alter the dimensions of the CollisionShape."); } m_collisionShape = GetComponent <BCollisionShape>(); if (m_collisionShape == null) { Debug.LogError("There was no collision shape component attached to this BRigidBody. " + name); return(false); } if (!(m_collisionShape.GetCollisionShape() is ConvexShape)) { Debug.LogError("The CollisionShape on this BCharacterController was not a convex shape. " + name); return(false); } m_collisionShape.GetCollisionShape(); if (m_collisionObject == null) { m_collisionObject = new PairCachingGhostObject(); m_collisionObject.CollisionShape = m_collisionShape.GetCollisionShape(); m_collisionObject.CollisionFlags = m_collisionFlags; m_characterController = new KinematicCharacterController((PairCachingGhostObject)m_collisionObject, (ConvexShape)m_collisionShape.GetCollisionShape(), stepHeight, upAxis); BulletSharp.Math.Matrix worldTrans; BulletSharp.Math.Quaternion q = transform.rotation.ToBullet(); BulletSharp.Math.Matrix.RotationQuaternion(ref q, out worldTrans); worldTrans.Origin = transform.position.ToBullet(); m_collisionObject.WorldTransform = worldTrans; m_collisionObject.UserObject = this; //world.world.AddCollisionObject(m_collisionObject, CollisionFilterGroups.CharacterFilter, CollisionFilterGroups.StaticFilter | CollisionFilterGroups.DefaultFilter); //((DynamicsWorld)world.world).AddAction(m_characterController); } else { m_collisionObject.CollisionShape = m_collisionShape.GetCollisionShape(); m_collisionObject.CollisionFlags = m_collisionFlags; if (m_characterController != null) { world.RemoveAction(m_characterController); } m_characterController = new KinematicCharacterController((PairCachingGhostObject)m_collisionObject, (ConvexShape)m_collisionShape.GetCollisionShape(), stepHeight, upAxis); BulletSharp.Math.Matrix worldTrans; BulletSharp.Math.Quaternion q = transform.rotation.ToBullet(); BulletSharp.Math.Matrix.RotationQuaternion(ref q, out worldTrans); worldTrans.Origin = transform.position.ToBullet(); m_collisionObject.WorldTransform = worldTrans; m_collisionObject.UserObject = this; } return(true); }