2018년 8월 7일 화요일

캣멀-롬 스플라인( Catmull-rom splines)

■ 내가 모르는 것

- 왜 2차 곡선이 아니라 3차 곡선(Cubic curve)을 쓰는가?
- 왜 캣멀-롬 스플라인에서는 1/2란 상수값을 쓰는가?

위 두가지는 내가 모르는 것들이다. 그러니 이 포스트에서는 위 두가지에 대한 답을 찾지 말기바란다.. 사실 나머지도 제대로 아는게 아니라 대략 이런 것이구나 정도까지만 설명할수 있을거같다.

■ 곡선과 스플라인

곡선(Curve)이란 말그대로 휘어진 선을 의미한다. 2차 곡선.. 3차곡선.. 그런것들 말이다. 그리고 스플라인이란 제어점들이란 걸 통해 만들어진 곡선을 의미한다.



위 그림 같은 것을 스플라인이라고한다. 그리고 여기서 다룰 곡선은 3차곡선인데, 3차 곡선이란것은 4개의 상수 데이터와 변수로 이루어져있고 결국 스플라인이란 그 4개의 상수 데이터를 제어점이라는 것으로부터 다루는 것이기 때문에 우선 우리는 3차 곡선의 개념을 알아야한다.( 여기서는 에르밋 곡선 )

■ 에르밋 곡선( Hermite curves )

캣멀-롬 스플라인은 에르밋 곡선이란 것에 기반한다. 에르밋 곡선이란 것은 3차 곡선을 2개의 점과(진입점과 종료점) 2개의 접선(진입점과 종료점에서의 접선)으로 나타낸 방식이고 캣멀-롬 스플라인은 그 2개의 접선을 주어진 4개의 제어점으로부터 적절히 구해내는 방식이다. 3차 함수는 아래와 같다.



식에서 보이듯, t는 변하는 값이고( 보간으로 쓸때는 일반적으로 시간값이 된다 ) a,b,c 그리고 D는 곡선의 모습을 결정짓는 어떠한 상수 값(벡터들과 점)들이다.  그리고 위 식을 미분하면



위와 같은 도함수가 구해지는 것을 알수가있다. 짐입점(t = 0)을 P_0 종료점( t = 1)을 P_1 그리고 진입점에서의 접선을 P'_0 종료점에서의 접선을 P'_1 라고 놓는다면,



이렇게 각각 함수와 도함수에 0과 1을 집어넣었을때 위와 같은 결과가 나오는것을 알수있다. 그림으로 보자면,



이러하다. ( 당연하지만 0~1의 범위를 가지는 t는 정규화된 값이다 ) 위 식으로부터 a와 b에 대한 식을 세워보면



와 같이 나올것이다. ( 첫번째와 세번째 식에서 값이 정해진 D와 c를 두번째와 네번째 식에 넣고 잘 정리하면 위의 식이 나온다 ) 이제 a,b,c 그리고 D에 대한 모든 값들은 점 P_0와 점 P_1 그리고 접선 P'_0 과 P'_1 로 완벽히 대체했다. 그래서 다시 3차 함수에 이 값들을 집어넣으면



위와 같이 되고 이것을또 잘 정리하면



결국 위의 공식이 나오게되는데 이것이 에르밋 곡선이다. 결과에서 보이듯 진입점과 종료점 그리고 각각 그에 대응하는 접선 두개만 안다면은 변수 t에서의 특정 점을 우리는 알수가있다.

■ 에르밋 곡선의 행렬

미지수 행렬을 T, 스칼라 행렬을 M, 점과 벡터 행렬을 G라고 놓는다면

 

위와 같이 나온다.

■ 캣멀-롬 스플라인

위의  P'_i 와 P'_i+1 을



이렇게 구하면은 이게 캣멀-롬 스플라인인데, 위에서 말했듯이 왜 상수 1/2를 써서 이렇게 구하는지느 모르겠다. 어쨋든 캣멀-롬 스플라인은 보다시피 4개의 점이 필요하고 4개의 점중  i-1 과 i+2은 접선값을 구하는데 쓰이고 그 접선으로부터 i 와 i+1 사이에 곡선이 생기는것을 확인할수가 있다.


댓글 없음:

댓글 쓰기