Как вы управляете персонажем игрока в Bullet Physics?

Я не уверен, как вы должны управлять персонажем игрока в 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, если это актуально.

Проблема была с файлом маркера, который с тех пор был исправлен (коробки столкновения не работали). Тем не менее, я все еще испытываю нервозность, неспособность время от времени повышаться, мгновенное понижение с высоты и другие проблемы.

2

Решение

Мой ответ на этот вопрос говорит вам о том, что хорошо сработало для меня и, видимо, для человека, который спросил.

Избегайте столкновения с землей при помощи Bullet

Реализации контроллера персонажей в bullet, к сожалению, очень «базовые».
Чтобы получить хороший контроллер персонажа, вам нужно много вложить.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]