이전에 가장 기초적인 효과를 나타내는 속도, 가속도에 따른 물리 프레임을 구현하였다.
하지만 단순한 선형 동역학 하나로는 전혀 실감나는 표현이 못 된다.
이번엔 오브젝트의 회전을 고려해 보고 다음번엔 오브젝트의 충돌을 고려해 보겠다.
우선 기존에 존재하던 Force를 좀 더 자세히 표현해보자. 기존의 Force는 모두 질점에 가해지는 힘으로
간주하였는데 이는 물체의 회전을 고려하지 않았기 때문이다. Force를 방향과 적용점으로 나타내자.
struct Force
{
D3DXVECTOR3 Vector;
D3DXVECTOR3 ApplicationPoint;
};
// 회전운동속성
AngleSet _CurrentOrientation; // 현방향
D3DXVECTOR3 _AngularVelocity; // 각속도
D3DXVECTOR3 _AngularAcceleration; // 각가속도
D3DXVECTOR3 _RotationalInertia; // 회전관성
D3DXVECTOR3 _Torque; // 회전력
기존 역학을 적용하던 것과 유사하다.
Force를 사용하여 토크를 계산하고, 토크와 관성 질량을 사용하여 각가속도를 구한다.
각가속도를 에 따른 각속도를 갱신하고, 각속도에 따른 회전각을 구한다.
이를 최종 DX 메트릭스로 표현하면 끝이다.
위 내용을 적용한 코드를 보자
void dynamicObject::Update(float dt) { D3DXMATRIX totalTranslation, totalRotations; ////////////////////////////////////////////////////////////////////////// // 선형 동역학 계산 ////////////////////////////////////////////////////////////////////////// assert(_Mass != 0); _LinearAcceleration = _Force.Vector / _Mass; _LinearVelocity += _LinearAcceleration * dt; _Location += _LinearVelocity * dt; D3DXMatrixTranslation( &totalTranslation, _Location.x, _Location.y, _Location.z ); ////////////////////////////////////////////////////////////////////////// // 회전 동역학 계산 ////////////////////////////////////////////////////////////////////////// // 충격력을 사용하여 토크를 계산한다. D3DXVec3Cross(&_Torque, &_Force.ApplicationPoint, &_Force.Vector ); // 토크와 관성 질량을 사용하여 각가속도를 계산한다. _AngularAcceleration.x = _Torque.x / _RotationalInertia.x; _AngularAcceleration.y = _Torque.y / _RotationalInertia.y; _AngularAcceleration.z = _Torque.z / _RotationalInertia.z; // 각가속도에 따른 각속도를 변경한다. _AngularVelocity += _AngularAcceleration * dt; // 각속도를 사용하여 회전 각을 계산한다. _CurrentOrientation.XAngle = _CurrentOrientation.XAngle + _AngularVelocity.x * dt ; _CurrentOrientation.YAngle = _CurrentOrientation.YAngle + _AngularVelocity.y * dt ; _CurrentOrientation.ZAngle = _CurrentOrientation.ZAngle + _AngularVelocity.z * dt ; D3DXMATRIX rotationX, rotationY, rotationZ; D3DXMatrixRotationX(&rotationX, _CurrentOrientation.XAngle); D3DXMatrixRotationY(&rotationY, _CurrentOrientation.YAngle); D3DXMatrixRotationZ(&rotationZ, _CurrentOrientation.ZAngle); totalRotations = rotationX * rotationY * rotationZ; // 월드 매트릭스로 적용 _WorldMatrix = totalRotations * totalTranslation; // 적용시킨 힘은 없애준다. D3DXVECTOR3 zeroVector = D3DXVECTOR3(0.0f, 0.0f, 0.0f); _Force.Vector = zeroVector; _Force.ApplicationPoint= zeroVector; }마지막으로 실행예제를 포함한다.
Picking 에 관한것은 DX Sample 을 찾아보자.
'Dev.Write' 카테고리의 다른 글
MFC Custom_Control 연습 (0) | 2010.01.15 |
---|---|
DX로 만든 첫번째 게임 프로젝트 (0) | 2010.01.08 |
물리 프레임의 기본 - 충돌(1) (0) | 2010.01.06 |
물리 프레임의 기본 – 선형 동역학 (2) (0) | 2009.12.11 |
물리 프레임의 기본 - 선형 동역학 (0) | 2009.12.11 |