Part III 애니메이션 Chapter 9 곡선
9.9 유리 곡선(Rational Curves) 9.1 소개 9.2 일반적인 정의 9.3 선형 보간 9.4 라그랑주 다항식 9.5 에르미트 곡선 9.6 Catmul-Rom 스플라인 9.7 베지어 곡선 9.8 B-스플라인 9.9 유리 곡선(Rational Curves) 9.10 곡선 렌더링하기 9.11 곡선을 따라서 속력 조절하기 9.12 카메라 조작
9.1 소개 애니메이션 리샘플링 기타 다른 용도로 유용하게 사용될 수 있음 두점 사이 보간 조정점(controls point,제어점)을 사용해서 근사 기타 다른 용도로 유용하게 사용될 수 있음
9.2 일반적인 정의 매개변수 곡선 실수 값들의 집합(매개변수u 로 표현되는)을 점들의 집합으로 사상하는 함수 삼차원공간에서 사상할 때 을 공간곡선이라고 한다
평균 속력r r=d/u 곡률
함수f가 다음과 같다면 x0값 에서 연속이라고 한다
함수f(x) 가 구간(a,b) 에서 모든x값 에 대해 연속이라면, 그 함수는 그 구간에서 위치적 또는 C0연속이라고 한다 함수f(x) 의 일계 도함수 f’(x)가 구간(a,b) 를 따라서 연속이라면 그 구간에서 접선적 또는 C1연속이라고 한다.
각 세그먼트에서 접선들이 동일한 방향을 가리키면 G1연속이라고 한다 함수 f(x)의 이계 도함수 f’’(x) 가 구간(a,b) 를 따라서 연속이라면 그 구간에서 C2연속이라고 한다. (곡률 연속)
9.3 선형 보간 두 점을 통과하는 매개변수 곡선을 사용해서 그 선 위의 점을 생성하는 것을 선형 보간이라고 한다
두점 P0,P1을 통과하는 선의 공식 (u의 범위는[0,1])
행렬공식으로 표현 U=(1,u,u2,u3,…) M은 매개변수 곡선에 필요한 인자 G는 곡선의 좌표를 포함하는 행렬
선형보간의 행렬 표현
선형보간의 행렬 표현
매개변수 구간 변환 매개변수 t 구간[t0,t1] -> 매개변수 u구간[0,1]
조각적 선형 보간
(C0연속이다)
9.4 라그랑주 다항식 점들 P0,P1,…,Pn-1,Pn 을 통과하는 곡선의 방정식
9.5 에르미트(Hermit) 곡선
P398, P598 참고
점P1에서 C1연속인 경우 접선의 기울기가 같다
접선의 길이가 다른 경우 곡률이 다르다
점P1에서 G1연속인 경우 접선이 일치하지는 않지만 방향은 같다
P1에서 접선들이 다른 방향을 가지는 경우
입반사 접선 벡터들을 보여주는 에르미트 곡선에 대한 가능한 인터페이스
에르미트 곡선의 자동 생성 C2연속을 유지하는 접선 생성, P403참고
경계조건으로 P’0, P’n을 설정하는 경우
자연스러운 단부 조건 이계도함수가 두 끝점에서 0라고 가정하는 경우
순환 단부 조건 일계,이계도함수가 두 끝점에서 같다고 가정
비순환 단부 조건 일계,이계도함수가 두 끝점에서 부정이라고 가정
9.6 Catmul-Rom 스플라인 에르미트 곡선에 다음 경계조건을 사용한다
Pi와Pi+1사이의 에르미트 곡선의 행렬에 대입 P’0와P’n는 아직 모름
방법1)P1과P2에 근거한 P0에서의 접선 벡터의 자동 생성
방법2)두점과 하나의 접선으로 2차식으로 세그먼트 생성 Q0의 경우
9.7 베지어 곡선
Pi는 집합의 조정점, 가중치 처럼 사용됨. 번스타인 다항식
( n=2일때, 점2개 ) 2차원 베지어 곡선 ( n=3일때, 점3개 )
3차원 베지어 곡선 (n=4일때, 점4개 )
조각별 베지어 곡선
베지어 곡선의 조정점 자동 생성
9.8 B-스플라인 보간하는 방법과 근사하는 방법의 일반화다. 유용하지만 복잡하다. 게임에서는 일반적으로 이용되지 않는다.
균등 3차 B-스플라인의 예
9.9 유리 곡선(Rational Curves) w(u) 함수 추가해서 동차 곡선으로 만들었다 Non-uniform rational B-spline (NURBS) 가 CAD 시스템에서 유용하다.
9.10 곡선 렌더링하기 3차 곡선을 사용한다면 다음 식으로 n개의 라인 세그먼트를 생성하여 그린다.
전진차분 u를 균등 간격h로 샘플링한다고 가정한다 매개변수가 u일때 x값은 xi 매개변수가 u+h일때 x값은 xi+1 y, z 는 x와 유사하게 계산한다
중간분할 곡선Q(u)를 중간인 Q(1/2) 에서 새로운 곡선 L(s)와 R(t)로 나눈다 void RenderCurve( Q ) { if( Straight( Q ) ) DrawLine( Q(0), Q(1) ); else MidointSubdivide( Q, &L, &R ); RenderCurve( L ); RenderCurve( R ); }
곡선이 직선에 가까운지 평가 곡선의 길이와 끝점을 연결한 선분 길이 비교 곡선의 중간점과 끝점을 연결한 선분과의 거리 비교
베지어 곡선은 다음 처럼 평가할 수 있다 선분P0P3에 대해서 P1과 P2의 거리를 측정
베지어 곡선 분할하는 방법 de Cateljau(드 카스텔죠)의 방법
OpenGL 사용하기 OpenGL 로 베지어 곡선 그릴 수 있다 http://www.opengl.org/sdk/docs/man/xhtml/glMap1.xml void glMap1f( GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat * points); void glMap1d( GLenum target, GLdouble u1, GLdouble u2, const GLdouble * points);
http://www. opengl. org/sdk/docs/man/xhtml/glEvalCoord http://www.opengl.org/sdk/docs/man/xhtml/glEvalCoord.xml void glEvalCoord1f( GLfloat u); void glEvalCoord1d( GLdouble u); void glEvalCoord2f( GLfloat u, GLfloat v); void glEvalCoord2d( GLdouble u, GLdouble v); http://www.opengl.org/sdk/docs/man/xhtml/glEvalMesh.xml void glEvalMesh1( GLenum mode, GLint i1, GLint i2);
http://www. opengl. org/sdk/docs/man/xhtml/glMapGrid http://www.opengl.org/sdk/docs/man/xhtml/glMapGrid.xml void glMapGrid1d( GLint un, GLdouble u1, GLdouble u2); void glMapGrid1f( GLint un, GLfloat u1, GLfloat u2); void glMapGrid2d( GLint un, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); void glMapGrid2f( GLint un, GLfloat u2, GLfloat v1, GLfloat v2);
IvVector3 controlPoints[] = { IvVector3(0. 0f, 0. 0f, 0 IvVector3 controlPoints[] = { IvVector3(0.0f, 0.0f, 0.0f), IvVector3(1.0f, 1.0f, 0.0f), IvVector3(2.0f, -1.0f, 0.0f), IvVector3(4.0f, 0.0f, 0.0f), }; glMap1f( GL_MAP1_VERTEX_3, 0.0f, 1.0f, 3, 4, (float*)&controlPoints[0].x ); glEnable( GL_MAP1_VERTEX_3 ); glBegin( GL_LINE_STRIP ); For( unsigned int i = 0; i < 32; ++i ) glEvalCoord1f( (float)i/32.0f ); } glEnd();
9.11 곡선을 따라서 속력 조절하기 상수 속력으로 이동
고정이동비율 r 이동시간 t 거리 s s = rt 인 거리를 다루기 원한다 u1이 주어지면 Q(u1)과 Q(u2) 사이의 호길이가 s 가 되는 u2 를 찾아야한다 다음 식의 해 u 를 찾는다 (length() 는 호 길이 함수)
뉴튼-랩슨 근 찾기
float FindParamaterByDistance( float u1, float s ) { if( s > ArcLength( u1, 1.0f ) ) return 1.0f; float len = ArcLength( 0.0f, 1.0f ); float p = u1 + s / len; for( int i = 0; i < MAX_ITER; ++i ) float func = ArcLength( u1, p ) – s; if( fabsf( func ) < EPSILON ) return p; } p -= func/Length( Derivative(p)); } }
호 길이 계산하기 가우스 구적법 Appendix B 참고 곡선을 분할해서 분할점을 잇는 선분 길이 총합 사용
3차 베지어 곡선은 de Cateljau의 방법으로 분할할 수 있다
가속과 감속
9.12 카메라 조작 카메라의 움직임을 곡선의 경로로 조절 프로그래밍적으로 수행할 수 도 있지만 아티스트가 경로를 설정하는게 좋다 카메라의 위치는 Q(t) 로 계산 카메라 방향 설정은 여러가지 방법이 있음
카메라 방향 설정 방향 고정 위치와 함께 방향 정보도 시간 별로 저장 프레넷 프레임(Frenet frame) (u 시선벡터, v 사이드벡터,w 업벡터)