Cardinal Spline with tension

게임 프로그래밍을 하면 자주 만나게 되는 것이
점들간의 보간 곡선을 구하는 것입니다.

칼의 경로에 따라 이펙트를 그리거나,
카메라의 이동 경로를 구할 때 주로 많이 쓰는데요,
그 외에도 다양하게 이용할 수 있죠.

베이지어 곡선은 우리가 많이 들어봐서 압니다.
포토샵에서 컨트롤 포인트 한두번은 땡겨 보셨을 겁니다.

몇개의 점이 있다면 우리는 베이지어 곡선을 이용해서
그 점들과 비슷한 보간을 해주는 선을 그려낼 수 있습니다.
단, 베이지어 곡선의 문제점은 점들을 지나는 것을 보장하지 않습니다.
즉, 점들 사이를 대략적으로 지나게 되는 것이죠.

그런 이유 때문에 실전에서는 잘 쓰이지 않습니다.

더 많이 쓰이는 것이
Cat-mul-rom Spline과 Cardinal Spline인데요,
Hermite Curve 의 subset이 Cardinal Spline이고, Cardinal Spline의 subset이
Cat-mul-rom Spline입니다.

Cocos2d-x에서는 컨트롤 포인트를 주고 에니메이션을 따라 이동할 수 있도록
제공해주는 클래스가 있는데요, 바로

정도가 있습니다.
그 중에서도 개인적으로 가장 유용하게 쓰는 녀석은 Cardinal Spline입니다.
일단 커브 보간을 하는 모든 점들을 반드시 지나는 것을 보장합니다.
둘째로 점 보간 사이의 이동이 시간에 따른 변화가 없이 일정합니다.

따라서 Speed Factor 등이 필요하지 않는 한
대부분 Cardinal Spline 선에서 해결 가능합니다.

Cardinal Spline은 tension 값을 인자로 받는데요,
1이면 완전 부드럽게~, 0이면 직선으로 잇도록 합니다.
텐션 값을 조절해서 이동의 유연성을 설정할 수 있겠죠.

Cat Mul Rom의 경우에 DirectX에서는 최소 4개의 점을 필요로하는데요,
2개는 컨트롤 포인트 2개는 노멀 포인트로 쓰여집니다.

Spline 곡선을 잘 이용하면
에니메이션과 카메라, 캐릭터의 이동 등에서 부드러운 시뮬레이션 등이 가능하고,
멋진 이펙트도 붙여 낼 수 있습니다.

학부 수치해석 시간에 사실 데이터 보간 커브 종류에 대해서
달달달 외워서 공부했는데 다까먹었습니다.
그 때 교수님께서 이런건 게임 프로그래밍에서 이러이러한 때 쓰이니까 잘 알아둬… 라는
말씀 한마디만 해주셨더라면 제가 더 열심히 공부했었을까요?
아니겠죠? -_-;

사실 이런 커브들의 보간 방법과 계산에 대한 자세한 지식이 필요하다기보다는
이런 커브들이 있고 이러이러한 때 쓰면 된다는 것을 아는 것이 중요합니다.

대부분의 커브들은 개발자가 날밤을 까며 최적의 코딩으로 구현한다 할지라도
이미 그보다 더 좋은 라이브러리로 구현이 다 되어서 나와 있으니까요…

좋은 모듈을 적재적소에 잘 갖다 쓰는 것이 실력입니다.