子弹物理-定向刚体

Bullet Physics - Orienting a rigid body

本文关键字:子弹      更新时间:2023-10-16

我正在尝试确定子弹头中圆柱体的方向。现在,圆柱体是模拟中唯一的对象。我在这里找到了一些答案,相信我已经接近了,但仍然没有轮换。这是我创建圆柱体的函数,也许有东西会跳到某人身上。

我做错了什么?

void CreateCylinder(int index, double x, double y, double z, double radius, double length, int yaw, int pitch, int roll) {
    btScalar mass = 1;
    btVector3 position(x,y,z);
    btVector3 cylInertia(0,0,0);
    //create collision shape
    btCollisionShape* cylColl = new btCylinderShape(btVector3(radius,length,1));
    //default motion state
    btDefaultMotionState* ms = new btDefaultMotionState(btTransform(btQuaternion(0,0,0,1), btVector3(0,10,0)));
    //calculate inertia
    cylColl->calculateLocalInertia(mass, cylInertia);
    //construction info
    btRigidBody::btRigidBodyConstructionInfo cylCI(
        mass,
        ms,
        cylColl,          //collision shape
        cylInertia //inertia
    );
    btRigidBody *cylinder = new btRigidBody(cylCI);

    //orient cylinder
    btTransform tr;
    tr.setIdentity();
    btQuaternion quat;
    quat.setEuler(yaw,pitch,roll); //or quat.setEulerZYX depending on the ordering you want
    tr.setRotation(quat);
    //apply transform to cylinder rigid body
    cylinder->setCenterOfMassTransform(tr);

    body[index] = cylinder;
    m_dynamicsWorld->addRigidBody(body[index]);
}

您必须修改Body的WorldTransform,而不是CenterOfMassTransform。可以在DefaultMotionState中执行此操作,也可以在实体本身上执行此操作。