목표를 향해 자동으로 기수를 돌리는 비행기

게임의 인공지능에 관한 포럼입니다.

Moderator: 류광

Locked
비회원

목표를 향해 자동으로 기수를 돌리는 비행기

Post by 비회원 »

3D 비행기 게임을 하나 만들어보고 있는 중입니다.

게임 상에서 비행기는 Pitch와 Roll 만을 사용하여 움직입니다. 만약 좌측으로 가려면 일단 전방 벡터를 축으로 회전하고 우향 벡터를 기준으로 회전해야지만 가능합니다.. (Yaw를 사용하지 않습니다. 그래서 참으로 난감하게 되었습니다. ㅠ_ㅠ)


아군 비행기야 사용자가 직접 조작하므로 문제가 생기지는 않는데 적 비행기를 만들려고 하니 뭔가가 많이 힘들고 어렵다는 생각이 번쩍 드네요.. 삽질만 계속하다가 조언을 얻으려고 글을 올립니다.


적군의 움직임을 제어하는데 사용하려는 클래스입니다.

// 적군 관리 클래스
class CEnemyManager
{
private:
// 적군의 상태 상수
// 0 : 일반 비행
// 1 : 추적 비행(아군 비행기 추적)
// 2 : 공격 비행(공격)
// 3 : 회피 비행(아군 비행기에서 멀어지려고 노력함)
enum { ENEMY_NORMAL = 0, ENEMY_CHASE = 1, ENEMY_ATTACK = 2, ENEMY_FLEE = 3 };
int m_State; // 적군 상태

int m_Health; // 적군
float m_fSpeed; // 적군의 속도
bool m_bLife; // 적군의 생명

D3DXVECTOR3 m_vRight; // 적군의 우향 벡터
D3DXVECTOR3 m_vUp; // 적군의 상방 벡터
D3DXVECTOR3 m_vLook; // 적군의 전방 벡터
D3DXVECTOR3 m_vPos; // 적군의 위치

D3DXMATRIX m_matEnemy; // 적군의 행렬

CTimer m_EnemyTimer; // 적군 타이머(행동 타이머)

public:
CEnemyManager()
{
m_vRight = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
m_vPos = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
m_vLook = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
m_vUp = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
D3DXMatrixIdentity(&m_matEnemy);
m_Health = ENEMY_MAXHEALTH;
m_fSpeed = ENEMY_MINSPEED;
m_bLife = false;
m_State = ENEMY_NORMAL;
m_EnemyTimer.SetOn(1000, 1000);

}
~CEnemyManager() {}

void GetMatrix(D3DXMATRIX* V) // 변환된 최종 행렬
{
// 오브젝트의 좌표계를 고정시켜준다.
D3DXVec3Normalize(&m_vLook, &m_vLook);

D3DXVec3Cross(&m_vUp, &m_vLook, &m_vRight); // 전방 벡터와 우향 벡터의 외적
D3DXVec3Normalize(&m_vUp, &m_vUp);

D3DXVec3Cross(&m_vRight, &m_vUp, &m_vLook); // 전방 벡터와 상향 벡터의 외적
D3DXVec3Normalize(&m_vRight, &m_vRight);

// 회전 행렬 만들기
(*V)(0,0) = m_vRight.x;
(*V)(0,1) = m_vRight.y;
(*V)(0,2) = m_vRight.z;
(*V)(0,3) = 0.0f;

(*V)(1,0) = m_vUp.x;
(*V)(1,1) = m_vUp.y;
(*V)(1,2) = m_vUp.z;
(*V)(1,3) = 0.0f;

(*V)(2,0) = m_vLook.x;
(*V)(2,1) = m_vLook.y;
(*V)(2,2) = m_vLook.z;
(*V)(2,3) = 0.0f;

(*V)(3,0) = m_vPos.x;
(*V)(3,1) = m_vPos.y;
(*V)(3,2) = m_vPos.z;
(*V)(3,3) = 1.0f;

}

D3DXVECTOR3 GetPosition() // 물체의 위치 리턴
{
return m_vPos;
}
void SetPosition(D3DXVECTOR3* pos) // 물체의 위치 설정
{
m_vPos = *pos;
}
void SetSpeed(float speed) // 물체의 속도 설정
{
m_fSpeed = speed;
}
float GetSpeed() // 물체의 속도 리턴
{
return m_fSpeed;
}

void Accelate() // 물체의 가속
{
m_EnemyTimer.Update();
switch(m_State)
{
// !?!?!?!?!?!?!?!? 덜덜덜
}
m_vPos += m_vLook * m_fSpeed;
}

D3DXVECTOR3 GetLook() // 전방 벡터 리턴
{
return m_vLook;
}
D3DXVECTOR3 GetRight() // 전방 벡터 리턴
{
return m_vRight;
}
D3DXVECTOR3 GetUp() // 전방 벡터 리턴
{
return m_vUp;
}

void SetPitch(float angle) // 우향벡터를 축으로 회전
{
D3DXMATRIX T;

D3DXMatrixRotationAxis(&T, &m_vRight, angle);

// 상향 벡터와 전방 벡터를 T 회전 행렬만큼 회전시켜준다.
D3DXVec3TransformCoord(&m_vUp,&m_vUp, &T);
D3DXVec3TransformCoord(&m_vLook,&m_vLook, &T);
}
void SetYaw(float angle) // 상향벡터를 축으로 회전
{
D3DXMATRIX T;

D3DXMatrixRotationAxis(&T, &m_vUp, angle);

// 우향 벡터와 전방 벡터를 T회전 행렬만큼 회전시켜준다.
D3DXVec3TransformCoord(&m_vRight, &m_vRight, &T);
D3DXVec3TransformCoord(&m_vLook, &m_vLook, &T);
}
void SetRoll(float angle) // 전방벡터를 축으로 회전
{
D3DXMATRIX T;

D3DXMatrixRotationAxis(&T, &m_vLook, angle);

// 상향 벡터와 우향 벡터를 T 회전 행렬만큼 회전시켜준다.
D3DXVec3TransformCoord(&m_vUp,&m_vUp, &T);
D3DXVec3TransformCoord(&m_vRight,&m_vRight, &T);
}

void Apply(LPDIRECT3DDEVICE9 pd3dDevice, CEnemy* Enemy) // 월드에 적용 및 그리기
{

Accelate();
GetMatrix(&m_matEnemy);
pd3dDevice->SetTransform(D3DTS_WORLD, &m_matEnemy);
Enemy->Render(pd3dDevice);
}

};


