E D R S I H C RSS
ID
Password
Join
사람은 자기의 꿈―과거에 대한 추억의 꿈과 미래를 향한 열렬한 꿈―을 가져야 한다. 나는 새로운 목표를 향해 나아가기를 결코 멈추지 않으련다. ―모리스 슈발리에

 * 원문링크 - [http]http://www.gamedev.net/reference/articles/article914.asp

서문 #

네트워크 가상환경을 작성할 때의 일반적인 문제점은 인터넷 고유의 랙을 극복하는 것입니다; 이때문에 네트워크 가상환경을 작성할 때의 일반적인 문제점은 인터넷 고유의 랙을 극복하는 것입니다; 이때문에 플레이어는 새로운 데이타 패킷들이 혼합될때마다 플레이 공간상에서 경련을 일으킬 수 있습니다. 일반적인 해결방안은 패킷 전송주기를 증가시키고, 압축을 통하여 패킷 크기를 줄이는 방법이 있지만, 가장 많이 쓰이는 방법은 데드 레커닝(dead reckoning)을 들 수 있습니다. 이 아티클은 데드 레커닝 알고리즘상에서 3차 곡선을 도입하여 랙으로 인한 "경련"현상을 제거하는 기술에 대하여 설명하고자 합니다.

데드 레커닝이란 무엇인가? #

3차 곡선으로 바로 넘어가기 전에, 데드 레커닝에 대한 확실한 정의를 하도록 하죠. 프로그래머들은 이 기술을 사용하여 객체의 위치를 추정하도록 함으로서 게임상의 랙 효과를 줄입니다. 데드 레커닝은 객체의 특성에 따라 (위치값을) 추정합니다. 예를 들어, 객체가 시작위치와 속도를 가지고 있다면, 객체의 이동경로는 단순한 물리 법칙을 사용하여 알아낼수 있을겁니다. 생성된 경로는 객체에 적용될 수 있고, 부드러운 가짜 움직임을 만들어냅니다. 3차 곡선은 두 데이타 위치사이의 부드러운 변환 경로를 생성하기위한 데드 레커닝 기법중 하나입니다.

데드 레커닝에서 사용가능한 방법들 #

프로그래머가 하고자 하는 것은 객체의 현재 위치를 얻어내고 객체가 있을거라고 추정되는 위치까지의 부드러운 경로를 형성하는 것입니다. 몇몇 기술이 이부분에 적용이 가능합니다. 가장 기본적인 데드 레커닝 기법은 "포인트-포인트" 메소드입니다. 명칭이 의미하듯이, 이 메소드는 단지 플레이어가 데이타 패킷이 도착할때 새로운 위치로 이동하게끔 합니다. 평균 인터넷 랙을 200~300밀리초로 둔다면 이것은 두드러지게 "경련"을 일으키는 플레이어를 만들어냅니다. 이 메소드는 원격 플레이어가 절대적으로 가만히 있지 않다면 그의 화면상의 표시는 완전히 잘못되어 나타나므로 최악의 방법이라고 할 수 있습니다. 오류의 원인은 빠른 퀘이크 스타일 게임상의 데이타 패킷도 단지 초당 5~10회정도만 도착하며, 심지어 느린 게임 갱신은 초당 30프레임으로 갱신한다는 점에 있습니다. 플레이어를 부드럽게 움직이는 유일한 방법은 매 게임 프레임마다 한번씩 패킷을 보내는 것입니다. 이것은 대역폭에 무시무시한 과부하를 주므로, 포인트-포인트 갱신 방법은 실시간 게임상을 효과적으로 구현하는 것은 거의 불가능하다고 볼 수 있습니다.

새로운위치 = 이전위치
ptop.gif

다음 수준의 예측법은 "선형" 메소드입니다. 이 메소드는 다음 위치까지 직선 경로를 만들어 계산하는 방법입니다. 물리학의 견지에서 본다면, 이것은 객체가 다음에 어디에 나타날지를 결정하는데 사용하는 속도값을 의미합니다. 이 메소드는 랙으로 인한 불안정성을 줄여줍니다만 비극적인 약점을 하나 가지고 있습니다 : 이 방법은 사람들이 단지 일정한 상수 속도로만 움직인다고 가정하고 있습니다. 따라서, 생성된 실제 경로는 두드러지게 차이가 나게 됩니다 (심지어 게임이 "포인트-포인트" 메소드를 사용할 경우 더 나아지기도 합니다) 이 메소드를 사용하는 게임을 플레이해보면, 플레이어들은 직선으로 움직이는 것처럼 보이게 됩니다. 게다가, 플레이어가 새로운 선형 경로를 시작할 때마다 그 플레이어의 속도는 불쑥불쑥 바뀌게 됩니다. 결과는 전체적으로 현실감이 떨어지는 게임이 될 수 밖에 없습니다.

새로운위치 = 이전위치 + (속도 * 시간)
linear.gif

영리한 프로그래머는 이제 물어볼지도 모릅니다 : "왜 경로 공식에 가속도를 추가하지 않는거죠?" 그런 방식도 가능하며, 그러면 보다 더 부드러운 게임플레이를 가져오게 될 것입니다. 이것은 "2차 베지어" 메소드라고 불리며 이는 경로가 2차 베지어 함수를 사용하여 생성되기 때문입니다. 수학공식에 대해 세부적으로 설명하지 않겠습니다만, 이 메소드 또한 플레이어의 움직임이 보다 실제감있게 표현된다하지만 최종 속도가 부정확할 수 있기 때문에 좋은 방법이 아닙니다. 이것은 2차 베지어 함수에는 물리학자들이 말하길 소위 "경련" 또는 매시간당 가속도의 변화를 도입하고 있지 않기 때문입니다. 이제 마지막 해결책인 3차 곡선으로 진행해보도록 하죠.

