본문 바로가기

IT/게임제작

[게임수학] 역탄도계산을 이용한 두점 사의 포물선 구하기

게임을 만들다보면 가장 큰벽으로 느껴지는것은 바로!! 

이미지!!

나는 프로그래머니까 항상 이미지때문에 골치가 아프다.

하지만 이미지나 그래픽관련 문제가 아니라 단순히 내가 프로그래머로써 

자괴감과 포기하고싶은 맘을 느끼게 해주는 것은 바로 수학이다.


아주 단순한 계기로 포물선구하기를 하게 되었다.

같은 게임 개발자 친구들이 발매한 겜을 하면서 무기들을 날리는 장면에서 

와~ 참 자연스럽게 날라간다~~ 라고 생각하고 있던중에

(이 자연스럽게가 어쩌면 가장 구현하기 어렵다.)

친구에게 연락이 되었고, 물어보면 아주 간단하게 말했다.


"그거 그냥 간단하게 2차 방적식만 쓰면 돼....수학도 아니야..산수지 산수"


친구의 말을 듣고 바로 테스트에 돌입!!

그리고  바로 좌절...

근의공식도 모르겠고, 탄도학이나 역탄도 계산은 더더욱 모르는 분야였다.

외국 사이트도 한국 사이트 다 뒤져보면 자세히 설명이 되어 있지만, 

나에게는 아무런 의미가 없다는것....

루트도 어떻게 계산해야 하는지도 까먹었기 때문에 거의 까막눈 수준이였다.


친구의 말이 생각나면서 아~ 그냥 관두는게 낳지 않을까?

고만하는게 좋을꺼 같애 라고 생각이 들었지만, 이 망할 프로그래밍은 이상항 중독성이 있기때문에

한 2일정도를 계속 잡고 개고생을 했다.


누군가에게는 단 10분안에 끝낼 공식을 나는 거의 15시간 이상 머리를 쥐어뜯어 가면서 고민했다.

결국 타이밍 실수였지만...


아무튼 구현 코드는 아래와 같다.



Vector3  vStartPos;   // 출발지

Vector3  vEndPos;    //목적지

Vector3  vPos;         // 현지 위치.



float fV_X;   // X축으로 속도

float fV_Y;   // Y축으로 속도

float fV_Z;   // Z축으로 속도


float fg;                         // Y축으로의 중력가속도 (9.8아님 밑에서 구해줌)

float fEndTime;                // 도착지점 도달 시간

float fMaxHeight  =  70;      // 최대 높이

float fHeight;                   //  최대높이의 Y - 시작높이의 Y

float fEndHeight;              // 도착지점 높이 Y - 시작지점 높이 Y

float fTime    = 0.f;          // 흐르는 시간.

float fMaxTime  = 1.6f;      // 최대높이 까지 가는 시간. 정해준다. 



<소스 구현>


fEndHeight  = vEndPos.y - vStartPos.y;


fHeight       = fMaxHeight - vStartPos.y;


fg   = 2 * fHeight  / (fMaxTime * fMaxTime);


fV_Y = sqrtf( 2 * fg * fHeight);


float a = fg;

float b = -2 * fV_Y;

float c = 2 * fEndHeight;


fEndTime  = (-b + sqrtf(b * b - 4 * a * c )) / ( 2 * a );


fV_X   = -(vStartPos.x - vEndPos.x) / fEndTime;

fV_Z   = -(vStartPos.x - vEndPos.x) / fEndTime;



 


<Schedule 부분.>


fTime +=  시간


vPos.x  = vStartPos.x + fV_X * fTime;

vPos.y  = vStartPos.y + (fV_Y * fTime) - (0.5f * fg * fTime * fTime);

vPos.z  = vStartPos.z + fV_Z * fTime;



간단히 설명하지만, 

우선 출발점과 도착점의 높이, 최고 높이와 그 최고높이 도달 시간등을 이용해서, 중력등을 구한다.

그리고 그 값을 이용해서 y축 힘을 구한다음.

y축이 올라갔다 도착점의 y축에 닿을때까지의 시간을 근의 공식으로 구한후

그 시간을 출발점과 도착점의 거리와 나눈다. 


근데 거지 같은데 근의 공식에서 괄호 하나 잘못 넣어서 거의 12시간을 머리가 쪼깨지도록 고생했다.

정말 나는 병신이거같다.


단순하지만 역시 수학공식을 넣은 움직임인 만큰 아주 자연스럽다. 

정말 게임 개발을 하면 할수록 수학의 위대함을 느끼고 

가끔식은 아름답다고 느껴진다.



그리고 아래의 그림은 만약 물건이 회전을 해야 한다면 어떤 식으로 해야 자연스러울까에 관한 그림이다.

출처가 미국 단검던지기 사이트에서 발췌해 온것인데,

뭔가 현기가 느껴지지 않는가?