Spline에 대해

Computer_Graphics : 2007.03.14 01:46

Spline에 관해.. | Math 2006/03/03 13:42
http://blog.naver.com/drunkenpk/60022360470
NURBS는 Non-Uniform Rational B-Spline의 약자로써 일종의 컴퓨터에서 곡률을 나타낼 수 있는 여러 선(SPLINE) 종류중 하나인데 이 NURBS를 설명하려면 먼저 SPLINE의 종류에 대한 이해가 필요합니다. 그래서 먼저 각 SPLINE의 종류와 그에 따른 아주 간단한 설명을 한 다음 NURBS에 대해 본격적으로 다뤄보도록 하겠습니다.
그렇기에 이번에는 NURBS 모델링에 관한 전반적인 설명을 다루지 못하고 다음 포스팅으로 넘겨야겠군요.(생각지도 않게 더 자세하게 들어갔습니다. -_-)

참고로 컴퓨터에서 구현되는 곡선에 대한 설명은 필연적으로 수학적 함수 공식이 수반됩니다. 저도 전공자가 아니기 때문에 최대한 이쪽 전문적인 지식은 배제하고 이해하기 쉽게 하려고 인터넷 및 컴퓨터 그래픽에 관련된 서적을 뒤져서 정리를 했지만......... 그게 그렇게 쉽게 되는 성질의 것이 아니더군요. 결국 이쪽 전공이 아니신 분은 뭔 소리하는겨? 하고 전혀 이해 할 수 없으실지 모르겠다는 생각이 듭니다. 그러니 그냥 이런 것이 있고 각 곡선의 특징이 그렇구나 그래서 NURBS가 유용하게 쓰이는구나만 아시면 될 듯합니다.
극단적으로 말해서는 이번 포스팅은 그냥 넘어가고 다음 포스팅부터 보셔도 무방할듯합니다. 암튼 제가 생각하고 있는 3D 관련 포스팅중에서 이 포스팅만 어려운 것이니 다음 포스팅은 상식 수준에서 이해하실 수 있을거라 생각합니다. -_-;;

자료출처:
GRAPHICS LIVE 2001년 8월호
http://www.copyeditor.co.kr/reference/char-font/bezier.htm
http://210.94.177.75/laser/lecture/cadcam1/ch3.html
http://fiadot.com/wiki/home/moin.cgi/3D_bf_eb_be_ee_c1_a4_b8_ae
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdicpp/GDIPlus/aboutGDIPlus/linescurvesandshapes/cardinalsplines.asp

길어서 MORE로 처리를.....



1. SPILNE이란?

컴퓨터에서 수학적 함수를 이용해 그려지는 선을 단순히 LINE이라 하지 않고 SPLINE이라 하는 이유는 곡률표현 때문에 그렇습니다. 과거에 선의 곡률이 매우 중요한 배의 선체나 건물의 돔을 디자인하기 위해서 제도사들은 가늘고 긴 철사나 나무로 그 곡률을 맞추기 위해 운형(雲形)의 자를 사용했는데 그것을 SPLINE이라 불렀습니다. 그리고 이를 유연하게 조절하기 위해서 필요한 곳에 납덩이를 달아서 그 무게 정도에 따라 세밀하게 곡률을 조절하였습니다. 이것에 착안해서 현재 다양한 프로그램에서 현재 우리가 곡률을 사용하는 선을 그리는 툴로 프로그램화시켰지요. 그렇기 때문에 곡률이 구현되는 선을 단순히 LINE이라 하지 않고 SPLINE이라고 부르는 것입니다. 실제로 베지어 커브나 CARDIANL SPLINE이나 NURBS나 실제 끝점을 가지고 선분의 곡률을 조정하는 것이 아닌 조절점을 가지고 곡률을 조정하는 것이니, 옛날 SPLINE에 달린 납을 가지고 곡률을 조정한 제도사들이 했던 것과 같은 이치라서 더더욱 SPLINE이라 부르는 것이지요. 보면 서양애들 옛날 조상들이 쓰고 발전 시킨 것에 대한 존경의 의미로 용어를 채택해 쓰는 경향이 많은 거 같습니다.



2. 컴퓨터의 곡선 표현 방법

