Как предотвратить падение OgreBullet Capsule?

Я только начал внедрять пулю в свой проект 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);

    ...
}

person Nathan    schedule 21.11.2011    source источник
comment
Этот вопрос может быть не по теме здесь, но вы можете получить более подробные ответы на gamedev.stackexchange.com.   -  person Some programmer dude    schedule 21.11.2011


Ответы (1)


Вы можете заблокировать угловое движение капсулы, чтобы предотвратить ее опрокидывание. Ogre не предоставляет эту функциональность напрямую, но вы должны иметь доступ к базовому жесткому телу пули, чтобы выполнить то, что вам нужно:

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

Это заблокирует вращение по осям x и z, предотвратив опрокидывание капсулы, но разрешив вращение вокруг оси y, чтобы персонаж все еще мог поворачиваться.

В какой-то момент вы можете захотеть изучить использование кинематического контроллера персонажа, но это ответ на другой вопрос.

person nonVirtualThunk    schedule 21.11.2011