Fisika Peluru - Faktor sudut tidak berlaku

Saat ini saya menggunakan Fisika Peluru untuk mensimulasikan fisika di dunia saya. Saat ini, saya memiliki pemain yang dapat dikontrol dan dapat bergerak dengan ApplyForce, namun belum memiliki kemampuan untuk memutar.

Namun, saya mengunci gerakan sudut ke sumbu Y (pitch), tetapi sepertinya tidak berhasil:

Saat inisialisasi:

// 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()));
}

Juga, apa yang mungkin menimbulkan masalah juga: Sebelum simulasi fisika saya mengatur transformasi benda tegar menjadi transformasi komponen transformasi saya, dan setelah simulasi fisika saya mengatur transformasi komponen transformasi menjadi transformasi benda tegar.

// 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);
        }
    }
}

Jadi masalahnya saya mengunci putaran sumbu x dan z, tetapi tetap mengubah putaran sumbu x dan z (GIF masalahnya ditunjukkan di bawah). Seperti yang saya bilang tadi, saya belum melakukan rotasi pemain. Setiap rotasi yang Anda lihat pada GIF di bawah ini murni dilakukan oleh Bullet Physics. Saya hanya memindahkan pemain dengan AddForce.

Apakah saya melakukan sesuatu yang salah atau apakah ini bug yang diketahui dalam fisika Bullet? Terima kasih sebelumnya..!

'Kunci rotasi tidak berfungsi'


person M Zeinstra    schedule 01.11.2017    source sumber


Jawaban (1)


Apakah Anda membuat benda tegar dinamis atau kinematik untuk pemain Anda?

Benda kaku kinematik hanya dapat dipindahkan/dianimasikan oleh pengguna, objek dinamis juga dapat dipindahkan melalui objek lainnya... Lihat panduan pengguna poin hal. 19+20

Jadi jika pemain Anda hanya dipindahkan menggunakan addForce() dll., buatlah badan kinematik.

Cara membuat benda tegar kinematik: (Contoh di C#, C++ harus serupa)

// 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