1960년 보잉 항공사의 J. C. 퍼거슨이 자유곡선을 표현하는 방법을 처음 내놓음으로써 컴퓨터에서 곡선을 표현할 수 있는 방법이 처음 제시되었고, 우리가 널리 쓰고 있는 BEZIER CURVE가 나온 것은 1971년 르노 자동차의 P. 베지어에 의해서였습니다. 그러니까 컴퓨터에서 곡선을 표현할 수 있게 된 것은 35년 정도 되었다고 할 수 있습니다.
이런 곡선 표현 문제는 설계 관련 영역에서 먼저 연구되었습니다. 위에서 퍼거슨 곡선이나 베지어 곡선을 고안해 낸 사람들을 살펴면 항공사와 자동차 회사 소속이라는 사실에서도 알 수 있듯이, 컴퓨터로 이러한 기계들을 설계하는 과정에서 나타날 수밖에 없는 곡선 문제를 해결하기 위해 연구된 결과였다는 것이죠.
왜 곡선 표현이 문제인가? 컴퓨터는 곡선이라는 개념을 알지 못합니다. 다만 어떤 함수를 주고, 여기에 연속되는 x 값을 넣어주면 그에 대응되는 y 값이 나옴으로써 곡선을 표현할 수 있게 되는 것일 뿐입니다.
우리가 화면에서 보는 곡선은 사실 곡선이 아니라 점들이 촘촘하게 모여 있는 집합이라고 할 수 있습니다. 예를 들어서 어떤 곡선을 x 좌표가 1부터 5까지인 범위 안에서 그린다고 했을 때, 적절한 함수를 만들어 x 값으로 1, 2, 3, 4, 5를 차례대로 넣어 주면 그에 따르는 y 값이 계산될 것입니다. 이렇게 얻어진 점들을 화면에 찍어 주면 곡선과 같은 모습을 볼 수 있게 됩니다.

(그림1. 컴퓨터에서 곡선을 표현하는 방법)

이렇기 때문에 SPLINE의 종류는 곡선 표현을 어떤 함수로 가지고 나타내느냐에 따라 구분되는데 현재 상용화 되어 사용하고 있는 SPLINE의 종류를 보면 크게 LINEAR SPLINE, CARDINAL SPLINE, B-SPLINE, BEZIER CURVE, NURBS 정도 되겠습니다.



3. LINEAR SPLINE : 가장 기본이 되는 SPLINE

말 그대로 직선입니다. 함수 좌표 값을 간단히 이은 간단한 구조로써 베지어 커브등의 곡률을 긋는 방법이 개발되기 전에 쓰였던 방식입니다. 다른 말로 하면 그 유명한 폴리곤(polygon) 이라고도 합니다. 원리는 아주 간단합니다. 곡선 위에 있는 몇 개의 점을 집어내고, 이 점을 그냥 직선으로 이어서 곡선을 표현하는 방법입니다. 지금도 3차원 그래픽 프로그램이나 CAD에서는 이 방법을 많이 쓰고 있으며, 외곽선 글꼴의 초기 형식에서도 이 방식을 사용했습니다.

(그림2. LINEAR SPLINE의 곡선표시 방법)

회색 실선으로 된 곡선을 표현할 때 폴리곤 방식은 이 곡선 위에 있는 몇 개의 점에 대한 정보를 갖고 있다가, 곡선을 그려야 할 때에는 그냥 이 점들을 이어서 표현합니다. 위 그림에서 알 수 있는 바와 같이, 4개의 점을 사용한 회색 점선보다는 9개의 점을 사용한 검은색 점선이 원래 곡선에 더 가까운 모습을 가지게 됩니다. 그렇다면 우리 인간의 눈으로 봤을 때 곡선처럼 보이게 하려면? 함수 좌표값, 즉 점의 수를 늘리면 됩니다. 만약 수백개의 점을 촘촘히 배열해서 이것을 연결하면? 비록 완전한 곡선은 아닐지라도 곡선처럼 우리 눈에 보이게 될 것입니다. 이를 응용한 것이 바로 3D에서 POLYGON GEOMETRY방식이며 단위 면적당 면수를 많이 줘서 곡면처럼 보이게 하는 MESH SMOOTH 명령도 다 여기서 응용되고 시작된 방법이란 소리입니다.
이 방법이 가진 좋은 점은 직선을 계속 이어서 만드는 방법이기 때문에 계산이 간단해서 빠르게 곡선을 구현할 수 있다는 것입니다. 그 때문에 1초에 수십 장씩, 엄청난 양 그려내야 하는 3차원 그래픽에서는 아직도 이 폴리곤 방식을 널리 쓰고 있습니다. 하지만 확대를 하면 할수록 각진 모양이 뚜렷해지며, 매끈하게 표현하기 위해서는 곡선에서 많은 점을 뽑아서 보관해야 하고 그럴수록 컴퓨터에 부하를 가져온다는 약점을 안고 있습니다.



