Пуля не обновляет объединенную ось связи при вращении основания - PullRequest
0 голосов
/ 20 марта 2019

Я использую библиотеку BulletDynamics для моделирования цепочки связанных твердых тел. И как начало есть только одна революционная ссылка с осью X. Это часть инициализации:

    //init the links
    btVector3 hingeJointAxis(1.f, 0.f, 0.f);

    //y-axis assumed up
    btVector3 parentCom(head + (head - tail));
    btVector3 thisPivot(head);
    btVector3 thisCom(tail);

    for (int i = 0; i < numLinks; ++i)
    {
        float linkMass = 10.f;
        btVector3 linkInertiaDiag(0.0001f, 0.0001f, 0.0001f);

        pMultiBody->setupRevolute(i,
                                  linkMass,
                                  linkInertiaDiag,
                                  i - 1,
                                  btQuaternion(0.f, 0.f, 0.f, 1.f),
                                  hingeJointAxis,
                                  (tail - head),
                                  0.1f * (tail - head),
                                  false);
    }
    pMultiBody->finalizeMultiDof();

    btMultiBodyDynamicsWorld* world = m_dynamicsWorld;

    world->addMultiBody(pMultiBody);
    pMultiBody->setCanSleep(canSleep);
    pMultiBody->setHasSelfCollision(selfCollide);
    pMultiBody->setUseGyroTerm(gyro);
    //

    if (!damping)
    {
        pMultiBody->setLinearDamping(0.f);
        pMultiBody->setAngularDamping(0.f);
    }
    else
    {
        pMultiBody->setLinearDamping(0.1f);
        pMultiBody->setAngularDamping(0.9f);
    }

    setGravityInWorldFrame(IBulletBodyController::gravityVector());

    btAlignedObjectArray<btQuaternion> scratch_q;
    btAlignedObjectArray<btVector3> scratch_m;
    pMultiBody->forwardKinematics(scratch_q, scratch_m);
    btAlignedObjectArray<btQuaternion> world_to_local;
    btAlignedObjectArray<btVector3> local_origin;
    pMultiBody->updateCollisionObjectWorldTransforms(world_to_local, local_origin);

Это взято из примеров библиотек. Так что это должно быть правильно. После этого я постепенно вращаю базу, а затем использую функцию stepSimulation () , чтобы увидеть результат. То, что я вижу, что связь наклоняется назад (как предписывает физика) на углы от 0 до PI и вперед на другой стороне круга от PI до 2PI, что определенно не так, как ожидалось.

    auto btEulerSpeed = btVector3(eulerSpeed.x, eulerSpeed.y, eulerSpeed.z);
    _multiBody->setBaseOmega(btEulerSpeed);
    m_dynamicsWorld->stepSimulation(deltaT, 0);

Любые идеи будут оценены

...