점 몇 개의 정보만으로 그 점들을 연결하는 곡선을 얻어야 할 때가 있습니다. 이럴 때에 가장 널리 쓰이는 방법이 스플라인(spline)을 이용하는 것입니다. 공식을 알려고 수치 해석 책을 찾아봤는데, 역시나 소스 코드로 돼 있지 않으니 어떻게 써먹어야 하는지 잘 모르겠습니다. -_-;

어쨌든 중요한 것은, 스플라인 중에서 B-spline 계열은 주어진 모든 입력 점을 통과하지는 않는다는 것입니다. 입력 점을 통과하지 않으면 직관적이지 못해서, 그 계열의 스플라인은 유용성이 좀 떨어집니다. 베지어(Bezier) 곡선도 B-spline의 일종이어서, 역시 모든 입력 점을 통과하지는 않습니다.

게임 쪽에서 가장 흔히 쓰이는 스플라인은 Catmull-Rom spline이라는 것입니다. 다행스럽게도 D3DX에서 제공되는 D3DXVec2CatmullRom 함수와 D3DXVec3CatmullRom 함수 등을 이용하면 쉽게 해결되는 것 같습니다. Catmull-Rom spline에 대한 간단한 소개는 http://www.mvps.org/directx/articles/catmull에 잘 나와 있습니다. http://www.cs.cmu.edu/~fp/courses/graphics/asst5/catmullRom.pdf의 설명도 괜찮은 것 같네요.

최종 공식만 정리하면, p = (-t * u + 2 * t * u * u - t * u * u * u) * p0 + (1 + (t - 3) * u * u + (2 - t) * u * u * u) * p1 + (t * u + (3 - 2 * t) * u * u + (t - 2) * u * u * u) * p2 + (-t * u * u + t * u * u * u) * p3이군요. 여기서 t는 0부터 1 사이의 값을 갖는 tension으로, 대개 0.5를 씁니다. u도 0부터 1사이의 가중치 값인데, p1에서 0이고 p2에서 1인 값입니다. Tension이 특정 값이 아닐 때엔 Cardinal spline이라고도 부르는 것 같은데, 정확히는 모르겠습니다.

좀 더 기교를 부리고 싶다면, <게임 프로그래밍 젬스(Game Programming Gems) 4>의 2.4절에 소개된 비균일 스플라인이라는 것을 쓰면 될 것 같습니다.
2007/05/19 13:34 2007/05/19 13:34

트랙백 주소 :: http://www.easyisright.net/trackback/352

댓글을 달아 주세요

  1. 디지츠 2007/05/19 14:17  댓글주소  수정/삭제  댓글쓰기

    내츄럴 스플라인을 이용해도 점을 지나는 곡선을 쉽게 구할 수 있는 것으로 압니다. :)
    http://www.cse.unsw.edu.au/~lambert/splines/natcubic.html

    • 조순현 2007/05/19 17:27  댓글주소  수정/삭제

      네, 그것도 있는데 왜인지는 잘 모르겠지만 Catmull-Rom이 더 자주 쓰인다고 하네요. Natural spline에서는 점 하나가 전역적인 영향을 주기 때문인 것인지...