반응형
Notice
Recent Posts
Recent Comments
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Archives
Today
Total
관리 메뉴

Do Something IT

선형 보간 법 본문

Study/Programming Math

선형 보간 법

아낙시만더 2013. 11. 6. 15:34
반응형


출처:  바로가기 


2011.09.17 : 직선과 원의 방정식에 대한 매개변수 표현법을 추가하였습니다.



선형 보간 법


Graphics Programming 시에 애니메이션의 보간 처리를 할 때 선형 보간 법(Lerp)과 구면 선형 보간법(SLerp),

스플라인 보간법(Spline)등을 이용한다.


이번 장에서는 선형 보간에 대해서 다룬다.


선형 보간은 애니메이션 뿐만 아니라, Sensor의 Low-pass filter, High-pass filter 모듈 설계시에도 응용 된다.


애니메이션의 보간은 사원수를 기준으로 설명하도록 한다.


매끄러운 3D 애니메이션을 위해서는 사원수들을 이용하여 보간한다.


1. 사원수 보간


예를 들어 q0와 q1이 있다고 하자.(q0는 직전 시간의 단위 사원수(과거), q1은 현재 시점의 단위 사원수(현재) 이다.)


q(t) = f0(t)q0 + f1(t)q1   (0 <= t <= 1)


함수 f0(t)와 f1(t)는 다음과 같은 성질을 갖는 스칼라 함수 이다.

f0(0) = 1

f0(1) = 0

f1(0) = 0

f1(1) = 1



2. 선형 보간(Lerp)


기본적으로 선 상에 있는 두 점에 위치를 이미 알고 있는 상태에서

점 q0에서 점 q1 사이의 점들에 대해서 시간의 변화에 따라서 해당 점들을 예측 하는 것이다.


선형 보간을 아래의 그림으로 예로 든다면, 빨간색 점 2개가 파란색 선 상에 있을 경우, 파란 색 점 (x, y)를 구할 수 있다.



선을 표현하는 방법으로 다음과 같은 3가지 방식으로 표현할 수 있다.

양함수(Explicit function) : y = f(x)

음함수(Implicit function) : f(x, y) = 0    or    f(x) + g(y) = 0

매개변수 표현식(Parametric representation) : x=f(t),    y=g(t)


예를 들어 직선(Line)과 원(Circle)에 대해서 3가지 함수 표현식으로 나타내면 다음과 같다.


1. 직선(Line)

양함수 : y = f(x) = ax + b

음함수 : f(x, y) = y - ax - b = 0

매개변수 표현식 : x = f(t) = (1.0 - t)*x0 + t*x1,    y = g(t) = (1.0 - t)*y0 + t*y1


2. 원(Circle)

양함수 : y = f(x) = √(R^2 + x^2)    or    y = -√(R^2 + x^2)

음함수 : f(x, y) = (x^2) +( y^2) -( R^2) = 0

매개변수 표현식 : x = R*cos(θ),    y = R*sin(θ)      (0 ≤ θ ≤ 2∏)



※ 직선의 매개변수 표현식은 벡터를 이용해서 증명할 수 있다.
위의 그림를 통해서 원점을 기준으로 벡터 S를 구하면, (x0, y0)이며, 벡터 E는 (x1, y1)이다.
이때 벡터 S와 벡터 E간의 차를 구하면 S와 E를 연결하는 방향 벡터 D를 구할 수 있다.
D = E - S
이는 벡터 S를 기준으로 방향벡터 D의 방향으로 일정 거리를 이동 시키면 (x, y) 값을 구할 수 있다.
(x, y) = S + t*D = S + t*(E - S) = S - t*S + t*E = (1 - t)*S + t*E = (1 - t)*(x0, y0) + t*(x1, y1)
로 유도할 수 있다.

여기서 매개변수 t는 직선을 그리기 위한 점(point)들의 집합을 구성하는데 필요한 가중치 값이다.
이는 차후 보간 처리할 때 사용하는 interpolation step으로 유도된다.



사원수의 선형 보간은 위의 직선의 매개변수 표현식을 이용하여 다음과 같이 정의할 수 있다.

lerp(t, q0, q1) = (1 - t)*q0 + t*q1 = t*(q1 - q0) + q0


사용 예


float t = m_animation.Elapsed / m_animation.Duration;

start.Color.Lerp(t, end.Color);

start.LowerLeft.Lerp(t, end.LowerLeft);

start.ViewportSize.Lerp(t, end.ViewportSize);


Vector4 Lerp(float t, const Vector4& v) const
{
return Vector4(x * (1 - t) + v.x * t,
                      y * (1 - t) + v.y * t,
                      z * (1 - t) + v.z * t,
                      w * (1 - t) + v.w * t);
}


시간 변화량 t 는 함수가 그리는 함수가 호출되는데 걸린 시간 Elapsed를 Animation이 완료될 때까지 걸리는 시간(ex 0.25ms ; 상수)으로 나눈 값이다.


선형 보간은 계산식이 간단하기 때문에 속도는 빠르다. 하지만, 애니메이션을 매끄럽게 표현하지는 못한다.

이는 선형 보간을 수행할 때 시간 변화량 t를 고정된 비율(range : 0 <= t <= 1)로 변화 시킨다고 해도 애니메이션의 속도가 빨라지거나

느려질 수 있다.

(일반적으로 t는 변화되는 비율을 이용한다.)


이러한 애니메이션 속도의 품질을 희생 시키더라도, 전체적인 수행 속도를 향상 시킬 경우에는 이상적인 선택일 수 있다.


선형 보간은 규모(magnitude)를 보존하지 않기 때문에, 선형 보간을 회전에 사용할 경우에는 결과를 정규화(Normalized)하는 것이 좋다.(Normalized 하는 것은 단위 벡터로 만드는 것과 같은 것으로 보면 된다.)


아래는 사원수의 정규화 식이다.



정규화를 해야 하는 이유는 아래와 같은 구면체에 있는 두 점에서 발생하는 문제 때문이다.



구면에서 점 q1과 q2를 선형 보간 할 경우, 구의 표면을 이동하는 것이 아니라, 내부를 관통해서 연결 되어 버린다.

이 경우 매끄럽지 않은 선형 보간이 이루어 진다.


이때, 단위 사원수를 Normalize 할 경우에는 다음의 그림 (a)와 같이,

점 q1과 q2를 잊는 선에 있는 점 m과 n이 정규화를 거쳐서 m'와 n' 위치로 구할 수 있다.



하지만, Normalized된 선형 보간의 경우에도 문제는 여전히 남아 있는다.

사원수의 Slerp(구면 선형 보간) 보간 처리한 그림(b)를 보면, 그림(a)에 비해서, m'과 n'의 더 잘 분포되어 있다.


 

사원수를 이용하여, 매끄러운 애니메이션을 구현할 경우에는 러프(Lerp) 보다는 

구면 선형 보간(Spherical Linear Interpolation ; SLerp)를 이용하는 것이 더 좋다.



참고 문헌

1. Game Programming Gems Vol1 : 2.9 사원수들의 보간

2. Linear Interpolation : http://en.wikipedia.org/wiki/Lerp_%28computing%29

3. Quaternion : http://blog.naver.com/earless4cats/80069449475


반응형
Comments