【问题标题】:How do you stop OgreBullet Capsule from falling over?你如何阻止 OgreBullet Capsule 摔倒?
【发布时间】:2012-01-03 04:03:17
【问题描述】:

我刚刚开始在我的 Ogre 项目中实现子弹。我按照这里的安装说明进行操作:http://www.ogre3d.org/tikiwiki/OgreBullet+Tutorial+1

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

我让它工作得很好,但现在我想将它扩展到一个手柄第一人称相机。我创建了一个 CapsuleShape 和一个 Rigid Body(就像教程中为盒子所做的那样),但是当我运行游戏时,胶囊掉下来并在地板上滚动,导致相机疯狂地摆动。

我需要一种方法来固定胶囊以使其始终保持直立,但我不知道如何

下面是我正在使用的代码。

(部分)头文件

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);

    ...
}

【问题讨论】:

标签: c++ physics ogre bullet


【解决方案1】:

您可以锁定胶囊的角运动,以防止其翻倒。 Ogre 没有直接公开这个功能,但是你应该能够访问底层的子弹刚体来完成你需要的:

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

这将锁定 x 轴和 z 轴上的旋转,防止胶囊翻倒,但允许围绕 y 轴旋转,因此角色仍然可以转动。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多