새로운위치 = 이전위치 + ( 속도 * 시간 ) + ( 가속도 * 시간²)
quad.gif

3차 곡선은 데드 레커닝 경로를 생성하는데 있어서 가장 현실감을 주는 메소드중 하나입니다. 이것은 (시작위치/속도) 와 (최종위치/속도)로 계산하기 때문입니다. 결론적으로, 다음과 같은 3차 곡선 경로를 따르는 객체는 랙이 특별하게 심하지 않다면 불안정성을 가지지 않게 동작합니다.

cubic.gif

3차 곡선을 사용하기 #

경로를 생성하기위해 3차 곡선을 사용하는 것은 간단한 기하학 공식을 활용하는 것에 불과합니다. 이들 공식의 입력값은 4개의 (x,y) 좌표입니다. 첫번째 좌표는 객체의 시작점입니다. 비슷하게도, 네번째 좌표는 객체의 끝좌표를 의미합니다. 가장 중요한 좌표는 두번째와 세번째입니다: 이들은 객체의 속도를 나타냅니다. 두번째 좌표는 객체의 현재 속도에서 1초후에 나타나는 객체의 위치를 계산하여 이를 사용합니다. 3번째 좌표는 객체의 최종 위치 속도의 역방향 속도하에서 1초후의 위치를 계산하여 얻습니다. 이것은 (일정 상수 속도를 가정할때) 최종위치에서 1초 이전의 위치를 계산하는 것과 같습니다. 요약하자면:

1 단계 : 각 위치좌표(매개변수) 산출 #

  • 좌표1 = 시작위치
  • 좌표2 = 시작속도를 사용하여 계산된 1초 후의 위치 = 좌표1 + 시작속도
  • 좌표3 = 역방향의 최종속도를 사용하여 계산된 1초 후의 위치 = 좌표4 - 최종속도
  • 좌표4 = 최종위치

2 단계 : 계산공식 #

다음은 스플라인을 형성하는데 사용하는 매개변수처리된 공식입니다.
x = At³+ Bt²+ Ct + D
y = Et³+ Ft²+ Gt + H
t는 시간을 의미합니다. 이 시간값은 0~1사이의 값을 가지게 됩니다.

3 단계 : 나머지 공식들 #

매개변수들의 나머지 공식들을 공식화해보죠.

formula2.gif

4 단계 : 구현 #

한번 공식이 생성된 후에는, 게임안에서 그것을 구현할 방법을 결정하는 것만 남았습니다. 다음 방식이 간단하고 효율적입니다.
  1. 객체가 (속도와 가속도를 고려한) 물리법칙에 따라 움직이도록 합니다.
  2. 데이타 패킷이 도착하면 다음 위치까지의 스플라인을 생성하는 작업을 시작합니다.
  3. 스플라인의 좌표1과 좌표2은 현재위치와 속도를 사용하여 계산할 수 있습니다.
    좌표2 = 이전좌표 + 이전속도
    
  4. 좌표3과 좌표4는 계산하기 약간더 까다롭습니다. 우선 객체가 최종 위치에 다다르기 전에 거쳐가야하는 각 위치의 단계횟수를 구합니다. 이를 시간 t라고 놓도록 하죠. 좌표4를 계산하기위해 t초 이후의 최종위치를 산출하기위해 새로도착한 데이타 패킷을 사용합니다. 새로 계산된 시간에서의 속도를 산출하기위해 같은 정보를 사용합니다.
    좌표3 = 패킷좌표 + (패킷속도 * t) + (0.5 * 패킷가속도 * t²)
    좌표4 = 좌표3 - ( 패킷속도 + 패킷가속도 * t )
    
    이 메소드는 두가지의 데드 레커닝 방식, 3차 베지어 곡선과 2차(quadratic) 베지어 곡선 모션보간법을 조합한 것입니다. 결과는 보다 리얼하게 보이겠죠.
  5. T 프레임동안 스플라인을 따라 객체를 이동하도록 합니다.
  6. 스플라인 끝에 다다르면 1단계에서 다시 반복합니다. 결과는 다음과 같이 보일겁니다.

spline.gif

결론 #

이 아티클은 3차 곡선의 기초를 담고 있으며 2D 뉴톤 역학을 사용하는 모든 게임에서 사용할 수 있는 가상 코드를 제공하기위해 작성되었습니다. 제공된 공식들은 또한 3D 게임에서 사용하기위해 쉽게 확장가능합니다. 3차 곡선을 만드는 것은 쉽기 때문에, 실제로 이들을 구현하는 것은 독자들의 몫으로 남겨두도록 하겠습니다.

#

  • 진행방향벡터는 곡선의 접선벡터에서 구할 수 있습니다. 위의 3차 곡선 방정식을 t에 대하여 미분하여 얻어지는 공식에 원하는 t를 대입하면 해당 t에서의 벡터를 구할 수 있습니다. 온라인 자동차 레이싱나 온라인 비행기 배틀에는 꼭 필요할 수 있습니다.

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2010-10-28 12:42:52
Processing time 0.5858 sec