如何旋转btCollisionShape

时间:2013-11-18 22:38:57

标签: c++ opengl rotation quaternions bullet

我创造了一种带有复合物作为底盘的子弹车,该复合物由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));

其中angle是浮点数,但没有任何反应。

我肯定错过了一些东西,但并不完全了解这些轮换是如何工作的。

1 个答案:

答案 0 :(得分:1)

我不得不改变炮塔设置并为炮塔创建了一个单独的刚体。所以现在我有两个不同的刚体,汽车和炮塔。

在完成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);来停止炮塔旋转abd hinge->enableAngularMotor(true, angle, 1);(浮动角度)以便在我想要的时候旋转它。