gpt4 book ai didi

c++ - 如何防止 OgreBullet Capsule 掉落?

转载 作者:搜寻专家 更新时间:2023-10-31 01:55:38 29 4
gpt4 key购买 nike

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

剩下的教程在这里: http://www.ogre3d.org/tikiwiki/OgreBullet+Tutorial+2

我让它工作得很好,但现在我想将它扩展到第一人称相机的 handle 上。我创建了一个 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);

...
}

最佳答案

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

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

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

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

关于c++ - 如何防止 OgreBullet Capsule 掉落?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8215488/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com