2017-10-10 6 views
3

스프링 컨센트 테이션 을 테스트하고 싶습니다. Bullet Physics. 그래서 땅 위에 떠있는 정적 상자와 그곳에 매달려있는 두 번째 동적 상자를 만들었습니다. 그러나 봄의 행동을 활성화시키는 것은 아무 것도하지 않습니다! 상자는 실제로 매달려 있습니다. 나는 그것이 자유롭게 회전하기 때문에 그것을 안다. 그러나 그것은 진동하지 않습니다.Bullet Physics로 스프링 제약을 만드는 방법은 무엇입니까?

btCollisionShape *boxShape = createBoxShape(0.2f, 0.2f, 0.2f); 

btRigidBody *box1 = createStatic(boxShape); 
btRigidBody *box2 = createDynamic(1.0f /*mass*/, boxShape); 

box1->setWorldTransform(btTransform(btQuaternion::getIdentity(), { 0.0f, 2.0f, 1.0f })); 
box2->setWorldTransform(btTransform(btQuaternion::getIdentity(), { 0.0f, 1.0f, 1.0f })); 

btGeneric6DofSpring2Constraint *spring = new btGeneric6DofSpring2Constraint(
    *box1, *box2, 
    btTransform(btQuaternion::getIdentity(), { 0.0f, -1.0f, 0.0f }), 
    btTransform(btQuaternion::getIdentity(), { 0.0f, 0.0f, 0.0f }) 
); 

// I thought maybe the linear movement is locked, but even using these lines do not help. 
// spring->setLinearUpperLimit(btVector3(0.0f, 0.1, 0.0f)); 
// spring->setLinearLowerLimit(btVector3(0.0f, -0.1, 0.0f)); 

// Enabling the spring behavior for they y-coordinate (index = 1) 
spring->enableSpring(1, true); 
spring->setStiffness(1, 0.01f); 
spring->setDamping (1, 0.00f); 
spring->setEquilibriumPoint(); 

무엇이 잘못 되었나요? StiffnessDamping 매개 변수를 많이 사용했습니다. 그러나 그것은 아무것도 바뀌지 않았습니다. 선형 하한 및 상한을 설정하면 상자가 y 방향으로 움직일 수 있지만 여전히 진동하지는 않습니다. 그리고 예, 중력이 활성화됩니다.

답변

2

좋아, Bullet에서 제공 한 예제 프로젝트를 확인하여 해결책을 찾았습니다. 내가 배운 세 가지 :

  • 스프링 제약 하지 선형 제한을 위반하는 것입니다. 이전 방식의 문제점은 선형 움직임이 고정되었거나 지정된 스프링 강성에 대해 너무 작은 범위로 제한된다는 점이었습니다. 이제 더 이상 한계가 없습니다 (상단 한계보다 낮은 한계를 설정 함).
  • 강성이 너무 작아서 결합 된 물체가 마치 선형 한계 내에서 자유롭게 움직일 수있는 것처럼 동작했습니다. 아래 코드에서 값을 확인할 수 있습니다. 예제 프로젝트에서 값을 얻었습니다.
  • btGeneric6DofSpringConstraintbtGeneric6DofSpring2Constraint 사이에 동작에 약간의 차이가 있습니다. 전자는 비 스프링 축 (제 경우에는 x 축과 z 축)을 적게 옅게 보입니다. 후자의 경우 더 강한 감쇠가 적용됩니다. 그러나 이것은 단지 첫 번째 관찰 일뿐입니다.
btGeneric6DofSpringConstraint *spring = new btGeneric6DofSpringConstraint(
    *box1, *box2, 
    btTransform(btQuaternion::getIdentity(), { 0.0f, -1.0f, 0.0f }), 
    btTransform(btQuaternion::getIdentity(), { 0.0f, 0.0f, 0.0f }), 
    true 
); 

// Removing any restrictions on the y-coordinate of the hanging box 
// by setting the lower limit above the upper one. 
spring->setLinearLowerLimit(btVector3(0.0f, 1.0f, 0.0f)); 
spring->setLinearUpperLimit(btVector3(0.0f, 0.0f, 0.0f)); 

// Enabling the spring behavior for they y-coordinate (index = 1) 
spring->enableSpring(1, true); 
spring->setStiffness(1, 35.0f); 
spring->setDamping (1, 0.5f); 
spring->setEquilibriumPoint(); 
관련 문제