//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() { BPhysicsWorld world = BPhysicsWorld.Get; if (m_collisionObject != null) { if (isInWorld && world != null) { isInWorld = false; world.RemoveCollisionObject(this); } } m_collisionShape = this.GetParent <Unit>().GetComponent <BCollisionShape>().baseBCollisionShape;//这里将不能用mono的方式获取,就直接赋值了! if (m_collisionShape == null) { Log.Warning("There was no collision shape component attached to this BRigidBody. "); return(false); } if (!(m_collisionShape is BConvexHullShape))//这里是直接参考了BTerrainCollisionObject { Log.Warning("The collision shape needs to be a BHeightfieldTerrainShape. "); return(false); } CollisionShape cs = this.GetParent <Unit>().GetComponent <BCollisionShape>().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 = this.GetParent<Unit>().Position + new Vector3(td.size.x * .5f, td.size.y * .5f, td.size.z * .5f); Vector3 pos = this.GetParent <Unit>().Position; 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 = this.GetParent<Unit>().Position + new Vector3(td.size.x * .5f, td.size.y * .5f, td.size.z * .5f); Vector3 pos = this.GetParent <Unit>().Position; worldTrans.Origin = pos.ToBullet(); m_collisionObject.WorldTransform = worldTrans; m_collisionObject.CollisionFlags = m_collisionFlags; } return(true); }
protected virtual void Dispose(bool isdisposing) { if (isInWorld && isdisposing && m_collisionObject != null) { BPhysicsWorld pw = BPhysicsWorld.Get; if (pw != null && pw.world != null) { ((DiscreteDynamicsWorld)pw.world).RemoveCollisionObject(m_collisionObject); } } if (m_collisionObject != null) { m_collisionObject.Dispose(); m_collisionObject = null; } }
internal override bool _BuildCollisionObject() { BPhysicsWorld world = BPhysicsWorld.Get; if (m_collisionObject != null) { if (isInWorld && world != null) { world.RemoveCollisionObject(this); } } m_collisionShape = this.GetParent <Unit>().GetComponent <BCollisionShape>(); if (m_collisionShape == null) { Log.Warning("There was no collision shape component attached to this BRigidBody. "); 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.GhostObject(); m_collisionObject.CollisionShape = cs; BulletSharp.Math.Matrix worldTrans; BulletSharp.Math.Quaternion q = this.GetParent <Unit>().Quaternion.ToBullet(); BulletSharp.Math.Matrix.RotationQuaternion(ref q, out worldTrans); worldTrans.Origin = this.GetParent <Unit>().Position.ToBullet(); m_collisionObject.WorldTransform = worldTrans; m_collisionObject.UserObject = this; m_collisionObject.CollisionFlags = m_collisionObject.CollisionFlags | BulletSharp.CollisionFlags.NoContactResponse; } else { BulletSharp.Math.Matrix worldTrans; BulletSharp.Math.Quaternion q = this.GetParent <Unit>().Quaternion.ToBullet(); BulletSharp.Math.Matrix.RotationQuaternion(ref q, out worldTrans); worldTrans.Origin = this.GetParent <Unit>().Position.ToBullet(); m_collisionObject.WorldTransform = worldTrans; m_collisionObject.CollisionShape = cs; m_collisionObject.CollisionFlags = m_collisionObject.CollisionFlags | BulletSharp.CollisionFlags.NoContactResponse; } return(true); }
public void Update() { setrefresh++; if (setrefresh % 10 == 0) { BulletSharp.Math.Vector3 fromP = this.GetParent <Unit>().Position.ToBullet(); BulletSharp.Math.Vector3 toP = (this.GetParent <Unit>().Position + Vector3.down * 10f).ToBullet(); ClosestRayResultCallback callback = new ClosestRayResultCallback(ref fromP, ref toP); BPhysicsWorld world = BPhysicsWorld.Get; world.world.RayTest(fromP, toP, callback); if (callback.HasHit && callback.CollisionObject.UserObject is Unit unit) { Log.Debug("fromp=" + fromP + "||top=" + toP); Log.Debug("Hit p" + callback.HitPointWorld + "N=" + callback.HitNormalWorld + "obj=" + callback.CollisionObject.UserObject); Unit x = unit; } if (setrefresh > 10000) { setrefresh = 0; } } }
//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) // { // Log.Warning("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(this); } } // if (transform.localScale != UnityEngine.Vector3.one) // { // Log.Warning("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 = this.GetParent <Unit>().GetComponent <BCollisionShape>();//这里将不能用mono的方式获取,就直接赋值了! if (m_collisionShape == null) { Log.Warning("There was no collision shape component attached to this BRigidBody. "); return(false); } // if (!(m_collisionShape is BHeightfieldTerrainShape)) // { // Log.Warning("The collision shape needs to be a BHeightfieldTerrainShape. "); // 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 = this.GetParent<Unit>().Position + new Vector3(td.size.x * .5f, td.size.y * .5f, td.size.z * .5f); Vector3 pos = this.GetParent <Unit>().Position; 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 = this.GetParent<Unit>().Position + new Vector3(td.size.x * .5f, td.size.y * .5f, td.size.z * .5f); Vector3 pos = this.GetParent <Unit>().Position; worldTrans.Origin = pos.ToBullet(); m_collisionObject.WorldTransform = worldTrans; m_collisionObject.CollisionFlags = m_collisionFlags; } return(true); }
protected void Dispose(bool disposing) { if (lateUpdateHelper != null) { lateUpdateHelper.m_ddWorld = null; lateUpdateHelper.m_world = null; } if (m_world != null) { //remove/dispose constraints int i; if (_ddWorld != null) { for (i = _ddWorld.NumConstraints - 1; i >= 0; i--) { TypedConstraint constraint = _ddWorld.GetConstraint(i); _ddWorld.RemoveConstraint(constraint); if (constraint.Userobject is BTypedConstraint) { ((BTypedConstraint)constraint.Userobject).m_isInWorld = false; } constraint.Dispose(); } } //remove the rigidbodies from the dynamics world and delete them for (i = m_world.NumCollisionObjects - 1; i >= 0; i--) { CollisionObject obj = m_world.CollisionObjectArray[i]; RigidBody body = obj as RigidBody; if (body != null && body.MotionState != null) { Debug.Assert(body.NumConstraintRefs == 0, "Rigid body still had constraints"); body.MotionState.Dispose(); } m_world.RemoveCollisionObject(obj); if (obj.UserObject is BCollisionObject) { ((BCollisionObject)obj.UserObject).isInWorld = false; } obj.Dispose(); } if (m_world.DebugDrawer != null) { if (m_world.DebugDrawer is IDisposable) { IDisposable dis = (IDisposable)m_world.DebugDrawer; dis.Dispose(); } } m_world.Dispose(); Broadphase.Dispose(); Dispatcher.Dispose(); CollisionConf.Dispose(); _ddWorld = null; m_world = null; } if (Broadphase != null) { Broadphase.Dispose(); Broadphase = null; } if (Dispatcher != null) { Dispatcher.Dispose(); Dispatcher = null; } if (CollisionConf != null) { CollisionConf.Dispose(); CollisionConf = null; } if (constraintSolver != null) { constraintSolver.Dispose(); constraintSolver = null; } if (softBodyWorldInfo != null) { softBodyWorldInfo.Dispose(); softBodyWorldInfo = null; } _isDisposed = true; singleton = null; }
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) // { // Log.Error("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 = this.GetParent <Unit>().GetComponent <BCollisionShape>(); if (m_collisionShape == null) { Log.Error("There was no collision shape component attached to this BRigidBody. "); return(false); } if (!(m_collisionShape.GetCollisionShape is ConvexShape)) { Log.Error("The CollisionShape on this BCharacterController was not a convex shape. "); return(false); } 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 = this.GetParent <Unit>().Quaternion.ToBullet(); BulletSharp.Math.Matrix.RotationQuaternion(ref q, out worldTrans); worldTrans.Origin = this.GetParent <Unit>().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 = this.GetParent <Unit>().Quaternion.ToBullet(); BulletSharp.Math.Matrix.RotationQuaternion(ref q, out worldTrans); worldTrans.Origin = this.GetParent <Unit>().Position.ToBullet(); m_collisionObject.WorldTransform = worldTrans; m_collisionObject.UserObject = this; } return(true); }