4. 퍼거슨 곡선

컴퓨터에서 곡선을 표현한다는 의미를 다시 한번 생각해 본다면, 곡선 위에 있는 몇 개의 점에 대한 정보를 가지고 나머지 빠진 부분, 곧 점과 점 사이를 채우는 것이라고 할 수 있습니다. 이것을 흔히 보간법(INTERPOLATION)이라고 하는데, 위에서 살펴본 폴리곤은 그냥 직선을 가지고 점과 점 사이를 채우는 것이기 때문에 보통 선형 보간이라고 합니다. 자유 곡선을 표현하는 문제에 대해 수학자들이 관심을 갖게 되면서 여러 방법들이 나왔는데, 그 가운데 1960년대 초에 보잉 항공사의 J. C. 퍼거슨(J. C. Ferguson)이 고안한 방법이 초창기에 널리 쓰이던 방법입니다. 보잉 항공사에서는 이 방식을 FMILL이라는 시스템에 적용했으며, 다음과 같은 장점 덕분에 많은 주목을 받게 되었습니다.

I)평면에 있는 곡선만 아니라 3차원 공간에 있는 형상도 간단히 표현할 수 있다.
II)곡선이나 곡면의 일부에 대한 표현도 간단히 할 수 있다.
III)곡선이나 곡면이 좌표 위에서 존재하는 자리를 옮기고자 하면 단순히 주어진 벡터만을 옮겨서 변환하여 원하는
결과를 얻을 수 있다.

퍼거슨 곡선이 갖고 있는 방법은 요즘 널리 쓰이고 있는 베지어 곡선이나 B-스플라인 곡선과 크게 다른 것은 아닙니다. 곡선을 단위로 쪼개어 (이것을 pach라고 합니다) 이 단위 각각마다 시작점과 끝점, 그리고 이 사이를 잇는 곡선을 표현하기 위한 벡터 값을 지정하고 이 정보를 토대로 곡선을 표현합니다. 그리고 이러한 단위 곡선을 계속 이어나가면 원하는 곡선이 만들어집니다.

하지만 이 방법은 문제를 안고 있는데, 이러한 단위 곡선들을 이어서 복합 곡선을 만들었을 경우, 각 단위의 모서리 부분이 원래 뜻했던 것보다 평평해져 버리는 현상이 있습니다. 물론 눈에 확 뜨일 정도로 심하지는 않지만, 설계와 같이 미세한 곡선 변화가 중요한 경우에는 문젯거리가 될 수 있습니다.



5. Hermite interpolation

여기서 잠깐 한가지 복잡한 공식을 소개하자면

p=p(u)= p0 (1- 3u2 + 2u3 )+ p1(3u2 - 2u3 )+ p0' (u- 2u2 + u3 )+ p1' (- u2 + u3 )


