Search

Inertia Tensor(2)

물리 2012. 2. 19. 17:19 Posted by 알 수 없는 사용자
이번에는 이전 운동량, 각운동량, 질량중심의 내용을 바탕으로 Inertia Tensor에 대해 설명 드리겠습니다.

1) 힘F(Input)에 대한 질점(Particle)의 변화량(Output)
아래의 그림처럼 m1에 F라는 힘을 가하면,  m1의 운동량(각운동량)이 변하게 됩니다.
 

 

 

식으로 나타내면 아래와 같고, 결과적으로 가속도가 변하게 됩니다.

 



2) 힘F(Input)에 대한 물체(RigidBody)의 변화량(Output)
아래의 그림은 m1과 m2가 붙어있은 경우 입니다.
힘 F를 가하면, 붙어있기 때문에 m1과 m2의 운동량(각운동량)이 모두 변하게 된다.

  

식으로 나타내면 아래와 같습니다.



v2는 상대운동을 함으로, 식을 아래와 같이 바꿀 수 있습니다.


그러나 역시, 식은 하나인데 변수는 2개입니다.  이식으론  m1, m2의 변화량을 구할 수 없습니다.
질점(Particle)과 달리 물체(RigidBody)의 변화량은,  운동량 보존법칙 하나만으론 해석할 수 없습니다.

다음은 각운동량 법칙을 이용해서 m1, m2의 변화량을 해석해 보겠습니다.
아래는 p점을 기준으로 각운동량의 변화량을 측정한 그림입니다. 


식을로 나타내면, 아래와 같습니다.



v2는 상대운동을 함으로, 식을 아래와 같이 바꿀 수 있습니다.


역시, 변수가 두개이기 때문에 각운동량 보존법칙 하나만으로는 문제는 풀 수 없습니다.
그러나 앞의 운동량 보존법칙과 각운동량 보존법칙을 연립하면, 식이 2개 변수가 2개 이기 때문에 변화량을 구할 수 있습니다.  정리하면 아래와 같습니다.


그러나 위의 식은 너무 복잡합니다. 지금은 m1, m2두개의 물체가 있을때 지만,  아래의 그림과 같은 상황이 되면 식을 풀기가 어렵습니다.

 


3) Center of Mass의 특성을 이용해, 물체(RigidBody)의 운동량(각운동량)해석을 간소화함
아래의 그림처럼 물체(RigidBody)의 속도는 기준점의 속도(Linear Velocity)와 기준점에 대한 상대속도(Angular Velocity)의 합으로 나타낼 수 있습니다.


기준점을 Center of Mass로 잡으면 , 운동량 보존법칙은 아래 식과 같습니다.
r은 Center of Mass로 부터의 거리, w는 각속도, Vc는 Center of Mass의 속도를 나타냅니다.
 



외부힘에 대한, 운동량의 변화량을 식으로 나타내면 아래와 같습니다.


마찬가지로, 각운동량의 측정지점을 아래 그림과 같이 Center of Mass로 합니다.


각운동량을 식으로 나타내면 아래와 같습니다.


F힘이 위치 PF위치에서 작용했을때, 각운동량의 변화량을 식으로 나타내면 아래와 같습니다.



여기서 식을 아래와 같이 정리 할 수 있습니다.



그리고 Inertia Tensor를 아래와 같이 정의 하게 됩니다.



Inertia Tensor를 이용해 운동량을 해석하면 아래와 같습니다.



4) 박스의 Inertai Tensor
예로 박스의 Inertia Tensor를 구해 보겠습니다.

Inertia Tensor는 아래식과 같습니다.


식을 x, y, z순으로 적분하면 아래과 같이 됩니다.



최종 Inertia Tensor는 아래와 같이 됩니다.



5) Inertia Tensor의 대각화
Bullet이나 대부분의 물리엔진은 Inertia Tensor를 행렬이 아닌 백터의 형태로 가지고 있습니다.
이는 Inertia Tensor의 3x3행열을 대각화 시킨 것 입니다.
박스, 구, 실린더, 캡슐등의 Inertia Tensor는기본적으로 대각화가 되어 있습니다. 위의 박스의 Inertia Tensor도 대각화 되어 있는 걸 확인하실 수 있습니다. (대각화를 구하는 방법은 따로 언급하지 않겠습니다.)
대각화된 Inertia Tensor는 아래와 같은 특징을 가집니다.


Inertia Tensor가 대각화 됬을 경우, 운동량식을  정리하면 아래와 같습니다.



이상으로 Inertia Tensor에 대한 설명을 마치겠습니다.

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

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

Inertia Tensor(1)

