Я хочу создать объект, который двигается только вдоль осей X и Z, при этом ось Y остается отключенной (это похоже на движение в 2D, и объект не упадет).
В настоящее время я использую ограничение 6 степеней свободы, чтобы ограничить движение по оси Y, но оно не работает:
btRigidBody* zeroBody = new btRigidBody(0, NULL, NULL); // Create the body that we attach things to
btRigidBody* robot = mCarChassis->getBulletRigidBody();
btGeneric6DofConstraint* constrict = new btGeneric6DofConstraint(*robot, *zeroBody, btTransform::getIdentity(), btTransform::getIdentity(), false);
constrict->setLinearLowerLimit( btVector3( 1, 1, 1));
constrict->setLinearUpperLimit( btVector3(-1, 1,-1));
constrict->setAngularLowerLimit( btVector3( 1, 1, 1) );
constrict->setAngularUpperLimit( btVector3(-1, -1, -1) );
mBulletWorld->getBulletDynamicsWorld()->addConstraint(constrict);
Спасибо!
c++
bullet-physics
Азер
источник
источник
Ответы:
Предпочтительный способ для достижения этой цели в пулях , чтобы установить линейный множитель и , возможно, угловой коэффициент для рассматриваемого тела. Этот метод представлен как фрагмент кода на странице Wiki Пули.
Чтобы разрешить движение только по оси Y, вы должны использовать что-то вроде этого:
Если вы дополнительно хотите отключить вращение вокруг какой - либо конкретной оси, можно использовать ту же процедуру, но с использованием
setAngularFactor
функции вместо.В этом простом примере видео я использовал следующие два вызов для того , чтобы отключить движение вдоль оси Y. и обеспечить вращение вокруг только Y-ось. Это фактически заставляет тело оставаться в XZ-плоскости , в которой он был первоначально создан.
источник
Один из способов сделать это, чтобы создать физический клеща обратный вызов. Это будет вызываться каждый раз, когда пули тикают внутри. В этом вызов обратно вы можете установить скорость Y 0, эффективно отключение Y движение. Это будет выглядеть примерно так:
Вы можете прочитать больше о моделировании клеща обратных вызовов здесь .
источник