이것이 바로 The solution of cubic polynomial curves (3차 곡선식의 해)로써 이 공식을 HERMITE INTERPOLATION(허마이트 보간법)이라 합니다. 이 식을 아주 간단히 설명하자면 두 점과 그 점에서의 기울기를 만족하는 삼차곡선에 관한 해법이며, 여기에서 u의 값은 0과 1 사이입니다. 여기에서 p0, p1, p0', p1' 값이 어떻게 되는가에 따라서 이 공식으로 어떤 곡선이 만들어지는가가 결정됩니다. 이러한 함수를 블렌딩 함수(blending function)라고 하고 이것을 응용하여 어떤 곡선도 표현이 가능해 졌습니다.
알다싶이 이런 곡면에 대한 함수는 방정식으로 표현이 되는데 1차 방정식으로는 직선이 표현되며, 2차 방정식으로는 포물선이 표현됩니다. 3차 방정식을 사용하면 포물선의 반쪽을 꺾어 내린 듯한 모양이 되는데, 이 3차 방정식에서 나오는 곡선 모양이 보통 BEZIER나 B-스플라인에서 표현하는 곡선 형태입니다. 곧, 이런 형태의 곡선을 기본 단위인 패치(pach)로 보고 패치를 여러 개 이어서 원하는 곡선을 만드는 것입니다. 물론 함수는 x값 하나에 대하여 y값이 하나밖에 존재할 수 없는 데 비하여 곡선은 그렇지 않으므로 곡선을 계산하는 방정식에서는 보통 숫자가 아닌, 방향이 있는 벡터 값을 씁니다.

여태까지 설명한 내용은 전공자가 아니면 무슨 소리하는지 모르실 겁니다.(다시 한 번 밝히지만 저도 잘 모릅니다. -_-) 그래서 아주 알기 쉽게 정리를 하자면, 3차원 모델링에서는 단일 평면상에 있지 않은 곡선을 나타내면서도 계산하기 어렵지 않고 또 고차 다항식을 사용할 때 발생할 수 있는 원치 않는 진동(undulations)을 피할 수 있는 표현 방법이 필요하다. 이는 삼차 다항식(cubic polynomial, 동일 평면상에 있지 않는 곡선의 표현을 위한 최소 차수)을 사용하면 해결이 되는데 그것을 해결하는 공식이 바로 HERMITE INTERPOLATION이며 이를 이용해 현재 우리가 컴퓨터 그래픽에서 쓰이는 각종 CURVE들이 만들어졌다....라고만 아시면 됩니다. 왜 골치 아프게 이런거 하나 하나 언급하냐면 이것을 토대로 각종 곡선이 나왔으며 그 곡선의 최신형이자 완결형이 바로 NURBS이기 때문이지요. 암튼 이것을 토대로 현재 우리가 쓰는 BEZIER CURVE, CARDINAL SPLINE, B-SPLINE, NURBS가 탄생하였으니 이제 이것들에 대해 하나씩 또 보도록 하겠습니다.



6. BEZIER CURVE

HERMITE INTERPOLATION을 응용한 첫 SPLINE이 바로 BEZIER CURVE입니다. 앞에 소개한 Hermite Interpolation은 사실 사용자가 대화형 설계를 진행하기에는 적합하지 않은데, 그 이유는
(i)원하는 형상을 자유자재로 생성하는데는 부적절하며,
(ii) P0', P1'의 크기변화에 의한 곡선형상의 변화가 일반인의 직관과 완전히 일치하지는 않기 때문입니다

이를 해결하기 위해 개발된 것이 Bezier 곡선으로, 60년대초 프랑스 르노 자동차의 Bezier가 제안 하였습니다. 개발자의 이름을 딴 Bezier 커브는 모든 컨트롤 포인트들을 통과하지만 각각의 컨트롤 포인트마다 tangent vector라고 하는 방향과 길이를 동시에 표시하는 조절선을 가집니다. 특정한 컨트롤 포인트에서 그 커브를 스치고 지나가는 이 접선(tangent)의 방향과 길이(vector)는 각각 그 스플라인 커브의 "곡률 방향" 및 tangent vector에 의해 "영향을 받는 범위"를 나타내지요. 흔히 우리가 잘 알고 있는 2D 벡터 소프트웨어인 ADOBE ILLUSTRATOR에서 쓰이는 커브가 바로 이 베지어 커브이며 3D에서도 쓰입니다.

(그림3. BEZIER CURVE의 구성)

이 곡선의 특징은 첫 점과 끝점이 반드시 곡선 안에 있으며, 두 컨트롤 포인트는 언제나 이 곡선을 매끄럽게 해주는 효과를 갖는다는 점입니다. 따라서 사용자가 그래픽 인터페이스를 통하여 쉽게 곡선을 표현할 수 있으며, 항상 매끄럽고 정확한 곡선을 그려내는 장점을 갖게 되는 것입니다.



7. Cubic spline curves (삼차 스플라인 곡선)

