안녕하세요 물리프로그래머 조성현 입니다.
모든 분들 새해 복 많이 받으시고요, 오늘은 가장 간단한 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 (0) | 2012/02/06 |
| [Bullet Physics] RigidBody 만들기 (2) | 2012/01/05 |
| [Bullet Physics] Bullet 물리엔진의 설치 (2) | 2011/12/22 |
RigidBodies.zip




댓글을 달아 주세요
글 감사히 잘 보고 있습니다.
올려주신 실행 예제 파일의 소스도 같이 올려주실 수 없나요?
그리고 DX 샘플에 직접 묶어서 적용한 버전이 있었으면 합니다.
Bullet에서 제공하는 기본 프레임웍이 아닌 dx 샘플 프레임웍에
적용된 샘플 가능하시면 올려주세요.
프레임웍은 wxWidget로 만들었습니다. 괜찮으시다면 다음 글을 올릴때 같이 올려 드리겠습니다.