Я создал пуленепробиваемую машину с составным шасси, а состав состоит из 2 корпусов, шасси и башни.
Я могу получить преобразование башни и матрицу opengl следующим образом:
// get chassis and turret transforms
btTransform chassisTransform = m_vehicle->getChassisWorldTransform();
btTransform turretTransform = compound->getChildTransform(1);
// multiply transforms to get updated turret transform
turretTransform *= chassisTransform;
// get turret matrix
btScalar turretMatrix[16];
turretTransform.getOpenGLMatrix(turretMatrix);
TurretTransform — это преобразование объекта btCollisionShape (turretShape).
Я сейчас пытаюсь повернуть эту турель вокруг своей оси Y.
Я попробовал это:
turretTransform.setRotation(btQuaternion(btVector3(0, 1, 0), angle));
Где угол это поплавок, но ничего не происходит.
Я определенно что-то упускаю, но не до конца понимаю, как работают эти повороты.
Я должен был изменить установку автомобильной башни и создал отдельный жесткий корпус для башни. Так что теперь у меня есть 2 разных твердых тела, машина и башня.
После прохождения ConstraintDemo я вышел с этим:
// create constraint
btVector3 axisA(0.f, 1.f, 0.f);
btVector3 axisB(0.f, 0.f, 0.f);
btVector3 pivotA(0.f, 1.f, 0.f);
btVector3 pivotB(0.f, 0.f, 0.f);
hinge = new btHingeConstraint(*m_carChassis, *turretBody, pivotA, pivotB, axisA, axisB);
// add constraint to world
bt_dynamicsWorld->addConstraint(hinge, true);
Теперь я могу использовать hinge->enableAngularMotor(true, 0, 1);
остановить вращение турелиhinge->enableAngularMotor(true, angle, 1);
(угол плавания), чтобы повернуть его, когда я хочу.
Других решений пока нет …