점들을 보간하는 경우, 여러 개의 곡선 segment(조각)을 이어서 복합곡선(composite curve)을 형성하게 됩니다. 공간상의 곡선을 정의하는 최소 차수의 다항식은 3차곡선이므로, 여러 개의 Hermite curve를 이어서 적절한 복합 곡선을 만들 수 있습니다. 그러나 사용자에게 각 점의 접선 벡터값을 입력하도록 하는 것은 실제로는 너무 불편하므로 곡선의 중간 점에서 1차 및 2차 미분 연속조건을 사용하는 것이 보편적이라 하는군요. 이렇게 만들어진 곡선을 2차 미분 연속의 Cubic spline curves(3차 스플라인 곡선)라 합니다.
(그림4. Cubic spline curves)



8. CARDINAL SPLINE

Cardinal spline은 각 curves들이 합쳐져 큰 curve를 이룬 것을 말합니다. 이 Cardinal spline은 각 points와 tension parameter에 의해 특화되는데 선을 구성하는 모든 컨트롤 포인트들을 통과하는 SPLINE CURVE인 것이죠.
카디널 스플라인의 장점은 컨트롤포인트의 위치와 커브가 그리는 궤적의 직접적인 상관관계에 있습니다. 특정한 지점을 지나는 커브를 그리기 위해서는 컨트롤포인트를 간단히 "그곳"에 위치시키면 됩니다.



(그림5. CARDINAL SPLINE과 TENSION값에 의한 곡률 표현 방법)

하지만 컨트롤포인트의 위치가 의도하는 곡률에서 조금이라도 벗어나게 되면 이러한 직접적인 상관관계는 부드럽고 완만한 곡선을 그리기 위해서는 오히려 불편함이 될 수도 있는 SPLINE입니다.
ALIAS 1.0에서는 이 CARDINAL SPLINE을 가지고 모델링을 했습니다.



9. B- SPLINE

BEZIER CURVE가 갖는 가장 큰 약점은 패치 하나를 구성하는 점 가운데 어떤 것을 움직여도 곡선이 전체적으로 변한다는 것입니다. 이는 Cubic spline curves도 마찬가지입니다. 일러스트레이터와 같은 프로그램에서 곡선 한 조각을 그리고 관련된 네 점 가운데 어떤 것을 움직여도 전체 모양이 변합니다. 곧, 편집 과정에서 곡선 가운데 일부 형상만 바꾸고 싶어도 전체적으로 번거롭게 매만져 줘야 한다는 문제점이 있지요.
거기에다가 조정점의 개수와 곡선식의 차수가 직결되어 근사적으로 나타낼 수 있는 점의 수에 어느 정도 제약이 있습니다. 이러한 문제점을 해결하기 위하여 드보어(de Boor), 콕스(Cox)가 제안한 방법이 B-스플라인(베지어-스플라인) 곡선입니다. B-스플라인 곡선은 각 점이 일정한 범위에만 영향을 미치기 때문에 전체적으로 모양을 바꾸지 않고 원하는 부분만 조절해 줄 수 있는 장점이 있습니다.

(그림6. B-SPLINE의 도식)

위 그림6을 살펴 봅시다. 이 그림은 시작점과 끝점, 네 개의 조정점으로 이루어진 B-SPLINE 곡선인데, 베지어 역시도 이론만 가지고 따져 보면 조정점을 두 개보다 많이 가질 수는 있지만 앞에서 말했던 것처럼 그 가운데 단 한 개의 점만 움직여도 곡선 전체가 변하기 때문에 최소 숫자인 두 개만을 쓰는데 반해 B-SPLINE은 여러 개의 조정점을 가져도 각각이 영향을 미치는 구간이 제한되어 있기 때문에 여러 조정점을 한 패치에 한꺼번에 쓰는 경우가 많습니다. 또한 시작점과 끝점이 곡선 위에 있는 베지어와는 달리 B-SPLINE은 V0와 V5가 점 위에 있지 않습니다. 그렇다고 반드시 떨어져 있는 것은 아니며 적절한 방법으로 시작점과 끝점이 곡선 위에 있도록 만들 수도 있습니다. 정확하게 말하면 B-SPLINE은 베지어를 포함하고 있으며, B-SPLINE 곡선을 특정한 형태로 제한해 보면 베지어와 같은 특성을 갖게 할 수도 있습니다. 이 B-SPLINE은 NURBS가 나오기 이전에 CG에서 구현되는 최강의 SPLINE이었습니다.