물리 2012. 2. 13. 00:09 Posted by 알 수 없는 사용자
이번에는 Inertia Tensor에 대해서 설명 드리겠습니다.
Inertia Tensor를 이해하기 위해서는,  운동량(Linear Momentum), 각운동량(Angulra Momentum), 질량중심(Center of Mass)에 대해서 알고 있어야 합니다. 그래서 이 3요소에 대해서 먼저 언급을 한 후에,  Inerta Tensor에 대해 설명 드리겠습니다.


1) 운동량(Linear Momentum)

운동량은 말 그대로 물체가 현재 운동하고 있는 정도를 나타냅니다.
아래의 그림처럼, 질량이 m1, 위치가 p1, 속도가 v1이라 물체가 있을때 이 물체의 운동량은 아래 식과 같습니다.




여기서 ML1은 1번 물체의 운동량(Linear Momentum)을 나타냅니다.
이 운동량을 시간에 대해서 미분하면(시간에 따른 변화를 측정) 아래와 같은 식이 나옵니다.


이 식을 보면, 물체의 운동량을 변화시키기 위해서는 힘이 필요하고, 외부의 힘이 없으면 물체의 운동량은 일정하게 유지 됩니다.
이게 바로 운동량 보존의 법칙입니다.


2) 각운동량(Angular Momentum)

각운동량은 임의의 기준점에 대한, 물체의 회전 운동량을 나타냅니다.
아래의 그림처럼, 질량이 m1, 위치가 p1, 속도가 v1이라 물체가 있을때, p점에서 측정한 이 물체의 각운동량은 아래의 식과 같습니다.




여기서 MA1은 1번 물체의 각운동량(Angular Momentum)을 나타냅니다.
이 각운동량을 시간에 대해서 미분하면(시간에 따른 변화를 측정) 아래와 같은 식이 나옵니다.

 



이 식을 보면, 물체의 각운동량을 변화시키기 위해서는 힘이 필요하고, 외부의 힘이 없으면 물체의 각운동량은 일정하게 유지 됩니다. 이게 바로 각운동량 보존의 법칙입니다.
그리고  각운동량은 운동량과 달리, 아래의 그림처럼 측정 지점에 따라 다르게 나타납니다.




3) 질량중심(Center of mass)
물체(RigidBody)는 아래의 그림처럼 미소질량들의 모임으로 해석할 수 있습니다. 


질량중심은 두가지 의미를 가지고 있습니다.
(1) 물체의 각 미소질량들이 동일한 힘을 받을때,  질량중심은 아래 그림처럼 그 물리량을 대표할 수 있는 하나의 지점을 의미합니다. 미소질량들이 받는 동일한 힘의 대표적인 예가 중력입니다. 질량중심에 반대의 힘을 가하면 물체의 운동량은 정지되게 됩니다. (중심을 잡게 됩니다.)


식으로 나타내면 아래와 같습니다.
여기서 Pc가 구하고자 하는 질량 중심이고, Pxyz는 미소질량의 위치, P는 측정 위치를 나타냅니다.



이식을 풀면, 아래과 같은 식이 나옵니다.


(2) 질량중심에서는 아래의 그림처럼 상대운동(속도, 가속도)이 모두 0이 됩니다.


식으로 나타내면 아래와 같습니다.
아래의 식을 풀어도 (1)과 같은 결과를 얻습니다.


이상으로 운동량, 각운도량, 질량중심에 대한 설명을 마치겠습니다.

 


 

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

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

RigidBody의 Restitution, Friction, Damping

물리 2012. 2. 6. 00:40 Posted by 알 수 없는 사용자

안녕하세요. 이번에는 RigidBody의 속성인 restitution, friction, damping에 대해서 간략하게 설명 드리겠습니다.

1) Restitution
Restitution은 복원력 또는 탄성계수와 같은 의미로 생각하시면 됩니다.
두물체가 충돌했을때 발생하며, 범위는 [0 - 1]입니다. 1은 얌체공과 같은 완전 탄성체를 의미하고, 0은 탄성이 전혀없는 물체를 나타냅니다.(Bullet에서 default값은 0입니다.)
A물체와 B물체가 충돌했을때, A와B의 Restitution은 두 물체 Restitution의 곱으로 결정 됩니다.
아래의 그림처럼 Restitution의 값을 바꾸어 가며 테스트 해보시면 됩니다.



2) Friction
Friction은 마찰력입니다.
접촉 되어 있는 두 물체 사이에 발생하며, 범위는 [0 - 1]입니다. 1은 두 물체사이의 미끄러짐이 전혀 없는 상태이고, 0은 얼음위에서 미끄러지는 것과 같은 상태입니다.(Default는 0.5입니다.)
A와B 사이의 Friction은 역시, 두 물체의 Friction의 곱으로 결정됩니다.
아래의 그림처럼 Friction의 값을 바꾸어 가며 테스트 해보시면 됩니다.



