在其边缘旋转刚体?

Rotate rigidBody on its edge?

我正在创建一个简单的游戏,其中涉及使用 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);  

然而,这只是在球杆的中心 上旋转刚体。我希望刚体在 edge(球杆手柄)附近旋转。

所以我添加了一个变换,将球杆向上移动到枢轴点上方: (这段代码直接跟在前面的代码之后)

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);

但是,这不会改变枢轴点,它只是将球杆移动到枢轴点上方(产生不需要的 space)。

简而言之,旋转矩阵只是让刚体围绕它的中心旋转。我只想将枢轴点从刚体的中心移动到刚体的

MotionState 的 SetWorldTransform 始终围绕其质心变换body。

有两种方法可以解决您的问题。如果您使用 btDefaultMotionState 作为运动状态,则可以在构造函数中指定质心的偏移量。这样 body 将围绕另一个点旋转。然而,这种方法有一个严重的副作用。所有与此 object 的物理交互都会将新的枢轴点视为质心。如果您的 body 是动态的,那很好,但如果是动态的,效果可能与预期效果不同。

另一种可能更安全的方法是将 3 个转换堆叠在一起以实现您正在寻找的旋转。首先,将 body 平移到所需枢轴的位置。接下来,旋转它。最后,将其平移回质心所在的位置。