Я не уверен, как вы должны управлять персонажем игрока в Bullet. Методы, которые я прочитал, должны были использовать предоставленный btKinematicCharacterController. Я также видел методы, которые используют btDynamicCharacterController из демоверсий. Однако в руководстве указано, что кинематический контроллер имеет несколько нерешенных проблем. Это все еще предпочтительный путь? Если да, есть ли учебники или документация для этого? Все, что я нашел, это фрагменты кода из демоверсии и использование контроллеров с Ogre, которые я не использую.
Если это не тот путь, по которому следует идти, тогда кто-то укажет мне правильное решение. Я новичок в пуле и хотел бы простого и простого решения. То, что у меня сейчас есть, это взломанные кусочки btKinematicCharacterController.
Это код, который я использовал для настройки контроллера:
playerShape = new btCapsuleShape(0.25, 1);
ghostObject= new btPairCachingGhostObject();
ghostObject->setWorldTransform(btTransform(btQuaternion(0,0,0,1),btVector3(0,20,0)));
physics.getWorld()->getPairCache()->setInternalGhostPairCallback(new btGhostPairCallback());
ghostObject->setCollisionShape(playerShape);
ghostObject->setCollisionFlags(btCollisionObject::CF_CHARACTER_OBJECT);
controller = new btKinematicCharacterController(ghostObject,playerShape,0.5);
physics.getWorld()->addCollisionObject(ghostObject,btBroadphaseProxy::CharacterFilter, btBroadphaseProxy::StaticFilter|btBroadphaseProxy::DefaultFilter);
physics.getWorld()->addAction(controller);
Это код, который я использую для доступа к позиции контроллера:
trans = controller->getGhostObject()->getWorldTransform();
camPosition.z = trans.getOrigin().z();
camPosition.y = trans.getOrigin().y()+0.5;
camPosition.x = trans.getOrigin().x();
Я контролирую это через setWalkDirection () и jump () (если canJump () имеет значение true).
Проблема сейчас в том, что персонаж немного spazze, а затем падает через статический пол. Понятно, что это не предназначено. Это связано с отсутствием твердого тела? Как интегрировать это?
На самом деле, сейчас он просто падает, как должен, но потом медленно опускается через пол.
Я переместил эту строку, чтобы быть сразу после создания динамического мира
physics.getWorld()->getPairCache()->setInternalGhostPairCallback(new btGhostPairCallback());
Теперь это так:
broadphase->getOverlappingPairCache()->setInternalGhostPairCallback(new btGhostPairCallback());
Я также использую файл .bullet, импортированный из blender, если это актуально.
Проблема была с файлом маркера, который с тех пор был исправлен (коробки столкновения не работали). Тем не менее, я все еще испытываю нервозность, неспособность время от времени повышаться, мгновенное понижение с высоты и другие проблемы.
Мой ответ на этот вопрос говорит вам о том, что хорошо сработало для меня и, видимо, для человека, который спросил.
Избегайте столкновения с землей при помощи Bullet
Реализации контроллера персонажей в bullet, к сожалению, очень «базовые».
Чтобы получить хороший контроллер персонажа, вам нужно много вложить.
Других решений пока нет …