Skip to Content
독학사독학사 3단계컴퓨터그래픽스09. 곡선과 곡면: Bezier, B-spline, NURBS

이번 문서의 목표: 3차 Bezier 곡선의 점을 번스타인 기저식과 드카스텔조(De Casteljau) 알고리즘 두 가지 방법으로 직접 계산할 수 있고, Bezier·B-spline·NURBS가 제어점을 다루는 방식의 차이(특히 국소성)를 설명할 수 있게 된다.

왜 곡선을 다항식으로 표현하는가

지금까지는 04·07편에서 점과 직선을 행렬로 이동·회전·확대했습니다. 하지만 자동차 차체, 글자의 곡선 획, 캐릭터의 얼굴 윤곽처럼 매끄럽게 휘어지는 형태는 직선의 조합만으로는 자연스럽게 표현하기 어렵습니다. 그렇다고 원이나 타원 같은 특정 방정식만 쓸 수도 없습니다 — 디자이너가 원하는 모양은 임의의 곡선이기 때문입니다.

컴퓨터그래픽스는 이 문제를 매개변수 곡선(Parametric Curve)으로 풉니다. 매개변수 tt(보통 00부터 11 사이의 값)를 하나 두고, tt가 변할 때 점 (x(t),y(t))(x(t), y(t))가 그려내는 궤적을 곡선으로 삼는 방식입니다. 이때 곡선의 모양을 결정하는 것은 몇 개의 제어점(Control Point)입니다 — 디자이너는 곡선 위의 점을 하나하나 지정하는 대신, 곡선 근처에 놓인 몇 개의 제어점을 움직여서 곡선의 모양을 직관적으로 조작합니다.

쉽게 말하면: 곡선을 그리는 대신, 곡선을 “끌어당기는” 자석 같은 점 몇 개(제어점)를 놓고 그 점들이 곡선의 모양을 결정하게 만드는 것입니다.

1. Bezier 곡선 — 번스타인 기저로 정의하기

쉽게 말하면: Bezier 곡선은 제어점 몇 개에 매개변수 tt에 따라 달라지는 가중치를 곱해 더한 점들의 궤적입니다.

제어점이 n+1n+1개(P0,P1,,PnP_0, P_1, \ldots, P_n)면 nn차 Bezier 곡선이라 부릅니다. 컴퓨터그래픽스에서 가장 흔히 쓰이는 것은 제어점 4개로 이루어진 3차(cubic) Bezier 곡선입니다.

B(t)=(1t)3P0+3(1t)2tP1+3(1t)t2P2+t3P3,t[0,1]B(t) = (1-t)^3 P_0 + 3(1-t)^2 t\, P_1 + 3(1-t)t^2 P_2 + t^3 P_3, \quad t \in [0, 1]
  • P0,P1,P2,P3P_0, P_1, P_2, P_3: 4개의 제어점(2차원이면 각각 (x,y)(x, y) 좌표를 가진 점)
  • tt: 곡선 위의 위치를 나타내는 매개변수(parameter). t=0t = 0이면 곡선의 시작점, t=1t = 1이면 곡선의 끝점
  • (1t)3, 3(1t)2t, 3(1t)t2, t3(1-t)^3,\ 3(1-t)^2t,\ 3(1-t)t^2,\ t^3: 번스타인 기저 다항식(Bernstein Basis Polynomial)이라 부르는 4개의 가중치 함수로, tt가 정해지면 각 제어점에 얼마만큼의 비중을 줄지를 결정한다.

번스타인 기저의 중요한 성질은 네 가중치의 합이 항상 1이라는 것입니다. (1t)3+3(1t)2t+3(1t)t2+t3=((1t)+t)3=13=1(1-t)^3 + 3(1-t)^2t + 3(1-t)t^2 + t^3 = ((1-t)+t)^3 = 1^3 = 1이기 때문입니다. 가중치의 합이 1이므로 B(t)B(t)는 항상 네 제어점의 가중 평균이 되고, 그 결과 곡선은 항상 네 제어점이 만드는 볼록 껍질(convex hull) 안에 놓이게 됩니다 — 이것이 Bezier 곡선이 화면 밖으로 튀어나가지 않고 예측 가능하게 움직이는 이유입니다.

실제 계산 — 번스타인 기저에 t를 대입하기

제어점을 P0=(0,0)P_0 = (0, 0), P1=(1,3)P_1 = (1, 3), P2=(3,3)P_2 = (3, 3), P3=(4,0)P_3 = (4, 0)으로 두고, t=0.5t = 0.5일 때 곡선 위의 점을 계산해 보겠습니다. 먼저 t=0.5t = 0.5를 번스타인 기저 각각에 대입합니다.

