행복한 하루

[Unity] 게임을 위한 거리, 속도 매크로 소스 본문

Unity/Math

[Unity] 게임을 위한 거리, 속도 매크로 소스

변화의 물결 2023. 3. 26. 16:18

 

안녕하세요.

 

 현실세계에서 잘 알고 있는 거리와 속도를 조금 프로그램 내에서 어떻게 하는지 확인해보고자 합니다.


1. 거리에 간략한 내용확인

  - 현실 세계의 거리단위는 cm, m, km 등을 사용합니다. 그러나 게임은 좌표이동 혹은 프레임에 관점에서 접근을 해야 합니다. 이번에 테스트해 볼 것은 프레임당 이동하는 거리를 어떻게 구하는지 확인해 보는 내용입니다.

  프레임이라고 하면 정지된 이미지 하나를 말하고 초당 프레임이라고 하면 이런 정지된 이미지가 초당 몇 번 정도 바뀌는지를 말합니다. 그것이 바로 FPS(Frames Per Second)라고 합니다.

 

  그래서 현실과 조금 다르게 1초를 FPS에 따라 다시 거리로 나누어지게 됩니다. 즉, FPS가 60이라고 한다면 1초에 60장면이 만들어지고 물체가 1초에 60번을 움직이게 되므로 이동거리를 60으로 나누면 프레임당 이동거리를 알 수 있습니다.

2. 속도에 관한 간단한 내용

  위에서 거리를 먼저 알아본 것은 속도의 변수 중에 하나가 거리이고 다음이 시간이기 때문입니다. 시간은 우리가 잘 알고 있는 초, 분, 시로 이루어져 있습니다.  이 두 가지의 변수로 현실세계에서 속도를 구할 수 있습니다. 바로 속도는 시간단위만큼 얼마나 이동가능한가를 나타내는 단위입니다.

 

  - 속도가 30m/s이라면 1초에 30m를 이동할 수 있다고 보는 것입니다. 그러나 게임에서는 프레임이라는 개념이 있기 때문에 프레임 단위로 나누어서 보면 30m/s로 이동하는 물체를 프레임당 30/60(fps) 해서 프레임당 0.5m씩 이동해야 하는 결론이 나옵니다.

3. 소스 확인

  - 위와 같은 내용을 쉽게 확인하기 위해서 책에서 매크로를 소스를 제공해주고 있습니다. 여기에 조금 수정해서 기준 거리 단위를 수정할 수 있게 해서 변화를 주었습니다.

  매크로에서 기준되는 거리 단위(UNIT_DISTNACE)를 먼저 선택해 준 다음,  거리 단위 변환 그리고 프레임당 이동 거리를 확인할 수 있습니다.

 

 - 기본 내용은 60 fps에서 기본 거리 단위를 km로 한 경우입니다.   

#include <stdio.h>

#define FPS (60)
//#define FPS (30)

#define UNIT_mm		0
#define UNIT_cm		1
#define UNIT_m		2
#define UNIT_km		3

//Select Unit of distance
#define UNIT_DISTNACE  UNIT_m 

//Second
#define SECOND(_sec)	((_sec)*FPS)
//Minute
#define MINUTE(_min)	((_min)*60)
//Hour
#define HOUR(_hour)		((_hour)*60)

// m/s 
#define M_S(_speed)		(M(_speed) / SECOND(1.0f))
// km/h
#define KM_H(_speed)	(KM(_speed) / HOUR(1.0f))



//cm reference distance macro
#if UNIT_DISTNACE == UNIT_cm
	//mm 
	#define MM(_mm)			(CM(0.1f*(_mm)))
	//cm
	#define CM(_cm)			(_cm)
	//m
	#define M(_m)			(CM(100.0f*(_m)))
	//km
	#define KM(_km)			(M(1000.0f*(_km)))
	
	#define UNIT_DISPLAY	"cm"

#elif UNIT_DISTNACE == UNIT_m
	//mm
	#define MM(_mm)			(CM(0.1f*(_mm)))
	//cm
	#define CM(_cm)			(M(0.01f*(_cm)))
	//m
	#define M(_m)			(_m)
	//km
	#define KM(_km)			(M(1000.0f*(_km)))

	#define UNIT_DISPLAY	"m"

#elif UNIT_DISTNACE == UNIT_km
	//mm
	#define MM(_mm)			(CM(0.1f*(_mm)))
	//cm
	#define CM(_cm)			(M(0.01f*(_cm)))
	//m
	#define M(_m)			(KM(0.001f*(_m)))
	//km
	#define KM(_km)			(_km)

	#define UNIT_DISPLAY	"km"
#endif


#define M_S2(_acc)			(M(_acc) / (SECOND(1.0f) * SECOND(1.0f)))

int main(void) {

	printf("1mm -> %f\n", MM(1.0f));
	printf("1cm -> %f\n", CM(1.0f));
	printf("1m -> %f\n", M(1.0f));
	printf("1km -> %f\n\n", KM(1.0f));

	//Distance moved per frame
	printf("30m/s -> %f %s\n", M_S(30.0f), UNIT_DISPLAY);
	printf("60km/h -> %f %s\n", KM_H(60.0f), UNIT_DISPLAY);
	 
	return 0;

}

 

  - 실행한 결과

 

 

<참고 자료>

1. [도서] 게임을 움직이는 수학과 물리

speed_example.cpp
0.00MB

 

Comments