# 캣멀-롬 스플라인(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에에서의 속도는 \[**이전 점에서 다음 점을 가리키는 벡터의 절반**] 인 것입니다.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://lee-seokhyun.gitbook.io/game-programming/client/easy-mathematics/gdc2012/catmull-rom-splines.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