(10.5)3=0.125,3(10.5)2(0.5)=0.375,3(10.5)(0.5)2=0.375,(0.5)3=0.125(1-0.5)^3 = 0.125, \quad 3(1-0.5)^2(0.5) = 0.375, \quad 3(1-0.5)(0.5)^2 = 0.375, \quad (0.5)^3 = 0.125
  • 네 값을 더하면 0.125+0.375+0.375+0.125=10.125 + 0.375 + 0.375 + 0.125 = 1로, 가중 평균의 성질과 일치한다.

이 가중치를 각 제어점의 xx좌표에 곱해 더합니다.

x(0.5)=0.125×0+0.375×1+0.375×3+0.125×4=0+0.375+1.125+0.5=2.0x(0.5) = 0.125 \times 0 + 0.375 \times 1 + 0.375 \times 3 + 0.125 \times 4 = 0 + 0.375 + 1.125 + 0.5 = 2.0

같은 방식으로 yy좌표를 계산합니다.

y(0.5)=0.125×0+0.375×3+0.375×3+0.125×0=1.125+1.125=2.25y(0.5) = 0.125 \times 0 + 0.375 \times 3 + 0.375 \times 3 + 0.125 \times 0 = 1.125 + 1.125 = 2.25
  • 결과: t=0.5t = 0.5에서 곡선 위의 점은 B(0.5)=(2.0, 2.25)B(0.5) = (2.0,\ 2.25)이다. 이 점은 네 제어점을 잇는 사각형 안쪽에 놓여 있으며, 곡선의 정확한 절반 지점(호의 길이 기준은 아니고 매개변수 기준 절반)에 해당한다.

실제 계산 — 드카스텔조(De Casteljau) 알고리즘으로 같은 점 구하기

번스타인 기저를 직접 대입하는 방법 말고도, 드카스텔조 알고리즘이라는 반복적인 선형 보간(linear interpolation)만으로 같은 결과를 구하는 방법이 있습니다. 두 점 AA, BB 사이를 tt 비율로 보간하는 식은 lerp(A,B,t)=(1t)A+tB\text{lerp}(A, B, t) = (1-t)A + tB입니다. 이 보간을 제어점들 사이에서 반복해서 적용합니다.

1단계: 인접한 제어점 쌍을 t=0.5t = 0.5로 보간해 3개의 새 점을 만든다.

계산결과
lerp(P0,P1,0.5)=(10.5)(0,0)+0.5(1,3)\text{lerp}(P_0, P_1, 0.5) = (1-0.5)(0,0) + 0.5(1,3)(0.5, 1.5)(0.5,\ 1.5)
lerp(P1,P2,0.5)=(10.5)(1,3)+0.5(3,3)\text{lerp}(P_1, P_2, 0.5) = (1-0.5)(1,3) + 0.5(3,3)(2.0, 3.0)(2.0,\ 3.0)
lerp(P2,P3,0.5)=(10.5)(3,3)+0.5(4,0)\text{lerp}(P_2, P_3, 0.5) = (1-0.5)(3,3) + 0.5(4,0)(3.5, 1.5)(3.5,\ 1.5)

2단계: 1단계에서 만든 3개의 점을 다시 인접한 쌍끼리 t=0.5t = 0.5로 보간해 2개의 점을 만든다.

계산결과
lerp((0.5,1.5),(2.0,3.0),0.5)\text{lerp}((0.5,1.5), (2.0,3.0), 0.5)(1.25, 2.25)(1.25,\ 2.25)
lerp((2.0,3.0),(3.5,1.5),0.5)\text{lerp}((2.0,3.0), (3.5,1.5), 0.5)(2.75, 2.25)(2.75,\ 2.25)

3단계: 2단계에서 만든 2개의 점을 마지막으로 t=0.5t = 0.5로 보간하면 곡선 위의 점이 나온다.

lerp((1.25,2.25),(2.75,2.25),0.5)=(2.0, 2.25)\text{lerp}((1.25, 2.25), (2.75, 2.25), 0.5) = (2.0,\ 2.25)
  • 결과: 드카스텔조 알고리즘으로 구한 점도 (2.0, 2.25)(2.0,\ 2.25)로, 번스타인 기저를 직접 대입한 결과와 정확히 일치한다. 두 방법은 수학적으로 동치이지만, 드카스텔조 알고리즘은 거듭제곱과 조합 계수를 계산할 필요 없이 곱셈과 덧셈(선형 보간)만 반복하면 되므로 컴퓨터가 오차 없이 안정적으로 계산하기에 유리하다.

