2015-08-28 35 views
0

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

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

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

回答

2

MotionState的SetWorldTransform总是围绕其质心转换身体。

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

另一种可能更安全的方法是将3次转换叠加在一起以实现您正在寻找的旋转。首先,将身体翻译成所需枢轴的位置。接下来,旋转它。最后,将它翻译回重心应该在的位置。

+0

绝对完美,非常感谢! – Jaitnium