我创建了一个简单的游戏,涉及使用c ++中的子弹库来摆动一个俱乐部。但是,我无法按照我想要的方式旋转球杆(刚体)。
供参考,这是俱乐部结构:
struct Club {
btRigidBody *btPhys;
btScalar rotateAmount;
btVector3 axis;
}
以下是我如何旋转球杆:
//Create a rotation matrix from the club's world transform
btMatrix3x3 orn = club.btPhys->getWorldTransform().getBasis();
//Apply a rotation to the matrix
orn *= btMatrix3x3(btQuaternion( btVector3(0, 0, 1), btScalar(degreesToRads(club.rotationAmount))));
//Set the rotation of the club
club.btPhys->getWorldTransform().setBasis(orn);
然而,这只是旋转球杆的中心上的刚体。我希望刚体在它的边缘(球杆的手柄)附近旋转。
所以我添加了一个变换来将球杆向上移动到枢轴点之上: (此代码紧跟在前面的代码之后)
btTransform trans;
//Get the club's trasnform
club.btPhys->getMotionState()->getWorldTransform(trans);
float x, y, z;
x = trans.getOrigin().getX();
y = trans.getOrigin().getY();
z = trans.getOrigin().getZ();
//Set the transform to be 2 units above the club's origin (the club is 4 units long)
trans.setOrigin(btVector3(btScalar(x), btScalar(y + 2.0f), btScalar(z)));
//Apply the transform to the club
club.btPhys->getMotionState()->setWorldTransform(trans);
然而,这并没有改变枢轴点,它只是将球杆移动到枢轴点之上(产生不需要的空间)。
简而言之,旋转矩阵只是围绕它的中心旋转刚体。我只想将枢轴点从刚体的中心移动到刚体的边。
答案 0 :(得分:2)
MotionState的SetWorldTransform总是围绕其质心转换身体。
有两种方法可以解决您的问题。如果您使用btDefaultMotionState作为运动状态,则可以在构造函数中指定质心的偏移量。这样,身体将围绕另一个点旋转。然而,这种方法存在严重的副作用。与此对象的所有物理交互都将新枢轴点视为质心。如果你的身体是运动的,那就完全没问题,但如果它是动态的,效果可能与预期效果不同。
另一个可能更安全的方法是将3个转换堆叠在一起以实现您正在寻找的旋转。首先,将主体转换为所需枢轴的位置。接下来,旋转它。最后,将它转回质量中心所在的位置。