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

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

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

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

![](https://3665878343-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LngmcDPWb1XA1VNz9ii%2F-Lpr20rftkjPJUHBIplJ%2F-Lpr2RCo3o-t1L12TI8Z%2Fimage.png?alt=media\&token=e5438baf-991f-4801-b5c2-ffa5e41b8129)

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

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

![](https://3665878343-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LngmcDPWb1XA1VNz9ii%2F-Lpr20rftkjPJUHBIplJ%2F-Lpr3wLpdX2KdMJ8j1Cf%2Fimage.png?alt=media\&token=0b1327e7-c493-42be-ad9b-677fff89e866)

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

![](https://3665878343-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LngmcDPWb1XA1VNz9ii%2F-Lpr20rftkjPJUHBIplJ%2F-Lpr49plYzfmm-SkyuZJ%2Fimage.png?alt=media\&token=8ce72a22-31f0-43b2-8cf7-29d6ba96ef79)

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

![](https://3665878343-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LngmcDPWb1XA1VNz9ii%2F-Lpr20rftkjPJUHBIplJ%2F-Lpr4HuQUFe6GCvbAJNc%2Fimage.png?alt=media\&token=9b150f10-98b0-422a-811e-5f0ae4aaef0c)

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

![](https://3665878343-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LngmcDPWb1XA1VNz9ii%2F-Lpr20rftkjPJUHBIplJ%2F-Lpr4X8YtdpRKAHWVQqy%2Fimage.png?alt=media\&token=ae148c8a-a022-42ba-8123-288bfb8a3c13)

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

![](https://3665878343-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LngmcDPWb1XA1VNz9ii%2F-Lpr20rftkjPJUHBIplJ%2F-Lpr5Dq51p159BzuG79h%2Fimage.png?alt=media\&token=d494a9e3-b35a-47d9-8969-6dcf62e8db48)

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

![](https://3665878343-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LngmcDPWb1XA1VNz9ii%2F-Lpr20rftkjPJUHBIplJ%2F-Lpr5KrYhnUmrPxaec04%2Fimage.png?alt=media\&token=a63eef52-c6aa-44df-a9c1-6d9cc281f0c8)

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

![](https://3665878343-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LngmcDPWb1XA1VNz9ii%2F-Lpr20rftkjPJUHBIplJ%2F-Lpr5UeRg1Zx31YZHVyY%2Fimage.png?alt=media\&token=ff1bdefe-d50d-451e-a06e-10271c18ee0f)

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

![](https://3665878343-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LngmcDPWb1XA1VNz9ii%2F-Lpr20rftkjPJUHBIplJ%2F-Lpr5gLVBGyK4CwoHQPd%2Fimage.png?alt=media\&token=7ee4c953-1ef0-4afa-a2e7-06f7108c6b3a)

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

![](https://3665878343-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LngmcDPWb1XA1VNz9ii%2F-Lpr5kDZaemXt87Xc6y7%2F-Lpr5sQxXzrrvSbvMHwh%2Fimage.png?alt=media\&token=0659b40f-ed92-46e1-998c-6347784d74cd)

![](https://3665878343-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LngmcDPWb1XA1VNz9ii%2F-Lpr5kDZaemXt87Xc6y7%2F-Lpr5uCO3DZHRNyjr2rO%2Fimage.png?alt=media\&token=b9dae327-d7c8-470e-a511-d41c9d67fd54)

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

![](https://3665878343-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LngmcDPWb1XA1VNz9ii%2F-Lpr5kDZaemXt87Xc6y7%2F-Lpr624wxL1rtSljabx-%2Fimage.png?alt=media\&token=128050b6-0be5-4d0e-a623-03fe57997426)

![](https://3665878343-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LngmcDPWb1XA1VNz9ii%2F-Lpr5kDZaemXt87Xc6y7%2F-Lpr63_zOzhwg47kVfY9%2Fimage.png?alt=media\&token=9923280e-0216-432c-be68-ccc6ae4cc658)

점 5도 계산해 볼까요?

![](https://3665878343-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LngmcDPWb1XA1VNz9ii%2F-Lpr5kDZaemXt87Xc6y7%2F-Lpr6BMkYd8gl61qu9IF%2Fimage.png?alt=media\&token=a6b7561c-57e3-4472-b475-af9d3957adaf)

![](https://3665878343-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LngmcDPWb1XA1VNz9ii%2F-Lpr5kDZaemXt87Xc6y7%2F-Lpr6FPMCxgMVL5sQ_Ys%2Fimage.png?alt=media\&token=3744b5c5-f56d-4958-b8fe-0527f40d6718)

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

![](https://3665878343-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LngmcDPWb1XA1VNz9ii%2F-Lpr5kDZaemXt87Xc6y7%2F-Lpr6kPsL4mFkSGDjd6F%2Fimage.png?alt=media\&token=883c5c80-59da-4bfe-a1c5-fbd54d83e5e5)

![](https://3665878343-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LngmcDPWb1XA1VNz9ii%2F-Lpr5kDZaemXt87Xc6y7%2F-Lpr6xgj8QHEkEmoEe69%2Fimage.png?alt=media\&token=f0eacfd1-454d-4650-bcee-7194dc68bc3c)

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

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

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

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