Eu quero criar um objeto que apenas se mova ao longo dos eixos X e Z, mantendo o eixo Y desativado (é como o movimento em 2D, e o objeto não cai).
Atualmente, estou usando uma restrição de 6 dof para restringir o movimento no eixo Y, mas não está funcionando:
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);
Obrigado!
c++
bullet-physics
azer
fonte
fonte
Respostas:
A maneira preferida de conseguir isso no Bullet é definir o fator linear e possivelmente o fator angular para o corpo em questão. Este método é apresentado como um trecho de código na página Bullet Wiki.
Para permitir o movimento apenas ao longo do eixo Y, você usaria algo como isto:
Se você deseja desativar adicionalmente a rotação em torno de qualquer eixo específico, use o mesmo procedimento, mas usando a
setAngularFactor
função.Neste vídeo de exemplo simples , usei as duas chamadas a seguir para desativar o movimento ao longo do eixo Y e permitir a rotação apenas ao redor do eixo Y. Isso efetivamente força o corpo a permanecer no plano XZ no qual foi criado inicialmente.
fonte
Uma maneira de fazer isso é criar um retorno de chamada físico. Isso será chamado toda vez que o marcador for marcado internamente. Nesta chamada de retorno, você pode definir a velocidade Y como 0, desativando efetivamente o movimento Y. Seria algo como isto:
Você pode ler mais sobre retornos de chamada de simulação aqui .
fonte