자주 틀리는 점: 번스타인 기저의 계수 33을 빠뜨리는 실수가 흔합니다. 3(1t)2t3(1-t)^2t3(1t)t23(1-t)t^2의 계수 33은 이항계수 (31)=(32)=3\binom{3}{1} = \binom{3}{2} = 3에서 나온 것으로, 생략하면 가중치의 합이 1이 되지 않아 계산 전체가 틀어집니다.

Bezier 곡선의 한계 — 전역성

Bezier 곡선에서 제어점 하나를 옮기면, 그 변화가 곡선 전체 모양에 영향을 줍니다. 예를 들어 위 예제에서 P1P_1을 살짝만 옮겨도, t=0.9t = 0.9처럼 P1P_1에서 멀리 떨어진 지점의 곡선 형태까지 함께 바뀝니다. 이런 성질을 전역 제어(Global Control)라고 합니다. 제어점이 많아질수록(차수가 높아질수록) 국소적으로 미세하게 곡선을 다듬고 싶어도 곡선 전체가 흔들리기 쉬워, 실무에서는 이 문제를 해결하기 위한 다음 도구가 필요해집니다.

2. B-spline — 국소성을 얻기 위한 구조

쉽게 말하면: B-spline은 곡선을 여러 개의 짧은 구간으로 나누고, 제어점 하나가 자기 근처의 몇 구간에만 영향을 주도록 만든 곡선입니다.

B-spline(Basis spline)은 하나의 다항식으로 전체 곡선을 표현하는 Bezier와 달리, 여러 개의 제어점과 매듭(Knot)이라는 값들의 나열인 매듭 벡터(Knot Vector)를 이용해 곡선을 구간별로 이어 붙입니다. 각 구간은 국소적인 기저 함수(basis function)의 영향만 받기 때문에, 제어점 하나를 옮기면 그 제어점 근처의 몇 구간(차수가 kk면 최대 k+1k+1개 구간)만 바뀌고 멀리 떨어진 구간은 전혀 변하지 않습니다. 이 성질을 국소성(Locality)이라 부르며, Bezier의 전역 제어 문제를 해결하는 핵심 아이디어입니다.

  • 제어점(Control Point): Bezier와 마찬가지로 곡선의 모양을 조작하는 기준점들. B-spline은 제어점 개수와 곡선의 차수를 독립적으로 정할 수 있어(제어점이 아무리 많아도 차수를 낮게 유지 가능), Bezier보다 유연하다.
  • 매듭(Knot): 매개변수 tt의 구간을 나누는 경계값들의 나열. 예를 들어 매듭 벡터 [0,0,0,1,2,3,3,3][0, 0, 0, 1, 2, 3, 3, 3]처럼, 각 매듭 사이가 하나의 곡선 조각(segment)에 대응한다.
  • 국소성(Locality): 제어점 하나의 변화가 곡선 전체가 아니라 그 제어점 주변의 한정된 구간에만 영향을 주는 성질.

3. Bezier와 B-spline 비교

항목Bezier 곡선B-spline 곡선
제어점 개수와 차수제어점이 n+1n+1개면 차수는 항상 nn(둘이 묶여 있음)제어점 개수와 차수를 독립적으로 지정 가능
제어점 변경의 영향 범위전역(곡선 전체가 바뀜)국소(매듭 구간 몇 개만 바뀜)
곡선이 지나는 점시작점 P0P_0, 끝점 PnP_n만 반드시 지남일반적으로 시작·끝 제어점도 반드시 지나지는 않음(단, 매듭을 중복시키면 지나가게 만들 수 있음)
계산 도구번스타인 기저, 드카스텔조 알고리즘매듭 벡터 기반 기저 함수(De Boor 알고리즘)
원·타원의 정확한 표현불가능(다항식으로는 원을 정확히 표현할 수 없음)불가능(가중치가 없는 일반 B-spline 기준)

4. NURBS — 가중치로 원을 정확히 그리기

쉽게 말하면: NURBS는 B-spline의 각 제어점에 “얼마나 세게 끌어당길지”를 나타내는 가중치를 추가로 붙인 곡선입니다.

Bezier와 일반 B-spline은 모두 다항식이므로, 원이나 타원처럼 분수식(유리식)으로만 정확히 표현되는 곡선은 근사할 수는 있어도 완벽히 표현할 수는 없습니다. NURBS(Non-Uniform Rational B-Spline, 비균일 유리 B-스플라인)는 이 문제를 해결하기 위해 각 제어점 PiP_i에 가중치(weight) wiw_i를 곱한 뒤, 가중치들의 합으로 다시 나누는 유리식(Rational, 분수 형태의 식)을 사용합니다.

