> For the complete documentation index, see [llms.txt](https://lee-seokhyun.gitbook.io/game-programming/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://lee-seokhyun.gitbook.io/game-programming/client/easy-mathematics/gdc2012/catmull-rom-splines.md).

# 캣멀-롬 스플라인(Catmull-Rom Splines)

캣멀-롬 스플라인은 3차 허밋 스플라인에서 시작(U)과 끝(V) 지점의 속도 벡터를 결정하기 위한 특정한 값을 가진 스플라인 입니다. 새로운 스플라인 이라기 보다는 3차 허밋 스플라인을 구현하기 위한 기술이라고 생각해도 좋습니다.\
각 지점을 통과하는 곡선을 구현하려면 여기서 설명하는 캣멀-롬 스플라인이 좋은 방법입니다.

### 캣멀-롬 스플라인 그리기

먼저 시작점과 끝점, 그리고 각 노트들을 의미하는 일련의 점들부터 그려봅시다.

![](/files/-Lpr2RCo3o-t1L12TI8Z)

스플라인의 시작과 끝지점에서의 속도는 0으로 가정합니다(여기서는 0과 6지점).<br>

점 0에서 2로 가는 벡터를 구합니다. $$(Vec\_0to\_2 = P2 – P0)$$&#x20;

![](/files/-Lpr3wLpdX2KdMJ8j1Cf)

이 벡터가 점 1에서의 접선이 됩니다.

![](/files/-Lpr49plYzfmm-SkyuZJ)

이제 이 벡터를 반으로 줄입니다.

![](/files/-Lpr4HuQUFe6GCvbAJNc)

짠! 이제 점 0과 1 그리고 각각의 속도벡터가 생겼으니 허밋 곡선을 그려봅시다.

![](/files/-Lpr4X8YtdpRKAHWVQqy)

이제 점 1에서 3으로 가는 벡터를 계산해 봅시다. $$(Vec\_1to\_3 = P3 – P1)$$&#x20;

![](/files/-Lpr5Dq51p159BzuG79h)

이 벡터는 점 2를 위한 접선이 될것입니다.

![](/files/-Lpr5KrYhnUmrPxaec04)

이 벡터도 반으로 줄입니다.

![](/files/-Lpr5UeRg1Zx31YZHVyY)

이전과 마찬가지로 허밋 스플라인을 그려봅시다.

![](/files/-Lpr5gLVBGyK4CwoHQPd)

점 3에 대한 계산도 같은 방식으로 반복합니다.

![](/files/-Lpr5sQxXzrrvSbvMHwh)

![](/files/-Lpr5uCO3DZHRNyjr2rO)

점 4에 대한 계산도 똑같이 반복합니다.

![](/files/-Lpr624wxL1rtSljabx-)

![](/files/-Lpr63_zOzhwg47kVfY9)

점 5도 계산해 볼까요?

![](/files/-Lpr6BMkYd8gl61qu9IF)

![](/files/-Lpr6FPMCxgMVL5sQ_Ys)

초반에 점 6에 대한 속도를 0으로 만들어놨기 때문에 추가 계산은 필요없습니다. 마지막 허밋 곡선을 그리면 캣멀-롬 스플라인이 완성됩니다.

![](/files/-Lpr6kPsL4mFkSGDjd6F)

![](/files/-Lpr6xgj8QHEkEmoEe69)

### 캣멀-롬 스플라인의 수학적 계산

원하는 위치에 노트들을 배치합니다.(**A, D** 등등)

만약 N번째 지점을 $$P\_N$$ 이라고 한다면,\
N번째 지점에서의 속도 $$V\_N$$ 은 다음 공식으로 구할 수 있습니다.\
\
&#x20;$$V\_N = (P\_{N+1} - P\_{N -1}) / 2$$ <br>

즉, 점 P에에서의 속도는 \[**이전 점에서 다음 점을 가리키는 벡터의 절반**] 인 것입니다.
