언어/기타

[고난도 시스템] 당구를 만들어 보자

by SSS posted Mar 12, 2007
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄

이번에 다뤄볼 시스템은 바로


 


당구,  빌뤼아~드    입니다  ㅡㅡ;


 


 


 


 


구상한건 벌써 1~2년전 이지만... 그때 잠시 시도하다가 엉뚱한데서 자꾸 막혀서


접어버린 시스템이죠 OTL


 


사실 2k 로 당구를 만들기란 참 어려웠습니다


힘의 배분이라거나 두 공이 부딧힐 경우 그 공들의 이동경로... 등등을 계산하는것이 2k의 사칙연산으로는 부족해서


좀 꽁수를 사용해서 억지로 끼워맞춘거라 1픽셀 단위지만 꽤나 큰 오차가 생기는 단점이 있기도 합니다만..


꽤나 재미있는(사람 피말리는) 연구였었죠    


 


이 글도 아마 2k비법이라기보다는... 거의 수학이 될거 같습니다 ㅡㅡ;


 


 


 


 


 


 


우선 당구를 만드는데 있어서 기본 설정(가정)은 한공이 멈춰있고 한공이 와서 부딧힐 경우 두 공이 튕겨나가는 각도는 90도,


그 속도는 두 공이 부딧히는 순간의 접선의 sin,cos 값에 비례하고 마찰 등으로 조금의 손실이 있다....   이지만


이제 실제로 맞는지도 모르겠고 나중에 나올 계산 등이 설정이랑 다를수도 있습니다 ㅡㅡ;    적당히 이해해 주시길.. ㅎㅎ


 


 


 


 


 


우선 공을 치는 것은 간단합니다    피타고라스를 이용해 원형으로 이동하는 조준점을 만들어서


조준점의 x,y*파워  의 속도로  이동을 시켜주면 되죠


 


그리고 나서 이제 공이 충돌하는 과정이 이 시스템의 대부분이라 할수 있는데요


 


 


우선 충돌 했는지를 판단하는것은 두 공의 거리를 이용합니다


두 공의 원점 사이의 거리가 구의 지름과 같을때, 충돌했다라고 판단 할수 있습니다


 


식으로 나타내자면 (구1x-구2x)^2 + (구1y-구2y)^2 <= 구지름^2     이 되겠죠


어느정도 오차가 생기기 때문에 = 가 아닌 <= 로 한것이구요


 


 


그리고 충돌을 했을 경우 공의 진로를 어떻게 변경 하느냐.. 하는것이 문제인데요


제 마음대로이지만 충돌시 힘의 이동을 계산하는 방법으로는


구1 -> 구2  로 가하는 충격과   구2 -> 구1 으로 가하는 충격을 동시에 적용시키면 될거 같았습니다


 


여기서 충격은 두 공의 접선에 수직인 방향으로 가해진다고 가정했고 구하는 방법은 다음처럼 했습니다..


 


구1,2의 접선과 구1의 속도벡터가 이루는 각 A 에 대한 sin 값 에 구1의 속도를 곱한 값이 충격량이 되고


구2의 중점의 x,y좌표에서 구1,2의 원점이 이루는 직선의 중점의 x,y좌표를 뺀 X,Y값을 이용해


(X,Y / r) * 충격량 만큼을 구2에 가산하고 구1에 감산한다.


 


여기서 이 각A가 제일 골치 아픕니다 ;;  접선만으로는 구할수가 없으니까요


어찌어찌 복잡하게 해서 구하긴 했었는데......   솔직히 기억이 안납니다 ㅜㅜ


 


그때는 미적분 삼각함수를 배우기 전이라 어려웠지만


지금생각해보니 삼각함수의 차(맞나?)  를 이용하면 구할수 있을거 같습니다만...


죄송합니다 그 공식도 기억이 안납니다 ㅡㅡ;    수능칠때도 안외웠던거라


 


하여간 구1과 구2를 바꾸어 역시 같은 계산을 반복합니다


 


 


 


 


접선를 구하는 방법은 두 구의 원점을 이은 선분을 90도 회전시키는것인데


원점의 좌표차를 이용해서 구한 선분이 (X,Y) 라면  법선은 (-Y,X),(Y,-X) 로 구하면 됩니다


 


그리고 여기서는 삼각함수가 필요하지만.. 2k에는 삼각함수가?  당연히 없죠


하지만 여기서 각도는 위의 A를 제외하고는 두 공의 접선 정도이니 그 접선의 기울기를 이용해서 삼각함수를 대신한것입니다..


우선 당구공은 구라서 두 공이 충돌 하는 순간 구의 원점사이의 거리는 구의 반지름의 두배, 즉 지름으로 항상 같기때문에


두 구의 원점x,y 좌표의 차 를 구의 지름으로 나누면 그것이 곧 sin,cos 값이 된다는 것...


귀찮고 오차가 생기는 제곱근 계산 등도 할필요가 없죠


 


 


 


그리고 실험은 안해봤지만 이대로 적용했을경우


 


두 구 중에서 한공만이 움직여서 부딧힐 경우에는 공이 충돌후 튕겨나가는 방향은 각각 


가해(?)구 는 접선의 방향으로,  피해(?)구 는 접선에 수직인 방향으로 튕겨나가고


그 속도는 가해구 는 구의 속도벡터와 두 구의 접선이 이루는 각의 cos 값,


피해구 는 그 각의 sin 값에 비례할것으로 예상됩니다... 


 


두 공이 모두 속도를 가지고 있다면 이래저래 해서 달라지겠지만요 ^^;


 


 


 


 


그리고 공이 벽에 부딧혓을 경우는 세로축에 부딧히면 X속도, 가로축에 부딧히면 Y속도의  부호를 바꿔주어


튕겨나오는 효과를 만듭니다


 


 


 


 


 


 


이것을 적용시키는 자세한 방법이라거나 사분면에 따른 법선,충격의 부호 설정 등등


다른 자잘한 부분은 생략 하도록 하겠습니다 ㅡ0ㅡ   그거까지 쓰려면 시간이 얼마나 걸릴지...


 


그리고 좀 건방지게 보일수도 있지만 우선 가장 큰문제는 이런 계산 들이니 이걸 이해하고 만들 분이라면


그런 부분은 쉽게 해결하실거라고 믿습니다 ^^;


 


 


사실 제가 쓰고도 이게 뭔가 싶어서 자세한 설명을 쓰려니 막막하기도 하구요 ㅋ