이전에 가장 기초적인 효과를 나타내는 속도, 가속도에 따른 물리 프레임을 구현하였다.

하지만 단순한 선형 동역학 하나로는 전혀 실감나는 표현이 못 된다.

이번엔 오브젝트의 회전을 고려해 보고 다음번엔 오브젝트의 충돌을 고려해 보겠다.

 

우선 기존에 존재하던 Force를 좀 더 자세히 표현해보자. 기존의 Force는 모두 질점에 가해지는 힘으로

간주하였는데 이는 물체의 회전을 고려하지 않았기 때문이다. Force를 방향과 적용점으로 나타내자.

 

struct Force

{

    D3DXVECTOR3    Vector;

    D3DXVECTOR3    ApplicationPoint;

};

 

    // 회전운동속성

    AngleSet            _CurrentOrientation;    // 현방향

    D3DXVECTOR3            _AngularVelocity;        // 각속도

    D3DXVECTOR3            _AngularAcceleration;    // 각가속도

    D3DXVECTOR3            _RotationalInertia;        // 회전관성

    D3DXVECTOR3            _Torque;            // 회전력

 

기존 역학을 적용하던 것과 유사하다.

Force를 사용하여 토크를 계산하고, 토크와 관성 질량을 사용하여 각가속도를 구한다.

각가속도를 에 따른 각속도를 갱신하고, 각속도에 따른 회전각을 구한다.

이를 최종 DX 메트릭스로 표현하면 끝이다.

 

위 내용을 적용한 코드를 보자


dynamicObject.h dynamicObject.cpp
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 을 찾아보자.