GSI

Bullet3D 라이브러리를 계속 파오는 동안 벌써 몇달이 지난듯 하다.

 

계속해서 로봇의 움직임을 구동하기 위해서는 객체마다 조건(ex btHingeConstraint)을 걸어줘야 하며,

조건들을 움직이는건 일단 마무리가 되었다

이후에 계속해서 가지고 있던 고민은 다리 하나하나를 움직여야 하니 제일 끝의 객체를

위치 이동을 해보면 좋을거 같았다.

 

그래서 마우스로 객체를 움직일 수 있는 부분을 파 보았다.

두가지의 제어 방식이 보인다.

btGeneric6DofConstraint 이것과 btPoint2PointConstraint 두가지다

 

일단 btPoint2PointConstraint 이걸로 제어를 해보기로 했다.

아래의 코드는 움직임을 제어 하는 방법이다.

 

객체의 변수는 아래와 같이 선언

btPoint2PointConstraint* pConStraint;

 

이 코드는 매번 포인터 객체를 삭제 해야 한다.

if( pConStraint )
{
 m_dynamicsWorld->removeConstraint( pConStraint );
 delete pConStraint;
 pConStraint = NULL;
}

 

// 해당 btRigidBody 를 연결시켜 준다.

btVector3 p1(0, 0, 0);
pConStraint = new btPoint2PointConstraint( *m_rigs[0]->m_bodies[3], p1 );
m_dynamicsWorld->addConstraint( pConStraint, true );
pConStraint->m_setting.m_tau = 1;

 

// 위와 같이 연결하고 나서 아래와 같이 해당 이동값을 적어주면 객체가 움직이게 된다.
btVector3 newPivotB;
newPivotB.setZero();
newPivotB.setZ( 0.1 );
pConStraint->setPivotA( newPivotB );

 

근데 위와 같이 코드를 구성한 이후는 btRigidBody를 Constraint로 연결을 하고

pConStraint->setPivotA( newPivotB ); 를 하고 나면 계속해서 연결이 유지되고

계속해서 움직임을 할 수 있을거라 생각 했지만,

잘 안되서 포인터 객체를 없애고, 다시 연결후에

pConStraint->setPivotA( newPivotB ); 이걸 통해서 위치를 이동시킬 수 있는걸 알았다.

 

이제 앞으로 해야 할것

 

//
pConStraint = NULL;
pConStraint2 = NULL;

//
{
 btVector3 p1(0, 0, 0);
 pConStraint = new btPoint2PointConstraint( *m_rigs[0]->m_bodies[3], p1 );
 m_dynamicsWorld->addConstraint( pConStraint, true );
 pConStraint->m_setting.m_tau = 1;
}
{
 btVector3 p1(0, 0, 0);
 pConStraint2 = new btPoint2PointConstraint( *m_rigs[0]->m_bodies[6], p1 );
 m_dynamicsWorld->addConstraint( pConStraint2, true );
 pConStraint2->m_setting.m_tau = 1;
}

이 코드를 사용해서 해당 객체를 바닥에 고정 시킨다.

 

고정시켜 놓고 나서 시퀀스를 구성하고 하나하나 이동하면서 위치가 앞으로 이동하는지를 보자.

Posted by gsi
: