Bullet Physics - угловой коэффициент не применяется

В настоящее время я использую Bullet Physics для моделирования физики в моем мире. Прямо сейчас у меня есть управляемый игрок, который может перемещаться с помощью ApplyForce, но пока не имеет возможности вращаться.

Однако я фиксирую угловое движение по оси Y (шаг), но, похоже, это не работает:

При инициализации:

// Player.cpp
m_physicsBodyComp->LockRotation({0.f, 1.f, 0.f});
// PhysicsBodyComponent.cpp
void tse::PhysicsBodyComponent::LockRotation(const TSVector3 & a_axis) {
    if(m_rigidBody)
        m_rigidBody->setAngularFactor(btVector3(a_axis.GetX(), a_axis.GetY(), a_axis.GetZ()));
}

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

// Before physics simulation
void tse::PhysicsBodyComponent::UpdateTransformComponent() {
    if(m_rigidBody) {
        if(m_transformComponent->m_wasDirty && m_transformComponent->IsValid()) {
            btQuaternion _quat;
            _quat.setEuler(m_transformComponent->m_rotation.GetY(), m_transformComponent->m_rotation.GetX(), m_transformComponent->m_rotation.GetZ());

            btTransform _trans;
            _trans.setRotation(_quat);
            _trans.setOrigin(m_transformComponent->m_position.GetVecBt());
            m_rigidBody->setWorldTransform(_trans);
            m_transformComponent->m_wasDirty = false;
            Activate();
        }
    }
}

// After physics simulation
void tse::PhysicsBodyComponent::Update(float a_deltaTime) {
    if(m_rigidBody) {
        if(m_bodyType == PhysicsBodyType::DYNAMIC) {
            btTransform & _trans = m_rigidBody->getWorldTransform();

            DirectX::XMVECTOR _rotation;
            btQuaternion _quat = _trans.getRotation();

            _rotation.m128_f32[0] = _quat.getX();
            _rotation.m128_f32[1] = _quat.getY();
            _rotation.m128_f32[2] = _quat.getZ();

            m_transformComponent->SetPosition(TSVector3(_trans.getOrigin()));
            m_transformComponent->SetRotation(_rotation);
        }
    }
}

Итак, проблема в том, что я блокирую вращение осей x и z, но при этом все равно изменяется вращение осей x и z (GIF-изображение проблемы показано ниже). Как я сказал ранее, я пока не вращаю игрока. Каждое вращение, которое вы видите на GIF-изображении ниже, сделано исключительно Bullet Physics. Я перемещаю плеер только с помощью AddForce.

Я что-то делаю совершенно не так или это известная ошибка в физике Bullet? Заранее спасибо..!

'Блокировка поворота не работает'


person M Zeinstra    schedule 01.11.2017    source источник


Ответы (1)


Вы создаете для своего игрока динамическое или кинематическое твердое тело?

Кинематические твердые тела могут перемещаться / анимироваться только пользователем, динамические объекты также могут перемещаться через любые другие объекты ... См. руководство пользователя bullet стр. 19 + 20

Поэтому, если ваш игрок должен перемещаться только с помощью addForce () и т. Д., Создайте кинематическое тело.

Как я создаю кинематическое твердое тело: (Пример на C #, C ++ должен быть аналогичным)

// Create rigid Body
float mass = 0.0f; // kinematic bodies have no mass
RigidBodyConstructionInfo rbInfo = new RigidBodyConstructionInfo(mass, new DefaultMotionState(), collisionShape);
RigidBody rigidBody = new RigidBody(rbInfo);
rbInfo.Dispose();

// Mass=0 -> static/kinematic possible -> use flag distinguish
rigidBody.CollisionFlags = CollisionFlags.KinematicObject;
person OverFloo    schedule 18.01.2018