在其边缘旋转刚体

Rotate rigidBody on its edge?

本文关键字:旋转 边缘      更新时间:2023-10-16

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

然而,这不会改变枢轴点,它只是将球杆移动到枢轴点上方(创建一个不必要的空间)。

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

SetWorldTransform of MotionState总是围绕它的质心变换物体。

有两种方法可以解决你的问题。如果你使用btDefaultMotionState作为运动状态,你可以在构造函数中指定质心的偏移量。这样物体就会绕另一点旋转。然而,这种方法有一个严重的副作用。所有与这个物体的物理相互作用都将把新的枢轴点作为质心。如果你的身体是运动的,它是完美的,但如果它是动态的,效果可能与期望的效果不同。

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