수학 관련 글들

베지에 곡선 (Bézier Curve)

ShadowEye 2019. 1. 16. 01:39

베지에 곡선 (Bézier Curve)은 개의 점으로부터 얻어지는 차 곡선으로  부드러운 곡선을 생성하는 데에 유용하다.

 

 

1차 베지에 곡선 (Linear Bézier Curve)

 

 

1차 베지에 곡선

 

 

 

위그림과 같이 두개의 점이있고 점P0에서 P1까지 일정한속도로 이동하고있다 이떄 t값은 점의 좌표가 P0에서 P1까지의 거리를 1이라고 가정했을때 이동한 비율이다.  공식은 다음과 같다.

 

 

만약 P0의위치는 (1,1), P1의  위치가 (2,2)이고 t가 0.10 일때 (P0으로부터 출발해서 10%이동할시에 위치)  위공식을 사용해서 구한 점의 위치는 아래와 같이 구한다.

[1.1, 1.1] = (1-0.1) x [1,1] + (0.1) x [2,2];

 

위공식을 unity로 구현시 코드는 다음과 같다.

Vector3 LinearBezierCurve(float t, Vector3 P0, Vector3 P1)
{
 
    return ((1 - t) * P0) + (t * P1);
}

 

2차 베지에 곡선 (Quadratic Bézier Curve)

 
2차 베지에 곡선
 
 

위그림과 같이 3개의 좌표점 P0, P1, P2 과 P0과 P1 사이에 이동하는 점 M0 과 P1에서 P2로 이동하는점 M1을 연결하는 선이 새로 추가된다. 그리고 M0에서 M1을 이동하는 점 B가 생기고 그이동경로가 바로 2차 베지에 곡선이다. 공식은 다음과 같다.

 

 

위공식을 unity로 구현시 코드는 다음과 같다.

 

Vector3 LinearBezierCurve(float t, Vector3 p0, Vector3 p1)
{
 
    return ((1 - t) * p0) + (t * p1);
}
 
Vector3 QuadraticBezierCurve(float t, Vector3 p0, Vector3 p1, Vector3 p2) {
    Vector3 m0 = LinearBezierCurve(t, p0, p1);
    Vector3 m1 = LinearBezierCurve(t, p1, p2);
    return LinearBezierCurve(t, m0, m1);
}

 

위 코드를 설명하자면 

베지에 곡선 m0을 p0 과 p1사이에서 구한다.

베지에 곡선 m1을 p1 과 p2사이에서 구한다.

베지에 곡선 b을 m0 과 m1사이에서 구해 리턴한다.