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  uPi1
15
Qi (u )  (1  u ) Pi  uPi1
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  P0u  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 Pi1  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  Pn1  3( Pn 1  Pn 3 )



1  Pn   3( Pn  Pn  2 ) 


v
1
1


27
자연스러운 단부 조건
이계도함수가 두 끝점에서 0라고 가정하는 경우
Q0(0)  Qn1 (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  Pn1  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)  Qn1 (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 )
  Pn1 
1


3
(
P

P
)


n
n2


4

29
비순환 단부 조건
일계,이계도함수가 두 끝점에서 부정이라고 가정
Q0 (0)  Qn 1 (1)
Q0(0)  Qn1 (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 )
  Pn1 
1 


3
(
P

P
)


n
n2


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  bu  cu  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)
px
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