EssentialMath_스터디_9_곡선
Download
Report
Transcript EssentialMath_스터디_9_곡선
Part III 애니메이션
Chapter 9 곡선
1
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 카메라 조작
2
9.1 소개
• 애니메이션 리샘플링
– 두점 사이 보간
– 조정점(controls point,제어점)을 사용해서 근사
• 기타 다른 용도로 유용하게 사용될 수 있음
3
9.2 일반적인 정의
• 매개변수 곡선
– 실수 값들의 집합(매개변수u 로 표현되는)을
점들의 집합으로 사상하는 함수
– 삼차원공간에서 사상할 때 을 공간곡선이라고
한다
Q(u ) ( x(u ), y (u ), z (u ))
Q(u ) ( x(u ), y(u ), z (u ))
4
• 평균 속력r
r=d/u
• 곡률
1/
( 는 접촉원의반지름)
5
• 함수f가 다음과 같다면 x0값 에서 연속이라
고 한다
lim f ( x) f ( x0 )
x x0
6
• 함수f(x) 가 구간(a,b) 에서 모든x값 에 대해
연속이라면, 그 함수는 그 구간에서 위치
적 또는 C0연속이라고 한다. ( 위치적 연
속)
• 함수f(x) 의 일계 도함수 f’(x)가 구간(a,b)
를 따라서 연속이라면 그 구간에서 접선적
또는 C1연속이라고 한다.
7
• 각 세그먼트에서 접선들이 동일한 방향을
가리키면 G1연속이라고 한다
• 함수 f(x)의 이계 도함수 f’’(x) 가 구간(a,b)
를 따라서 연속이라면 그 구간에서 C2연속
이라고 한다. (곡률 연속)
8
9.3 선형 보간
두 점을 통과하는 매개변수 곡선을 사용해서 그 선
위의 점을 생성하는 것을 선형 보간이라고 한다
9
• 두점 P0,P1을 통과하는 선의 공식
(u의 범위는[0,1])
Q(u ) P0 u ( P1 P0 )
Q(u ) (1 u ) P0 uP1
10
• 행렬공식으로 표현
U=(1,u,u2,u3,…)
M은 매개변수 곡선에 필요한 인자
G는 곡선의 좌표를 포함하는 행렬
Q(u ) U M G
11
• 선형보간의 행렬 표현
U u 1
1
M
1
x0
G
x1
1
0
y0
y1
z0 P0
z1 P1
12
• 선형보간의 행렬 표현
UMG x(u )
y (u ) z (u )
1 1 P0
u 1
P
1
0
1
P0
u 1 u
P1
(u 1) P0 uP1
(1 u ) x0 ux1 (1 u ) y0 uy1 (1 u ) z0 uz1
13
• 매개변수 구간 변환
매개변수 t 구간[t0,t1] -> 매개변수 u구간[0,1]
t t0
u
t1 t 0
14
조각적 선형 보간
Qi (u ) (1 u ) Pi uPi1
15
Qi (u ) (1 u ) Pi uPi1
Qi (1) (1 1) Pi Pi 1 Pi 1
Qi 1 (0) (1 0) Pi 1 0 Pi 2 Pi 1
Qi (1) Qi 1 (0)
(C0연속이다)
16
9.4 라그랑주 다항식
• 점들 P0,P1,…,Pn-1,Pn 을 통과하는 곡선의 방
정식
n
P(t ) Pk Ln ,k (t )
k 0
(t ti )
Ln ,k (t )
i 0 ,i k (t k ti )
n
(t t0 )(t t0 ) (t t k 1 )(t t k 1 ) (t t n )
(t k t0 )(t k t0 ) (t k t k 1 )(t k t k 1 ) (t k t n )
17
9.5 에르미트(Hermit) 곡선
18
Q(t ) au 3 bu 2 cu D
Q(t ) 3au 2 2bu c
Q (0) D P0
P398, P598 참고
Q (1) a b c D P1
Q(0) c P0
Q(1) 3a 2b c P1
19
Q (u ) [ 2( P0 P1 ) P0 P1]u 3
[3( P1 P0 ) 2 P0 P1]u 2 P0u P0
Q (u ) ( 2u 3 3u 2 1) P0 ( 2u 3 3u 2 ) P1
(u 3 2u 2 u ) P0 (u 3 u 2 ) P1
U u3
2
3
M
0
1
P0
P1
G
P0
P
1
u2
u
2
3
0
0
1
1
2
1
0
1
1
0
0
20
• 점P1에서 C1연속인 경우
– 접선의 기울기가 같다
21
• 접선의 길이가 다른 경우
– 곡률이 다르다
22
• 점P1에서 G1연속인 경우
– 접선이 일치하지는 않지만 방향은 같다
23
• P1에서 접선들이 다른 방향을 가지는 경우
24
• 입반사 접선 벡터들을 보여주는 에르미트
곡선에 대한 가능한 인터페이스
25
에르미트 곡선의 자동 생성
C2연속을 유지하는 접선 생성, P403참고
Pi 4 Pi1 Pi 2 3( Pi 2 Pi )
1
0
0
0
4
1
0
... 0
1
4
1
... 0
...
0 ...
1
4
1
0 ...
0
1
4
0 P0 3( P2 P0 )
0 P1 3( P3 P1 )
...
...
0 Pn 1 3( Pn 1 Pn 3 )
1 Pn 3( Pn Pn 2 )
26
경계조건으로 P’0, P’n을 설정하는 경우
Q0 (0) P0 v0
Qn 1 (1) Pn v1
1
1
0
0
0
0
0
4
1
0
1
4
...
0 ...
0 ...
0 ...
0 ... 0
0 ... 0
1 ... 0
1
0
0
4
1
0
1
4
0
v0
0
0 P0 3( P2 P0 )
0 P1 3( P3 P1 )
...
...
0 Pn1 3( Pn 1 Pn 3 )
1 Pn 3( Pn Pn 2 )
v
1
1
27
자연스러운 단부 조건
이계도함수가 두 끝점에서 0라고 가정하는 경우
Q0(0) Qn1 (1) 0
2
1
0
0
0
0
1
4
1
0
1
4
...
0 ...
0 ...
0 ...
0 ... 0
0 ... 0
1 ... 0
1
0
0
4
1
0
1
4
1
0
3( P1 P0 )
0 P0 3( P2 P0 )
0 P1 3( P3 P1 )
...
...
0 Pn1 3( Pn 1 Pn 3 )
1 Pn 3( Pn Pn 2 )
3( P P )
2
n
n 1
28
순환 단부 조건
일계,이계도함수가 두 끝점에서 같다고 가정
Q0 (0) Qn 1 (1)
Q0(0) Qn1 (1)
4
1
0
0
0
1
1
0
0
...
0
4
1
1
4
...
...
...
...
0
1
...
...
0
0
1
0
0
4
1
0
1
4
1
0
0
0
1
3( P1 P0 ) 3( Pn Pn 1 )
0
3( P2 P0 )
P0
0
3( P3 P1 )
P1
...
...
0
3( Pn 1 Pn 3 )
Pn1
1
3
(
P
P
)
n
n2
4
29
비순환 단부 조건
일계,이계도함수가 두 끝점에서 부정이라고 가정
Q0 (0) Qn 1 (1)
Q0(0) Qn1 (1)
4
1
0
0
0
1
1
0
0
...
0
4
1
1
4
...
...
...
...
0
1
...
...
0
0
1
0
0
4
1
0
1
4
1
0
0
0
1
3( P1 P0 ) 3( Pn Pn 1 )
0
3( P2 P0 )
P0
0
3( P3 P1 )
P1
...
...
0
3( Pn 1 Pn 3 )
Pn1
1
3
(
P
P
)
n
n2
4
30
9.6 Catmul-Rom 스플라인
에르미트 곡선에 다음 경계조건을 사용한다
Pi
1
( Pi 1 Pi 1 )
2
31
Pi와Pi+1사이의 에르미트 곡선의 행렬에 대입
P’0와P’n는 아직 모름
32
방법1)P1과P2에 근거한 P0에서의 접선 벡터의 자동 생성
1
( 2 P1 P2 P0 )
2
1
Pn
( Pn 2 Pn 1 Pn 2 )
2
P0
33
방법2)두점과 하나의 접선으로 2차식으로 세그먼트 생성
Q0의 경우
34
35
9.7 베지어 곡선
36
37
38
Pi는 집합의 조정점, 가중치 처럼 사용됨.
번스타인 다항식
39
( n=2일때, 점2개 )
Qi (u) (1 u) P0 uP1
2차원 베지어 곡선 ( n=3일때, 점3개 )
Qi (u ) (1 u ) P0 2u (1 u ) P1 u P2
2
2
40
3차원 베지어 곡선 (n=4일때, 점4개 )
41
42
조각별 베지어 곡선
43
베지어 곡선의 조정점 자동 생성
44
9.8 B-스플라인
보간하는 방법과 근사하는 방법의 일반화다.
유용하지만 복잡하다.
게임에서는 일반적으로 이용되지 않는다.
n
Q(u ) Pi Bi (u )
i 0
45
균등 3차 B-스플라인의 예
1
Bi 3 (u ) (u 3 3u 2 3u 1)
6
1
Bi 2 (u ) (3u 3 6u 2 4)
6
1
Bi 1 (u ) (3u 3 3u 2 3u 1)
6
1 3
Bi (u ) (u )
6
46
Qi (u ) u
3
u
2
1 3 3
3 6 3
1
u 1
3
6 3 0
4
1
1
1 Pi 3
0 Pi 2
0 Pi 1
0 Pi
47
48
9.9 유리 곡선(Rational Curves)
w(u) 함수 추가해서 동차 곡선으로 만들었다
Q(u ) ( x(u ), y (u ), z (u ), w(u ))
x(u ) y (u ) z (u )
R(u )
,
,
w(u ) w(u ) w(u )
Non-uniform rational B-spline (NURBS) 가
CAD 시스템에서 유용하다.
49
9.10 곡선 렌더링하기
3차 곡선을 사용한다면 다음 식으로 n개의
라인 세그먼트를 생성하여 그린다.
Q(u) au bu cu D
3
2
Q(u) au bu cu D
50
전진차분
u를 균등 간격h로 샘플링한다고 가정한다
매개변수가 u일때 x값은 xi
매개변수가 u+h일때 x값은 xi+1
y, z 는 x와 유사하게 계산한다
x1 (u ) xi 1 xi x(u h) x(u )
51
52
53
54
중간분할
곡선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 );
}
}
55
곡선이 직선에 가까운지 평가
곡선의 길이와 끝점을 연결한 선분 길이 비교
곡선의 중간점과 끝점을 연결한 선분과의 거리 비교
56
베지어 곡선은 다음 처럼 평가할 수 있다
선분P0P3에 대해서 P1과 P2의 거리를 측정
57
베지어 곡선 분할하는 방법
de Cateljau(드 카스텔죠)의 방법
58
OpenGL 사용하기
OpenGL 로 베지어 곡선 그릴 수 있다
http://www.opengl.org/sdk/docs/man/xhtml/glMap1.xml
void glMap1f(
GLenum
GLfloat
u1,
GLfloat
u2,
GLint
stride,
GLint
order,
const GLfloat *
void glMap1d(
GLenum
GLdouble
u1,
GLdouble
u2,
GLint
stride,
GLint
order,
const GLdouble *
target,
points);
target,
points);
59
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);
60
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
u1,
GLdouble
u2,
GLint
vn,
GLdouble
v1,
GLdouble
v2);
void glMapGrid2f( GLint
un,
GLfloat
u1,
GLfloat
u2,
GLint
vn,
GLfloat
v1,
GLfloat
v2);
61
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();
62
9.11 곡선을 따라서 속력 조절하기
상수 속력으로 이동
63
고정이동비율 r
이동시간 t
거리 s
s = rt 인 거리를 다루기 원한다
u1이 주어지면 Q(u1)과 Q(u2) 사이의 호길이
가 s 가 되는 u2 를 찾아야한다
다음 식의 해 u 를 찾는다
(length() 는 호 길이 함수)
s length(u1 , u) 0
64
뉴튼-랩슨 근 찾기
f ( p) 0
1
f ( x) f ( x ) ( x x ) f ( x ) ( x x ) 2 f ( ( x))
2
1
0 f ( x ) ( p x ) f ( x ) ( p x ) 2 f ( ( x))
2
0 f ( x ) ( p x ) f ( x )
f (x)
px
f ( x )
65
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));
}
66
호 길이 계산하기
b
s Q(u ) du
a
가우스 구적법 Appendix B 참고
곡선을 분할해서 분할점을 잇는 선분 길이 총합 사용
uk 1 u
u uk
s
sk
sk 1
u k 1 uk
u k 1 uk
u
s j 1 s
s j 1 s j
uj
s sj
s j 1 s j
u j 1
67
3차 베지어 곡선은 de Cateljau의 방법으로
분할할 수 있다
Lmin P3 P0
Lmax P1 P0 P2 P1 P3 P2
1
L ( Lmin Lmax )
2
( Lmax Lmin ) 2
68
가속과 감속
69
70
71
9.12 카메라 조작
카메라의 움직임을 곡선의 경로로 조절
프로그래밍적으로 수행할 수 도 있지만 아티
스트가 경로를 설정하는게 좋다
카메라의 위치는 Q(t) 로 계산
카메라 방향 설정은 여러가지 방법이 있음
72
카메라 방향 설정
방향 고정
위치와 함께 방향 정보도 시간 별로 저장
프레넷 프레임(Frenet frame)
(u 시선벡터, v 사이드벡터,w 업벡터)
73