2011-11-21 71 views
2

我刚刚开始在我的Ogre项目中实施子弹。我在这里遵循安装说明:http://www.ogre3d.org/tikiwiki/OgreBullet+Tutorial+1如何阻止OgreBullet胶囊摔倒?

而其余的,如果这里的教程: http://www.ogre3d.org/tikiwiki/OgreBullet+Tutorial+2

我得到了做工精细但现在我想将其扩展到处理第一人称视角。我创建了一个CapsuleShape和一个刚体(就像教程对盒子做的那样),但是当我运行游戏时,胶囊掉落并在地板上滚动,导致相机大幅摆动。

我需要一种方法来修复胶囊始终保持直立,但我不知道如何

下面是我使用的代码。

(的部分)的头文件

OgreBulletDynamics::DynamicsWorld *mWorld; // OgreBullet World 
OgreBulletCollisions::DebugDrawer *debugDrawer; 
std::deque<OgreBulletDynamics::RigidBody *>   mBodies; 
std::deque<OgreBulletCollisions::CollisionShape *> mShapes; 

OgreBulletCollisions::CollisionShape *character; 
OgreBulletDynamics::RigidBody *characterBody; 
Ogre::SceneNode *charNode; 

Ogre::Camera* mCamera; 
Ogre::SceneManager* mSceneMgr; 
Ogre::RenderWindow* mWindow; 

主文件

bool MinimalOgre::go(void) 
{ 
    ... 

    mCamera = mSceneMgr->createCamera("PlayerCam"); 
    mCamera->setPosition(Vector3(0,0,0)); 
    mCamera->lookAt(Vector3(0,0,300)); 
    mCamera->setNearClipDistance(5); 
    mCameraMan = new OgreBites::SdkCameraMan(mCamera); 


    OgreBulletCollisions::CollisionShape *Shape; 
    Shape = new OgreBulletCollisions::StaticPlaneCollisionShape(Vector3(0,1,0), 0); // (normal vector, distance) 
    OgreBulletDynamics::RigidBody *defaultPlaneBody = new OgreBulletDynamics::RigidBody(
      "BasePlane", 
      mWorld); 
    defaultPlaneBody->setStaticShape(Shape, 0.1, 0.8); // (shape, restitution, friction) 
    // push the created objects to the deques 
    mShapes.push_back(Shape); 
    mBodies.push_back(defaultPlaneBody); 

    character = new OgreBulletCollisions::CapsuleCollisionShape(1.0f, 1.0f, Vector3(0, 1, 0)); 

    charNode = mSceneMgr->getRootSceneNode()->createChildSceneNode(); 
    charNode->attachObject(mCamera); 
    charNode->setPosition(mCamera->getPosition()); 

    characterBody = new OgreBulletDynamics::RigidBody("character", mWorld); 
    characterBody->setShape( charNode, 
        character, 
        0.0f,   // dynamic body restitution 
        10.0f,   // dynamic body friction 
        10.0f,   // dynamic bodymass 
        Vector3(0,0,0),  
        Quaternion(0, 0, 1, 0)); 


    mShapes.push_back(character); 
    mBodies.push_back(characterBody); 

    ... 
} 
+2

这个问题可能不是题外话题,但你可能会在http://gamedev.stackexchange.com/上得到更好的答案。 –

回答

3

可以锁定在胶囊的角运动,以防止它从翻倒。食人魔不直接公开此功能,但你应该能够访问底层子弹刚体来完成你所需要的:

characterBody->getBulletRigidBody()->setAngularFactor(btVector3(0.0f,1.0f,0.0f)); 

这将锁定转动而在X轴和Z轴,防止胶囊翻倒,但允许围绕yaxis旋转,这样角色仍然可以转动。

在某些时候,您可能希望使用运动学角色控制器进行研究,但这是针对不同问题的答案。