OSDN Git Service

Fixed camera offset
authorryan <>
Sat, 27 Nov 2010 08:27:45 +0000 (08:27 +0000)
committerryan <>
Sat, 27 Nov 2010 08:27:45 +0000 (08:27 +0000)
ogrebullet/Collisions/src/OgreBulletCollisionsObject.cpp
ogrebullet/Dynamics/src/OgreBulletDynamicsRigidBody.cpp
src/sbs/camera.cpp

index 46f2188..0daf706 100644 (file)
@@ -119,16 +119,17 @@ namespace OgreBulletCollisions
     // -------------------------------------------------------------------------
     void Object::setPosition(const btVector3 &pos)
     {
-       mRootNode->setPosition(pos[0], pos[1], pos[2]);
+               mRootNode->setPosition(pos[0], pos[1], pos[2]);
     }
     // -------------------------------------------------------------------------
     void Object::setOrientation(const btQuaternion &quat)
     {   
-       mRootNode->setOrientation(quat.getW(),quat.getX(), quat.getY(), quat.getZ());
+               mRootNode->setOrientation(quat.getW(),quat.getX(), quat.getY(), quat.getZ());
     }
     // -------------------------------------------------------------------------
     void Object::setTransform(const btTransform& worldTrans)
     { 
+               //this sets the node's transformation based on the Bullet collider's world transformation
         mRootNode->setPosition(worldTrans.getOrigin()[0], worldTrans.getOrigin()[1],worldTrans.getOrigin()[2]);
         mRootNode->setOrientation(worldTrans.getRotation().getW(),worldTrans.getRotation().getX(), worldTrans.getRotation().getY(), worldTrans.getRotation().getZ());
     }
@@ -144,7 +145,7 @@ namespace OgreBulletCollisions
         mObject->setCollisionShape(shape->getBulletShape());
         showDebugShape(mWorld->getShowDebugShapes()); 
 
-       _notifyMoved();
+               _notifyMoved();
     }
     // -------------------------------------------------------------------------
     //-----------------------------------------------------------------------
@@ -186,8 +187,10 @@ namespace OgreBulletCollisions
        {
                Vector3 pos = mRootNode->getPosition();
                Quaternion quat = mRootNode->getOrientation();
-               mObject->getWorldTransform().setOrigin(btVector3(pos.x, pos.y, pos.z));
-               mObject->getWorldTransform().setRotation(btQuaternion(quat.x, quat.y, quat.z, quat.w));
+               btTransform transform;
+               transform.setOrigin(btVector3(pos.x, pos.y, pos.z));
+               transform.setRotation(btQuaternion(quat.x, quat.y, quat.z, quat.w));
+               mObject->setWorldTransform(transform);
        }
 
     //-----------------------------------------------------------------------
index 34551ef..86c181f 100644 (file)
@@ -58,7 +58,9 @@ namespace OgreBulletDynamics
     // -------------------------------------------------------------------------
     RigidBody::~RigidBody()
     {
-    }  
+               if (can_move == true)
+                       mShapeNode->detachObject(this);
+   }  
     // -------------------------------------------------------------------------
     void RigidBody::setShape(Ogre::SceneNode *node,  
         OgreBulletCollisions::CollisionShape *shape,                          
@@ -69,8 +71,9 @@ namespace OgreBulletDynamics
 
         mState = new ObjectState(this);
 
+               can_move = true;
         mRootNode = node;
-        mShapeNode = mRootNode->createChildSceneNode(mName + "Node");
+               mShapeNode = mRootNode->createChildSceneNode(mName + "Node");
 
         mShape = shape;
         showDebugShape(mWorld->getShowDebugShapes());
@@ -84,9 +87,9 @@ namespace OgreBulletDynamics
         body->setFriction(bodyFriction);
 
         mObject = body;
-       _notifyMoved();
+               _notifyMoved();
 
-       addToWorld();
+               addToWorld();
     }
 
     // -------------------------------------------------------------------------
@@ -100,12 +103,12 @@ namespace OgreBulletDynamics
 
         mRootNode = node;
 
-       can_move = movable;
+               can_move = movable;
 
-       if (can_move == true)
-               mShapeNode = mRootNode->createChildSceneNode(mName + "Node");
+               if (can_move == true)
+                       mShapeNode = mRootNode->createChildSceneNode(mName + "Node");
 
-       mShape = shape;
+               mShape = shape;
         showDebugShape(mWorld->getShowDebugShapes());
 
         btRigidBody *body = new btRigidBody(0.0, mState, mShape->getBulletShape ());
@@ -114,9 +117,9 @@ namespace OgreBulletDynamics
         body->setFriction(bodyFriction);
 
         mObject = body;
-       _notifyMoved();
+               _notifyMoved();
 
-       addToWorld();
+               addToWorld();
        }
        // -------------------------------------------------------------------------
     /*void RigidBody::setStaticShape(btScaledBvhTriangleMeshShape *shape,
index 38cfc81..57d2786 100644 (file)
@@ -42,12 +42,6 @@ Camera::Camera(Ogre::Camera *camera)
        object = new Object();
        object->SetValues(this, sbs->object, "Camera", "Camera", true);
 
-       MainCamera = camera;
-       MainCamera->setNearClipDistance(0.1f);
-       MainCamera->setFarClipDistance(0.0f);
-       CameraNode = sbs->mSceneManager->getRootSceneNode()->createChildSceneNode("Camera");
-       CameraNode->attachObject(MainCamera);
-
        //init variables
        CurrentFloor = 0;
        StartFloor = 0;
@@ -104,8 +98,16 @@ Camera::Camera(Ogre::Camera *camera)
        RotationStopped = false;
        MovementStopped = false;
 
+       //set up camera and scene nodes
+       MainCamera = camera;
+       MainCamera->setNearClipDistance(0.1f);
+       MainCamera->setFarClipDistance(0.0f);
+       MainCamera->setPosition(Ogre::Vector3(0, sbs->ToRemote((cfg_body_height + cfg_legs_height) / 2), 0));
+       CameraNode = sbs->mSceneManager->getRootSceneNode()->createChildSceneNode("Camera");
+       CameraNode->attachObject(MainCamera);
+
        //set up physics parameters
-       Ogre::Vector3 bounds = Ogre::Vector3(sbs->ToRemote(1.64 / 2), sbs->ToRemote(5 / 2), sbs->ToRemote(1.64 / 2));
+       Ogre::Vector3 bounds = Ogre::Vector3(sbs->ToRemote(cfg_body_width / 2), sbs->ToRemote((cfg_body_height + cfg_legs_height) / 2), sbs->ToRemote(cfg_body_depth / 2));
        mShape = new OgreBulletCollisions::BoxCollisionShape(bounds);
        mBody = new OgreBulletDynamics::RigidBody("Camera", sbs->mWorld);
        mBody->setShape(CameraNode, mShape, 0.1, 0.5, 1);
@@ -125,6 +127,7 @@ void Camera::SetPosition(const Ogre::Vector3 &vector)
 {
        //sets the camera to an absolute position in 3D space
        CameraNode->setPosition(sbs->ToRemote(vector));
+       mBody->_notifyMoved();
 }
 
 void Camera::SetDirection(const Ogre::Vector3 &vector)