맵 위에 캐릭터 A가 있다고 가정하자.
이 캐릭터의 회전은 어떻게 이뤄질까?
캐릭터, 즉 객체에는 각각 저마다의 공간이 있다. 이 공간을 로컬공간(Local Space)라고 하고, 이 로컬공간의 좌표를 로컬좌표(Local Matrix)라 한다.
이 캐릭터가 맵 위에 나오게 되면 맵의 좌표를 따라야 한다. 캐릭터의 좌표는 계속 변동이 되지만 그 좌표는 변하지 않는 맵의 좌표 위에서 변하는 것이다.
이 변하지 않는 공간을 우리는 월드공간(World Space)라고 하고 이 월드공간의 좌표를 바로 월드좌표(World Matrix)라고 한다.
캐릭터는 이 월드좌표 위의 특정 좌표에 존재하며 동시에 자신의 좌표를 가진다.
만약 이 캐릭터를 움직이려고 하는데, 캐릭터의 축과 월드좌표의 축이 다를 경우엔 어떻게 될까? 일반적으로 월드좌표를 기준으로 움직이게 된다면 캐릭터가 오른쪽을 바라보고 있다고 해도 앞으로 가는 키를 입력하면 앞으로만 가게 될 것이다.
이는 이동하는 방향의 단위벡터를 고정으로 주었기 때문에 발생하게 되는 문제이다.
#define ToRadian 0.0174533f
#define PI 3.1415926f
#define DIV2PI 1.5707963f
#define UP Vector2(cosf(rc.rotation + DIV2PI * 3.0f), sinf(rc.rotation + DIV2PI * 3.0f))
#define DOWN Vector2(cosf(rc.rotation + DIV2PI), sinf(rc.rotation + DIV2PI))
#define LEFT Vector2(cosf(rc.rotation + PI), sinf(rc.rotation + PI))
#define RIGHT Vector2(cosf(rc.rotation), sinf(rc.rotation))
if (INPUT->KeyPress(VK_UP))
{
//rc.position += Vector2(cosf(DIV2PI * 3.0f), sinf(DIV2PI * 3.0f)) * 200.0f * DELTA;
rc.position += UP * 200.0f * DELTA;
}
if (INPUT->KeyPress(VK_DOWN))
{
//rc.position += Vector2(cosf(DIV2PI), sinf(DIV2PI)) * 200.0f * DELTA;
rc.position += DOWN * 200.0f * DELTA;
}
if (INPUT->KeyPress(VK_LEFT))
{
//rc.position += Vector2(cosf(PI), sinf(PI)) * 200.0f * DELTA;
rc.position += LEFT * 200.0f * DELTA;
}
if (INPUT->KeyPress(VK_RIGHT))
{
//rc.position += Vector2(cosf(0), sinf(0)) * 200.0f * DELTA;
rc.position += RIGHT * 200.0f * DELTA;
}
기존에는 회전량과 관계 없이 정해진 방향으로만 움직일 수 있었지만 밑의 코드처럼 수정을 하게 되면 rc라는 객체가 회전을 하면 회전한 값을 더한 방향으로 객체가 움직이게 된다.
'프로그래밍 > 공부' 카테고리의 다른 글
[Game] 각도와 방향 (0) | 2023.01.01 |
---|---|
[Game] 객체의 회전 part.2 (0) | 2022.12.22 |
[Game] 변환행렬 (2) | 2022.12.15 |
[Programing] 정적 & 동적 라이브러리 (0) | 2022.12.15 |
[Game] Delta Time (0) | 2022.12.14 |
댓글