/// <summary>
        /// called by Physics World just before rigid body is added to world.
        /// the current rigid body properties are used to rebuild the rigid body.
        /// </summary>
        internal virtual bool _BuildCollisionObject()
        {
            WorldController world = GetWorld();

            if (collisionObject != null)
            {
                if (isInWorld && world != null)
                {
                    world.RemoveCollisionObject(this);
                }
            }

            if (transform.localScale != 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.", transform);
            }

            m_collisionShape = GetComponent <BCollisionShape>();

            if (m_collisionShape == null)
            {
                Debug.LogError("There was no collision shape component attached to this BRigidBody. " + name, transform);
                return(false);
            }

            CollisionShape cs = m_collisionShape.GetCollisionShape();

            //rigidbody is dynamic if and only if mass is non zero, otherwise static

            if (collisionObject == null)
            {
                collisionObject = new CollisionObject();
                collisionObject.CollisionShape = cs;
                collisionObject.UserObject     = this;

                MatrixB     worldTrans;
                QuaternionB q = transform.rotation.ToBullet();
                MatrixB.RotationQuaternion(ref q, out worldTrans);
                worldTrans.Origin = transform.position.ToBullet();
                collisionObject.WorldTransform = worldTrans;
                collisionObject.CollisionFlags = m_collisionFlags;
            }
            else
            {
                collisionObject.CollisionShape = cs;
                MatrixB     worldTrans;
                QuaternionB q = transform.rotation.ToBullet();
                MatrixB.RotationQuaternion(ref q, out worldTrans);
                worldTrans.Origin = transform.position.ToBullet();
                collisionObject.WorldTransform = worldTrans;
                collisionObject.CollisionFlags = m_collisionFlags;
            }

            return(true);
        }
        public virtual void SetRotation(Quaternion rotation)
        {
            if (isInWorld)
            {
                MatrixB     newTrans = collisionObject.WorldTransform;
                QuaternionB q        = rotation.ToBullet();
                MatrixB.RotationQuaternion(ref q, out newTrans);

                newTrans.Origin = transform.position.ToBullet();
                collisionObject.WorldTransform = newTrans;
                transform.rotation             = rotation;
            }
            else
            {
                transform.rotation = rotation;
            }
        }