언어/기타
2007.03.12 00:23

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

SSS
조회 수 1197 추천 수 3 댓글 5
?

단축키

Prev이전 문서

Next다음 문서

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

단축키

Prev이전 문서

Next다음 문서

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

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


 


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


 


 


 


 


구상한건 벌써 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ㅡ   그거까지 쓰려면 시간이 얼마나 걸릴지...


 


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


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


 


 


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

?
  • ?
    시오르 2009.03.01 01:30
    sin, cos, tan 이라고 피타고라스 정의에서 나옵니다..... orz
  • ?
    봉팔이 2009.03.07 02:55
    충돌시 튕겨져 나가는 방향 설정에 헛점이 있는듯 합니다..
    가해구와 피해구에 정면 충돌시 가해구의 진행방향과 두 공의 접선 각이 수직인 상태가 되는데,
    이때 가해구가 접선방향으로 튕겨져 나가는 방향에 문제가 되는거 같군요.

    연구해볼 가치가 있습니다. ㅋㅋㅋ
  • ?
    봉팔이 2009.03.07 03:04
    가해구가 피해구와의 접선면에 진입하는 각을 구하면 어찌 되겠는데..

    역시 생각을 좀더.. ㅋㅋㅋ
  • ?
    SSS 2010.06.28 17:35
    뜬금없이 글검색하다 리플하나 달고 가야지

    정면충돌의 경우는 계산에 따라 가해구의 진행방향은 접선이긴 하지만, 모든 충격량이 피해구에 전해져 속도가 0이 되기 때문에 정지하게 됩니다
  • ?
    Kirix 2009.03.08 19:00
    ,,,어려워요..

  1. 렉없는 자동세이브 스크립트!!!

    Date2007.04.22 Category언어/기타 By귀찮아‡ Views1474
    Read More
  2. [DX&C++] 3D를 넘어 2D로!

    Date2007.04.18 Category언어/기타 ByZeprod Views1675
    Read More
  3. 코드진행 기초테크닉

    Date2007.04.14 Category언어/기타 By나그네M Views709
    Read More
  4. 그림 메뉴 2 [제 2의 타이틀 메뉴 (기본 메뉴편)] [거히 치트비법..]

    Date2007.04.12 Category언어/기타 By우드록맨 Views771
    Read More
  5. 마우스 이동 스크립트

    Date2007.04.11 CategoryRPG Maker By아크로s Views1965
    Read More
  6. '에피소드'형식이 아닌 '화' 형식의 시나리오는 어떨까요?

    Date2007.04.09 Category언어/기타 By우드록맨 Views1529
    Read More
  7. [초 노가다 시스템]그림 메뉴

    Date2007.04.08 CategoryRPG Maker By우드록맨 Views880
    Read More
  8. [DX&C++]3D공간상 카메라 시점의 대한 정의

    Date2007.04.02 Category언어/기타 By실베 Views1351
    Read More
  9. [DX&C++] IndexBuffer를 알아보자!

    Date2007.03.31 Category언어/기타 ByZeprod Views1240
    Read More
  10. 3D좌표계에 3D물체를 찍기위환 기초과정

    Date2007.03.31 Category언어/기타 By실베 Views1355
    Read More
  11. [공개자료] 먼치킨 액알 만들기

    Date2007.03.30 Category언어/기타 By책벌레공상가 Views2499
    Read More
  12. [DX&C++] 3대 행렬 연산의 사용

    Date2007.03.30 Category언어/기타 ByZeprod Views1404
    Read More
  13. 숫자 게이지 색에 관한 팁

    Date2007.03.30 Category언어/기타 By『덩키동크』 Views1427
    Read More
  14. [DX&C++] 3D를 다루는 프로그램의 개요

    Date2007.03.25 Category언어/기타 ByZeprod Views1247
    Read More
  15. template에 관한 간단한 예.

    Date2007.03.12 Category언어/기타 By김두한 Views1180
    Read More
  16. [고난도 시스템] 당구를 만들어 보자

    Date2007.03.12 Category언어/기타 BySSS Views1197
    Read More
  17. 2D격투게임만들기95

    Date2007.03.08 Category언어/기타 By황금잉어빵 Views2410
    Read More
  18. 1 - 1. 변수 응용 프로그램 만들기 (난수)

    Date2007.03.06 CategoryRPG Maker By천영진 Views1279
    Read More
  19. 몬스터 성향

    Date2007.03.04 Category언어/기타 By괴인X Views1256
    Read More
  20. [DX&C++] 3D 공간에 대한 이해

    Date2007.03.04 Category언어/기타 ByZeprod Views1247
    Read More
Board Pagination Prev 1 ... 4 5 6 7 8 9 10 11 12 13 ... 51 Next
/ 51






[개인정보취급방침] | [이용약관] | [제휴문의] | [후원창구] | [인디사이드연혁]

Copyright © 1999 - 2016 INdiSide.com/(주)씨엘쓰리디 All Rights Reserved.
인디사이드 운영자 : 천무(이지선) | kernys(김원배) | 사신지(김병국)