3) Damping
Damping은 물체가 움직일때, 그 속도에 대한 대기(공기, 물, 등등)의 저항력을 의미 합니다.
예를 들면, 물위에서 공을 던지면 잘 날라가지만, 물속에서는 조금 날아가다가 속도가 0이 됩니다. 이것은 공기의 Damping은 작고 물의 Damping이 크기 때문에 나타나는 현상입니다.
Damping의 범위는 [0 - 1]입니다. 0은 저항력이 전혀 없는 상태이고, 1는 저항력이 너무커서 움직이지 못하는 상태입니다.
아래의 그림처럼 Damping의 값을 바꾸어 가며 테스트 해보시면 됩니다.(Linear와 Angular로 나누어져 있지만 개념은 같습니다.)


아래 소스버전을 참조했습니다.


소스 빌드방법
빌드를 하기 위해서는 Bullet 2.79버전과 wxWidgets 2.8.12버전이 있어야 됩니다.


1) Bullet 빌드
Bullet 2.79는 앞의 Bullet설치 페이지를 참고 하시면 됩니다.

2) wxWidgets 빌드
(1) wxWidgets 2.8.12버전을 아래의 사이트에 다운 받습니다.
http://sourceforge.net/projects/wxwindows/files/2.8.12/wxWidgets-2.8.12.zip/download

(2)"wxWidgets-2.8.12\build\msw\wx.sln" 솔루션 열기를 합니다.(솔루션이 2005버전입니다 변환 메시지가 나오면 모두 "확인"을 누릅니다.)
Debug/Relase 모두, 아래의 그림처럼 솔루션 빌드를 합니다.(빌드 후, 오류가 있으면 다시 한번 솔루션 빌드를 합니다.)
 



3) 경로설정
(1) 소스의 압축을 푼 후, "RigidBody.sln" 솔루션 열기를 합니다.

(2) 속성창(Property Manager)을 열어 아래 그림처럼 Bullet 경로를  자신의 경로로 설정함.


(3) 속성창(Property Manager)을 열어 아래 그림처럼 wxWidgets 경로를  자신의 경로로 설정함.

4) 소스 실행

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

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

[Bullet Physics] RigidBody 만들기

물리 2012. 1. 5. 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] Bullet 물리엔진의 설치  (2) 2011.12.22

[Bullet Physics] Bullet 물리엔진의 설치

물리 2011. 12. 22. 12:53 Posted by 알 수 없는 사용자

인사하는 페이지가 없어 간단하게 인사를 하겠습니다. 저는 물리 프로그래머 조성현입니다.
앞으로 Bullet엔진에 대해서 부족하지만 글을 올리고자 합니다. 오늘은 Bullet엔진에 대해서 간단하게 소개를 드리고, 설치 방법에 대해 간략하게 설명하겠습니다.

1) Bullet 물리엔진
Bullet은 오픈소스 물리엔진입니다.
오픈소스 물리엔진은 ODE, Newton도 있지만, Bullet이 현재 가장 활발하게 운영되고 있고, 소스도 C++ 스타일로 매우 깔끔합니다.  그리고 Havok과 구조가 유사해서, TryHavok과 같이 공부하신다면 쉽게 익힐수 있습니다.

2) 다운로드 및 설치
1) 소스 받기
http://code.google.com/p/bullet/downloads/list 에서 최신버전을 다운 받습니다. 현재 최신버전은 2.79입니다.

2)예제 실생하기
bullet-2.79/msvc/vs2010/0BulletSolution.sln 을 실행합니다.
아래와 같은 예제들을 확인 합니다.


3)내 프로젝트에 Bullet 라이브러리를 추가 하기
"bullet-2.79/lib"에서 아래와 같은 라이브러리가 있는지 확인 합니다.(예제를 실행하면 생성됨)


없으면 예제를 실행시키거나 아래 그림처럼 라이브러리만 따로 빌드 합니다.


라이브러리를 확인 후, 내 프로젝트에 아래의 그림 처럼 "bullet-2.79/src"를  Include 경로에 추가 합니다.


아래의 그림처럼 "bullet-2.79/lib"를 라이브러리 경로에 추가 합니다.


마지막으로 "BulletCollision_debug.lib, BulletDynamics_debug.lib, LinearMath_debug.lib"(디버그 모드)를 아래와 같이 추가 합니다.


위의 과정을 거치면 설치는 끝납니다. 다음에는 World구성과 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