t
에 대한 TransformationT
를 다 만들어줄 필요 없이, 특정 t
에 대해서만 T
를 만들어 주면(keyframe) 나머지 임의의 t
에 대한 T
를 계산하는 과정Transformation
- Rigid transformation
- 모양, 크기 변화 X
- Rotate + Translate
- ->
- Affine transformation
- Scale + Shear + Rigid Transf.
- ->
- Homogeneous transformation
- Projective + Affine Transf.
- 4x4 homogeneous matrix
- ->
- General transformation
- Free-form deformation
- ex) 공 찌부..
t
(시간)에 대한 x
, y
좌표로 나타내자 -> x(t)
, y(t)
x(t)
, y(t)
, z(t)
를 다항식으로 표현 (parametric polynomial, parametric curve)Polynomial
- Degree(차수): n
- Order(항수): n+1 = 계수의 개수
0~n
의 점을 지나는 선: n+1개의 식, order n+1, degree n -> n차식f(t)
은 주로 3차 곡선(cubic)을 사용함Continuous ✨
- n번 미분한 값이 연속
- n계도함수가 연속
t
:1-t
로 내분 -> 3개의 점t
:1-t
로 내분 -> 2개의 점t
:1-t
로 내분 -> 1개의 최종 새로운 점◾ Blossom
- 6번의 내분 과정에서, 내분할때마다 t 바꾸기
a, b, c, d
를 알아내기 위해 위의 4개의 식을 활용v
가 주어진 경우, 그 벡터로 Bezier curve의 두 점을 찾으면 된다v
를 똑같이 만듦)
- Convex (X)
- Control polygon밖으로 나갈 수 있음
(점 세개로 자연스러운 곡선을 그릴 때, 삼각형 안에서 자연스러운 곡선을 그릴 수 없음)- 그래서 variation diminishing도 X
- Interpolation curve는 Convex와 variation diminishing 성질을 가질 수 없음
0~음수~0~1~0~음수~0
형태0~1
를 벗어남 -> Convex와 variation diminishing 성질 Xq(t)
완성기q(t)
를 미분하여 tangent 구하기처음과 끝점의 tangent를 0으로 설정
// 양쪽 점으로 k의 tangent 계산
if( k>0 ) v0 = ( srcPts[k+1] - srcPts[k-1] )/2;
else v0 = 0;// k가 가장 처음 처음 점일 때
// 양쪽 점으로 k+1의 tangent 계산
if( k+2<srcPts.size() ) v1 = ( srcPts[k+2] - srcPts[k] )/2;
else v1 = 0 // k가 가장 마지막 점일 때
처음과 끝점의 인접한 점과의 직선을 따르도록 하기
// 양쪽 점으로 k의 tangent 계산
if( k>0 ) v0 = ( srcPts[k+1] - srcPts[k-1] )/2;
else v0 = srcPts[k+1] - srcPts[k];// k가 가장 처음 처음 점일 때
// 양쪽 점으로 k+1의 tangent 계산
if( k+2<srcPts.size() ) v1 = ( srcPts[k+2] - srcPts[k] )/2;
else v1 = srcPts[k+1] - srcPts[k]; // k가 가장 마지막 점일 때
Bessel tangent 사용
// 양쪽 점으로 k의 tangent 계산
if( k>0 ) v0 = ( srcPts[k+1] - srcPts[k-1] )/2;
else { // k가 가장 처음 처음 점일 때
// 연립방정식 ...~
//p(t) = a*t*t + b*t + c
//p(0) = c = srcPts[k]
//p(1) = a+b+c = srcPts[k+1]
//p(2) = 4*a+2*b+c = srcPts[k+2]
// 연립방정식 결과 (x, y축 각각하므로 vec2)
//vec2 a = ~;
//vec2 b = (4*srcPts[k+1] - 3*srcPts[k] - srcPts[k+2])/2;
//vec3 c = ~;
// p'(t) = 2*a*t + b
// p'(t) = b
// v0 = b;
v0 = (4*srcPts[k+1] - 3*srcPts[k] - srcPts[k+2])/2;
}
// 양쪽 점으로 k+1의 tangent 계산
if( k+2<srcPts.size() ) v1 = ( srcPts[k+2] - srcPts[k] )/2;
else v1 = -(4*srcPts[k] - 3*srcPts[k+1] - srcPts[k-1])/2; // k가 가장 마지막 점일 때
- : tangent의 방향만 같고 크기만 다른 (여전히 부드러운 곡선 -> 방향만 같으면 자연스럽다!)
b0
, b1
, b2
, b3
의 가중치 를 사용해 식 계산 (weight의 합=1)