我正在使用Ogre3D和Kinect制作游戏。 Ogre中的化身由kinect控制。现在我想实现物理,但我遇到了Bullet的问题。
我已将实体与具有成对的rigibodies“连接”。
std::vector<std::pair<Ogre::Entity *, btRigidBody *>> dynamicObjects;
std::vector<std::pair<Ogre::Entity *, btRigidBody *>> staticObjects;
我没有问题让我的食人魔遵循这样的僵尸:
for (int i = 0; i < dynamicObjects.size(); i++) {
try {
btTransform tr;
dynamicObjects[i].second->getMotionState()->getWorldTransform(tr);
btVector3 pos = tr.getOrigin();
btQuaternion qut = tr.getRotation();
dynamicObjects[i].first->getParentSceneNode()->setOrientation(Ogre::Quaternion(qut.getW(), qut.getX(), qut.getY(), qut.getZ()));
Ogre::Vector3 localPos = dynamicObjects[i].first->getParentSceneNode()->getParentSceneNode()->convertWorldToLocalPosition(Ogre::Vector3(pos.x(), pos.y(), pos.z()));
dynamicObjects[i].first->getParentSceneNode()->setPosition(localPos);
} catch (Ogre::Exception e) {
}
然而,我似乎无法做相反的事情,通过使刚体跟随实体,这是Kinect对于玩家控制器所必需的。此代码似乎没有做任何事情。
btTransform tr;
staticObjects[0].second->getMotionState()->getWorldTransform(tr);
Ogre::Vector3 entityPos = staticObjects[0].first->getParentSceneNode()->getPosition();
tr.setOrigin(btVector3(entityPos.x, entityPos.y, entityPos.z));
staticObjects[0].second->setWorldTransform(tr);
这两个部分都放在更新循环中。