Как вы удерживаете OgreBullet Capsule от падения? - PullRequest
2 голосов
/ 21 ноября 2011

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

    ...
}

1 Ответ

3 голосов
/ 22 ноября 2011

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

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

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

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

...