Chcę utworzyć obiekt, a nie tylko poruszać się wzdłuż osi X i Z, przy jednoczesnym wyłączeniu osi Y (to jest jak ruch w 2D, a obiekt nie spadnie).
Obecnie używam ograniczenia 6 dof, aby ograniczyć ruch na osi Y, ale to nie działa:
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);
Dzięki!
c++
bullet-physics
azer
źródło
źródło
Odpowiedzi:
Preferowanym sposobem osiągnięcia tego w Bullet jest ustawienie współczynnika liniowego i ewentualnie kątowego dla danego ciała. Ta metoda jest prezentowana jako fragment kodu na stronie Wiki Bullet.
Aby umożliwić ruch tylko wzdłuż osi Y, użyłbyś czegoś takiego:
Jeśli dodatkowo chcesz wyłączyć obrót wokół określonej osi, zastosuj tę samą procedurę, ale
setAngularFactor
zamiast tego użyj funkcji.W tym prostym przykładowym filmie użyłem następujących dwóch wywołań, aby wyłączyć ruch wzdłuż osi Y i umożliwić obrót tylko wokół osi Y. To skutecznie zmusza ciało do pozostania w płaszczyźnie XZ, w której zostało pierwotnie utworzone.
źródło
Jednym ze sposobów jest utworzenie wywołania zwrotnego zaznaczenia fizyki. Będzie to wywoływane za każdym razem, gdy pocisk wewnętrznie tyka. W tym wywołaniu zwrotnym możesz ustawić prędkość Y na 0, skutecznie blokując ruch Y. Wyglądałoby to tak:
Możesz przeczytać więcej o wywołaniach zwrotnych symulacji zaznacz tutaj .
źródło