[Bullet Physics] RigidBody 만들기

물리 2012.01.05 00:01 Posted by 물리프로그래머

안녕하세요 물리프로그래머 조성현 입니다.
모든 분들 새해 복 많이 받으시고요, 오늘은 가장 간단한 RigidBody(박스, 구, 캡슐, 실린더)를 만들어 보겠습니다.


1) Box생성
크기가 (1, 1, 1)의 박스를 위치(-4, 0, 10)에 생성하는 코드 입니다.
내용은 아래와 같습니다.
(1) 위치를 (-4, 0 , 10)로 정한다
(2) (1, 1, 1)크기의 btBoxShape를 생성한다.
(3) 박스 모양와 질량으로 localInertia를 구한다.(Inertia에 대해선 추후 설명)
(4) 위의 요소들을 이용해서 RigidBody를 만든다.
(5) World에 등록한다.

  // 질량을 1로 설정
  const float mass = 1.0f;

  // (1) RidigBody를 (-4, 0, 10)에 생성
  btTransform bodyTM;
  bodyTM.setIdentity();
  bodyTM.setOrigin(btVector3(-4.0f, 0.0f, 10.0f));

  // (2)Box 생성
  btCollisionShape* boxShape = new btBoxShape(btVector3(1.0f, 1.0f, 1.0f) );

  // (3)IneritaTensor를 계산
  btVector3 localInertia(0,0,0);
  boxShape->calculateLocalInertia(mass, localInertia);

  // (4)RigidBody 생성
  btDefaultMotionState* myMotionState = new btDefaultMotionState(bodyTM);
  btRigidBody::btRigidBodyConstructionInfo rbInfo(mass, myMotionState, boxShape, localInertia);
  btRigidBody* body = new btRigidBody(rbInfo);

  // (5)World에 등록
  m_dynamicsWorld->addRigidBody(body);



2) Sphere생성
Radius가 1인 Sphere를 위치(-2, 0, 10)에 생성하는 코드 입니다.
내용은 Box생성과 동일합니다.

  //질량을 1로 설정
  const float mass = 1.0f;

  //(1) RidigBody를 (-2, 0, 10)에 생성
  btTransform bodyTM;
  bodyTM.setIdentity();
  bodyTM.setOrigin(btVector3(-2.0f, 0.0f, 10.0f));

  // (2) Sphere 생성
  btCollisionShape* sphereShape = new btSphereShape(1.0f);

  // (3) IneritaTensor를 계산
  btVector3 localInertia(0,0,0);
  sphereShape->calculateLocalInertia(mass, localInertia);

  // (4)RigidBody 생성
  btDefaultMotionState* myMotionState = new btDefaultMotionState(bodyTM);
  btRigidBody::btRigidBodyConstructionInfo rbInfo(mass, myMotionState, sphereShape, localInertia);
  btRigidBody* body = new btRigidBody(rbInfo);

  (5)  World에 등록
  m_dynamicsWorld->addRigidBody(body);



3) Capsule생성
Radius가 0.5, Height가 2인 Capsule을 위치(2, 0, 10)에 생성하는 코드 입니다.

  //질량을 1로 설정
  const float mass = 1.0f;

  //(1) RidigBody를 (2, 0, 10)에 생성
  btTransform bodyTM;
  bodyTM.setIdentity();
  bodyTM.setOrigin(btVector3(2.0f, 0.0f, 10.0f));

  //(2) Capsule 생성
  btCollisionShape* capsuleShape = new btCapsuleShapeZ(0.5f, 2.0f);

  //(3) IneritaTensor를 계산
  btVector3 localInertia(0,0,0);
  capsuleShape->calculateLocalInertia(mass, localInertia);

  //(4) RigidBody를 생성
  btDefaultMotionState* myMotionState = new btDefaultMotionState(bodyTM);
  btRigidBody::btRigidBodyConstructionInfo rbInfo(mass, myMotionState, capsuleShape, localInertia);
  btRigidBody* body = new btRigidBody(rbInfo);

  //(5) World에 등록
  m_dynamicsWorld->addRigidBody(body);

4) Cylinder생성
Radius가 0.5, Height(Half)가 1인 Cylinder를 위치(4, 0, 10)에 생성하는 코드 입니다.

  //질량을 1로 설정

  const float mass = 1.0f;

  //(1) RidigBody를 (0, 0, 10)에 생성
  btTransform bodyTM;
  bodyTM.setIdentity();
  bodyTM.setOrigin(btVector3(4.0f, 0.0f, 10.0f));

  //(2) Cylinder 생성                                                                
  btCollisionShape* cylinderShape = new btCylinderShapeZ(btVector3(0.5f, 0.5f, 1.0f));

  //(3) IneritaTensor를 계산
  btVector3 localInertia(0,0,0);
  cylinderShape->calculateLocalInertia(mass, localInertia);

  //(4) RigidBody를 생성
  btDefaultMotionState* myMotionState = new btDefaultMotionState(bodyTM);
  btRigidBody::btRigidBodyConstructionInfo rbInfo(mass, myMotionState, cylinderShape, localInertia);
  btRigidBody* body = new btRigidBody(rbInfo);

  //(5) World에 등록
  m_dynamicsWorld->addRigidBody(body);


 

5) 결과
(1) "Create" 버튼을 누르면 RigidBody가 생성됨(계속)
(2) "Release"버튼을 누르면 모두 삭제됨.
(3) "Alt"를 누른상태에서, 마우스 L, R, Wheel로 카메라를 조절함.


다음에는 Friction, Restitution, Damping과 같은 RigidBody의 속성에 대해 설명하겠습니다. 

  

'물리' 카테고리의 다른 글

Inertia Tensor(2)  (0) 2012.02.19
Inertia Tensor(1)  (0) 2012.02.13
RigidBody의 Restitution, Friction, Damping  (2) 2012.02.06
[Bullet Physics] RigidBody 만들기  (2) 2012.01.05
[Bullet Physics] Bullet 물리엔진의 설치  (2) 2011.12.22