Game Development, 게임개발/게임 수학,물리

게임 물리 - 등속 직선 운동

게임이 더 좋아 2021. 8. 19. 16:12
반응형
728x170

 

물리를 고등학교에서 처음 접했다면 솔직히 생각은 안나지만 가장 처음 접한 운동이

등속 직선이 아닌가 싶다.

 

등속 직선 운동이란

일정한 속도로 직선으로 이동을 한다고 생각하면 된다.

 

여기서 핵심은 속도가 변하지 않는다는 것이다.

운동 중에 운동 방향 속력이 바뀌지 않는 다는 것이다.

** 등속도 운동과 같다. (속도는 속력+ 방향이라 배웠다면)

 

 

 

우리는 일반적으로 속력, 거리, 시간으로 나누어서 관찰한다. 

위의 그래프를 보면서

시간을 기준으로 나머지 것들을 한 번 살펴보자.

 

 

게임에서의 모든 이동은 아니지만 일반적으로 FPS를 보았을 때

내가 가장 먼저 접한 FPS가 서든 어택이다.

 

 

W를 누르면 앞으로 이동

S를 누르면 뒤로 이동

A,S를 누르면 좌우 이동이 되었다.

 

또한 좌우로 눌렀을 때는 제자리 이동이 되었다.

(하지만 움직이지 않아도 될 것을 발은 걷고 있어서 모션은 걷는 모션이었다)

 

아무튼 이 당시 서든어택에서는 달린다는 개념이 전혀 없었다.

즉, 모든 이동은 같은 거리를 이동하는 등속운동이었다.

 

매 프레임마다 사용자 입력을 받아서

실제로 캐릭터를 움직이게끔 하는 것이다.

 

뭐 아래와 같이

1. 매 프레임마다 사용자 입력 받음

2. 해당 입력이 유효한 입력일 경우 

3. 입력에 맞는 함수 호출

** 주의할 점은 else if로 하게 될 경우 동시 입력은 받을 수 없다는 말이다.

# 코드 알고리즘

int MoveCharacter(void){


	if(buttonW){
    ~~
    }
    
    if(buttonA){
    
    }
    
    ...
    
    
    if(buttonD){
    
    ~~
    }
    
    
}

 

 

이렇게 사용자 입력으로 이동이 가능해졌다.

 

 


 

그게 끝일까?

 

 

UI에서 View가 즉, 사용자 화면이 고정되어 있다면

해당 게임 오브젝트는 사용자가 보지 못하는 곳으로 나가면 안될 것이다.

 

즉, 움직임에 제한을 줘야한다는 말이다.

 

카메라의 크기를 기준으로 하거나 임의로 정해서

내 캐릭터가 벗어나지 않도록 한다.

 

2D이며 내가 (0,0)에 있고 카메라가 -10< x < 10 , -10< y < 10 을 비춘다면

캐릭터의 위치도 매 프레임마다 업데이트해서

범위에 벗어나는 것에 대해서 처리를 해줘야 할 것이다.

** 범위를 지정할 때 힘에 따른 이동인지 직접 position 이동인지가 중요하긴 하다.

 

[Unity, 유니티/Programming, 응용] - GameObject 움직이는 여러가지 방법 [Unity]

 

아무튼 그에 따른 처리를 해줘야 한다.

 

 


 

그게 끝일까?

 

서든 어택은 

동시 키 입력이 가능했다.

 

우리는 X,Y 축의 이동만 가능했지만 동시에 같이 이동할 경우 대각선으로 이동이 가능했다.

**하지만 X,Y축의 속력이 같기 때문에 45도 이동이라고 보면 되겠다.

 

같이 눌러보면 이상한 점을 깨달을 것이다.

 

?? 어 대각선 이동이 더 빠른데??

 

그렇다.

우리가 해당 방향을 이동방향, 속력을 벡터의 크기라고 봤을 때

X,Y 벡터를 합성하면 그 크기는 root 2가 된다.

즉, 1보다 커진다. 대각선으로 이동하는 것이 빨라진다는 말이 나온다.

 

우리는 등속 직선 운동이지만 동시입력을 받아 해당 벡터들이 합성이 되었을 때

크기가 달라지는 것을 알게 되었다.

 

어떻게 처리를 해야할까?

 

사실

나는 간단히 이렇게 처리했다.

사용자 입력으로는 해당 방향만을 정규화해서 받아서 그 후 속력을 곱해주어서 이동이 가능하게 했다.

즉, w를 누르면 +y 방향으로 1, a를 누르면 -x 방향으로 1 (-1을 말함)

w,a를 누르면 3pi/4 방향으로 1 을 가지게 했다.

 

즉, 어떤 방향이라도 합성 후 normalize를 했기 때문에 실제로 우리가 속력과 방향을 지정하는 아래와 같은 방식

보다는 편리하게 다룰 수 있었다.

func(buttonW)
{
	charPos.x += 1;
}

 

위와 같은 방식으로는 

대각선 이동임을 감지한 후 대각선 이동일 때 해당 속력을 root 2 로 나누는 작업이 필요할 것이다.

 

 

 

게임의 기본인 이동, 그 중에서도 등속 직선에 대해서 고찰해보았다.

 

 

반응형
그리드형