렌더링 하는 부분에서 Apply()를 호출해줘서 자동으로 행동을 제어하려고 합니다.

그러나 위에서 말씀드렸듯이 Yaw를 사용하지 않으니 목표로 비행기답게 이동하게 하기 위해서 대체 어떤 방식을 해야 할지 막막합니다. 중간에 Accelate() 부분에서 적군 비행기를 가속도 시키면서 Roll과 Pitch를 조정하려고 하는데..

조언 좀 부탁드릴께요. 막막하네요..;
비회원

음 일단..

Post by 비회원 »

음.. 목표의 벡터와 현재 기체의 벡터의 외적으로 나온 벡터로 축회전을 해주고, 그 회전에 맞춰 전방, 상향, 우향 벡터도 회전시켜줬습니다. 이렇게 하니 가라성은 있지만 그나마 비행기 답게 목표를 향해 움직이긴 하네요.. 좀 더 나은 방법은 없을까요? ㅜㅜ
올로
Posts: 73
Joined: 2005-04-26 15:54

Steering Behavior 를 사용해심이 어떠신지...

Post by 올로 »

Steering Behavior

비행기나 자동차 제어 등에 쓸만한 방식입니다.
목적지까지 이동이라면 Arrival을 쓰시면 되겠구요
Image

물체 추적이라면 seek 혹은 pursuit을 쓰시면 되겠습니다.
Image
Image

실용적 예제로 본 게임인공지능 프로그램하기 란 책에도 잘 설명되어 있습니다.
올로
Posts: 73
Joined: 2005-04-26 15:54

추가로...

Post by 올로 »

Autonomous Behaviors for Interactive Vehicle Animations라는 논문도 있습니다.
약간 다른 방식이긴 하지만 이것도 좋은 참고거리가 되실거라보입니다.
Remisa
Posts: 290
Joined: 2006-07-10 02:25

Post by Remisa »

올로님이 올려주신 사이트.. 멋지네요.
찾아보니 C++ 라이브러리도 만들어 놨군요.

마침 제가 여기 딱 맞아떨어지는 프로젝트를 하고 있긴 한데
저는 임기응변식으로 인공지능 짜는 일에 더 능숙한 관계로.. 공부는 언제나 skip skip~
비회원

답변 올려주신 분들 감사드립니다 .^^

Post by 비회원 »

많은 참고가 되었습니다.
ka7713
Posts: 1
Joined: 2009-07-14 10:42

Post by ka7713 »

올로님이 올려주신 사이트.. 멋지네요.
찾아보니 C++ 라이브러리도 만들어 놨군요.
opensteer 말씀하시는건지?
Locked