Физика пуль — угловой фактор не применяетсяC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Физика пуль — угловой фактор не применяется

Сообщение Anonymous »

Сейчас я использую 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 показано ниже). Как я уже говорил ранее, я пока не занимаюсь ротацией игрока. Каждое вращение, которое вы видите на гифке ниже, сделано исключительно с помощью Bullet Physics. Я перемещаю игрока только с помощью AddForce.

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

Изображение


Подробнее здесь: https://stackoverflow.com/questions/470 ... esnt-apply
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»