10. NURBS

자 드디어 넙스까지 왔습니다. 이것을 설명하기 위해 앞에 여러 곡선과 간단하지만 무척 머리 아픈 공식이 설명되었어야 했지요. 그래야 했던 이유는? NURBS가 그 어떤 SPILINE보다 상위 개념에 있으며 NURBS 하나를 가지고 그 이하 곡선에서 추구하고 구현되었던 것이 다 가능하기 때문입니다.
일을 자세하게 설명하자면, NURBS는 앞에서 말했듯이 Non-Uniform Rational B-Spline, 즉 NURBS 곡선이며 비균일 매듭 벡터를 사용합니다. NURBS 곡선은 Non-Rational B-Spline과 BEZIER 곡선뿐 아니라 직선과 2차의 해석적 곡선을 하나의 형태로 나타낼 수 있으며, 근사적인 모드나 보간적인 형태로도 사용할 수 있습니다. 즉 NURBS는 모든 곡선을 포용하는 특성이 있어 곡선의 표준으로 설명할 수 있으며 Linear, Bezier, Cardinal, B-Splines 곡선은 NURBS의 하위 개념이라고 할 수 있습니다. 다른 곡선으로 구현할 수 있는 것이면 모두 NURBS로도 구현할 수 있다는 장점을 가지고 있지요.
이를 다시 거꾸로 생각하면, 넙스커브는 위에서 언급된 스플라인 커브들의 장점을 고루 갖고 있다는 소리기도 합니다. 카디널 스플라인처럼 커브의 시작점과 끝점에서는 컨트롤 포인트를 지나면서도 중간 점들에서는 Approximating spline처럼 컨트롤 포인트 "주변"을 지나기 때문에 부드러운 곡률을 갖습니다. 또한 넙스커브는 컨트롤 포인트 외에 커브위에 존재하는 edit point라고하는 별도의 조절 점들을 갖기 때문에 상황에 따라 정확도가 필요한 경우에는 카디널 스플라인처럼 직접 커브가 지나는 위치를 조절을 할 수도 있습니다. 넙스커브가 가지는 또 하나의 중요한 특징은, 각각의 컨트롤 포인트마다 weight를 조정할 수 있다는 점인데 이 weight값이 클수록 커브는 그 컨트롤 포인트 쪽으로 치우치게 되므로 컨트롤 포인트의 위치이동 없이 커브의 미세한 곡률까지 조정할 수 있다는 장점을 가지고 있습니다. 이런 weight를 조정할 수 있다는 점 때문에 NURBS는 다른 여타 곡선에 비해 많은 자유도를 가지고 있으며 이런 특징 때문에 다른 곡선에서 만들 수 없는 불규칙 곡선까지도 만들 수 있습니다.(그래서 NON-RATIONAL이지요) 그렇기 때문에 현재 CG에서 다른 SPLINE을 제치고 이 NURBS 곡선이 채택되고 추앙받는 이유이기도 합니다.(이 말 설명하려고 앞에 저렇게 삽질?을 하게 되었군요 ^^;;)

(그림 7. NURBS의 도해)

(그림 8. 각 SPLINE의 특징을 다이제스트 한 그림)


다음 포스팅에서는 이 지식을 가지고 NURBS 모델링의 특징과 장단점에 대해 알아보도록 하겠습니다.(원래 그것이 2번째 포스팅이 되어야 했는데....... 고로 이번 포스팅은 앞에서도 말했지만 그냥 넘어가도 무방할듯 합니다. ^-^;; (그럴 바에는 왜 썼어?)

뱀발) 언제나 잘못된 점 리플로 지적해주시면 감사하겠습니다.

'Computer_Graphics' 카테고리의 다른 글

Raytracing 공부하기  (0) 2007.03.14
Spline에 대해  (0) 2007.03.14
컴퓨터 그래픽 투상도&투시도  (0) 2007.03.14
벡터 외적  (0) 2007.03.14
Posted by Real_G