불릿 물리 엔진에서 Y 축 이동을 비활성화하는 방법


11

Y 축을 비활성화 상태로 유지하면서 X 및 Z 축을 따라 이동하는 것보다 객체를 만들고 싶습니다 (2D에서의 움직임과 유사하며 객체는 쓰러지지 않습니다).

현재 Y 축에서 움직임을 제한하기 위해 6 dof 제약 조건을 사용하고 있지만 작동하지 않습니다.

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);

감사!


어쩌면이 도움이 될 것입니다 bulletphysics.org/Bullet/phpBB3/...는 , 아마도 대신 1로, 0으로 Y 축에 대한 하위 / 상위 제한을 설정
deceleratedcaviar

답변:


20

Bullet에서이를 달성하기 위해 선호되는 방법 은 해당 바디 의 선형 인자 와 가능한 각도 인자 를 설정하는 것입니다. 이 방법은 Bullet Wiki 페이지에서 Code Snippet 으로 표시됩니다 .

Y 축만 따라 이동하려면 다음과 같이 사용하십시오.

body->setLinearFactor(btVector3(0,1,0));

특정 축을 중심으로 회전을 비활성화하려면 동일한 절차를 사용하지만 setAngularFactor대신 함수를 사용하십시오 .

이 간단한 예제 비디오 나는 Y 축을 따라 해제 이동하기 위해 다음과 같은 두 가지 통화를 사용하고 주변에만 Y 축 회전을 허용 할 수 있습니다. 이렇게하면 본체가 처음 작성된 XZ 평면에 효과적으로 유지됩니다.

body->setLinearFactor(btVector3(1,0,1));
body->setAngularFactor(btVector3(0,1,0));

2

이를 수행하는 한 가지 방법은 물리 틱 콜백을 만드는 것입니다. 총알이 내부적으로 틱될 때마다 호출됩니다. 이 콜백에서는 Y 속도를 0으로 설정하여 효과적으로 Y 이동을 비활성화 할 수 있습니다. 다음과 같이 보일 것입니다 :

void myTickCallback(const btDynamicsWorld *world, btScalar timeStep) {
    //robotBody is the btRigidBody you want to constrain the movement of
    btVector3 velocity = robotBody->getLinearVelocity();
    robotBody->setLinearVelocity(velocity.x, 0, velocity.z);
} 

시뮬레이션 틱 콜백 에 대한 자세한 내용은 여기를 참조하십시오 .


감사합니다! 이것은 다른 답변과 달리 JBullet의 Java 포트에도 적용되기 때문에 훌륭한 답변입니다.
joehot200
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.