C(t)=iwiNi(t)PiiwiNi(t)C(t) = \frac{\sum_{i} w_i N_i(t) P_i}{\sum_{i} w_i N_i(t)}
  • Ni(t)N_i(t): B-spline의 국소 기저 함수(제어점 PiP_i가 매개변수 tt에서 갖는 기본 영향력)
  • wiw_i: 제어점 PiP_i의 가중치. 값이 클수록 곡선이 그 제어점 쪽으로 더 강하게 끌려간다.
  • 분모의 wiNi(t)\sum w_i N_i(t)는 가중치를 반영한 뒤 전체를 다시 1로 정규화(normalize)하는 역할을 한다.

가중치를 조절하면 원의 4분의 1 구간처럼 다항식으로는 정확히 표현할 수 없는 곡선도 NURBS로는 오차 없이 표현할 수 있습니다. 이 때문에 CAD(Computer-Aided Design, 컴퓨터 이용 설계) 소프트웨어나 정밀한 산업 디자인 도구는 대부분 NURBS를 표준 곡선 표현으로 채택하고 있습니다. 반대로 모든 가중치 wiw_i를 1로 두면 NURBS는 정확히 일반 B-spline과 같아지므로, NURBS는 B-spline을 포함하는 더 넓은 개념이라고 이해하면 됩니다.

5. 곡면으로의 확장 — 텐서곱

지금까지 다룬 것은 1차원 매개변수 tt 하나로 그려지는 곡선입니다. 곡면(Surface)은 매개변수를 두 개(uu, vv)로 늘려서 만듭니다. 가장 흔한 방식은 텐서곱(Tensor Product) 방식으로, 제어점을 격자(control net) 형태로 배치하고 uu 방향과 vv 방향으로 각각 Bezier(또는 B-spline) 곡선 계산을 적용합니다.

S(u,v)=ijBi(u)Bj(v)Pi,jS(u, v) = \sum_{i} \sum_{j} B_i(u)\, B_j(v)\, P_{i,j}
  • Pi,jP_{i,j}: 격자로 배치된 제어점(control net)의 (i,j)(i, j)번째 점
  • Bi(u),Bj(v)B_i(u), B_j(v): 각각 uu, vv 방향의 번스타인 기저(또는 B-spline 기저) 함수

직관적으로는, 먼저 uu 방향의 여러 곡선을 각각 계산한 뒤 그 결과들을 다시 vv 방향으로 곡선 보간하는 것과 같습니다. Bezier 곡면·B-spline 곡면·NURBS 곡면 모두 이 텐서곱 구조를 그대로 확장한 것이며, 자동차 외형이나 캐릭터 모델링에서 넓은 곡면을 표현할 때 널리 쓰입니다.

핵심 정리

  • 3차 Bezier 곡선은 번스타인 기저 (1t)3,3(1t)2t,3(1t)t2,t3(1-t)^3, 3(1-t)^2t, 3(1-t)t^2, t^3을 제어점에 곱해 더한 가중 평균이며, 네 가중치의 합은 항상 1이다.
  • 드카스텔조 알고리즘은 제어점들을 선형 보간으로 반복해서 좁혀 나가는 방법으로, 번스타인 기저 계산과 동일한 결과를 안정적으로 준다.
  • Bezier 곡선은 제어점 하나의 변화가 곡선 전체에 영향을 주는 전역 제어 성질을 가진다.
  • B-spline은 매듭 벡터를 이용해 제어점의 영향 범위를 국소 구간으로 제한하는 국소성을 갖는다.
  • NURBS는 B-spline에 가중치를 더한 유리식으로, 원·타원 같은 곡선을 정확히 표현할 수 있고 가중치를 모두 1로 두면 일반 B-spline과 같아진다.
  • 곡면은 텐서곱 방식으로 두 매개변수 u,vu, v에 대해 곡선 계산을 두 번 겹쳐 적용해 만든다.

마무리 복습

문제 14지선다
3차 Bezier 곡선의 번스타인 기저 4개를 t=0.5에 대입했을 때 그 합으로 가장 적절한 것은?
문제 24지선다
제어점 P0=(0,0), P1=(1,3), P2=(3,3), P3=(4,0)인 3차 Bezier 곡선에서 t=0.5일 때 곡선 위의 점으로 가장 적절한 것은?
문제 34지선다
드카스텔조(De Casteljau) 알고리즘의 계산 방식으로 가장 적절한 것은?
문제 44지선다
Bezier 곡선과 비교했을 때 B-spline 곡선의 가장 중요한 장점으로 가장 적절한 것은?
문제 54지선다
NURBS가 일반 B-spline과 다른 점으로 가장 적절한 것은?
문제 64지선다
Bezier 곡면을 텐서곱 방식으로 만들 때 필요한 요소로 가장 적절한 것은?

참고 자료

Last updated on