Блоки физики пули не вращаются

#c #opengl #physics #bullet

#c #opengl #физика #пуля

Вопрос:

Я использую следующий код для настройки простого мира с использованием движка физики пули. Когда я запускаю его, блоки не ведут себя реалистично, потому что они не вращаются. Похоже, что их вращение заблокировано. Кто-нибудь видел что-то подобное раньше или знает, что может быть причиной этого? Спасибо.

 World::World()
{
mBroadphase = new btDbvtBroadphase();
mCollisionConfiguration = new btDefaultCollisionConfiguration();
mDispatcher = new btCollisionDispatcher(mCollisionConfiguration);
mSolver = new btSequentialImpulseConstraintSolver();
mWorld = new btDiscreteDynamicsWorld(mDispatcher, mBroadphase, mSolver, mCollisionConfiguration);
mWorld->setGravity(btVector3(0, -10, 0));

mGroundShape = new btStaticPlaneShape(btVector3(0, 1, 0), 1);
mBoxShape = new btBoxShape(btVector3(4, 1.5, 1));

mGroundMotionState = new btDefaultMotionState(btTransform(btQuaternion(0, 0, 0, 1), btVector3(0, -10, 0)));
btRigidBody::btRigidBodyConstructionInfo groundRBCI(0, mGroundMotionState, mGroundShape, btVector3(0, 0, 0));

mGroundRigidBody = new btRigidBody(groundRBCI);
mGroundRigidBody->setUserIndex(1);
mWorld->addRigidBody(mGroundRigidBody);

btScalar mass = 1;
btVector3 boxInertia(0, 0, 0);
mBoxShape->calculateLocalInertia(mass, boxInertia);

mBoxMotionState1 = new btDefaultMotionState(btTransform(btQuaternion(0, 0, 0, 1), btVector3(0, 35, -20)));
btRigidBody::btRigidBodyConstructionInfo BoxRBCI1(mass, mBoxMotionState1, mBoxShape, btVector3(0, 0, 0));
mBoxRigidBody1 = new btRigidBody(BoxRBCI1);
mBoxRigidBody1->setUserIndex(2);

mBoxMotionState2 = new btDefaultMotionState(btTransform(btQuaternion(0, 0, 0, 1), btVector3(2, 20, -20)));
btRigidBody::btRigidBodyConstructionInfo BoxRBCI2(mass, mBoxMotionState2, mBoxShape, btVector3(0, 0, 0));
mBoxRigidBody2 = new btRigidBody(BoxRBCI2);
mBoxRigidBody2->setUserIndex(3);

mBoxMotionState3 = new btDefaultMotionState(btTransform(btQuaternion(0, 0, 0, 1), btVector3(-5, 12, -20)));
btRigidBody::btRigidBodyConstructionInfo BoxRBCI3(mass, mBoxMotionState3, mBoxShape, btVector3(0, 0, 0));
mBoxRigidBody3 = new btRigidBody(BoxRBCI3);
mBoxRigidBody3->setUserIndex(4);

mWorld->addRigidBody(mBoxRigidBody1);
mWorld->addRigidBody(mBoxRigidBody2);
mWorld->addRigidBody(mBoxRigidBody3);



}
  

Ответ №1:

Ага! У меня была эта проблема, и я целую вечность не мог найти ответа, поэтому я рад помочь!

Строка

 mBoxShape->calculateLocalInertia(mass, boxInertia);
  

изменяет boxInertia , и затем вам нужно передать его конструкторам btRigidBody::btRigidBodyConstructionInfo следующим образом:

 btRigidBody::btRigidBodyConstructionInfo BoxRBCI1(mass, mBoxMotionState1, mBoxShape, boxInertia);
  

Тогда ваши ящики должны вращаться 🙂