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 Physics? ขอบคุณล่วงหน้า..!

'ล็อคการหมุนไม่ทำงาน'


person M Zeinstra    schedule 01.11.2017    source แหล่งที่มา


คำตอบ (1)


คุณสร้างความแข็งแกร่งแบบไดนามิกหรือแบบคิเนเมติกสำหรับเครื่องเล่นของคุณหรือไม่?

วัตถุแข็งแบบจลน์ศาสตร์สามารถเคลื่อนย้าย/ทำให้เคลื่อนไหวได้โดยผู้ใช้เท่านั้น วัตถุไดนามิกยังสามารถเคลื่อนย้ายผ่านวัตถุอื่นๆ ทั้งหมดได้... ดู คู่มือผู้ใช้สัญลักษณ์แสดงหัวข้อย่อย หน้า 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