선형 보간은 보통 Math.f 라이브러리의 Lerp 함수를 사용한다.
선형 보간은 일반적으로 두 벡터 사이에 직선의 위치를 파악할 때 사용된다.
그리고 오늘 Lerp 함수가 아닌 SLerp 함수를 사용하는 것을 보았다.
SLerp 클래스는 구면 선형 보간을 수행해주는 함수이다.
이번 게시글에선 Lerp와 SLerp의 차이와 둘이 돌아가는 원리에 대해 공부한 것을 적겠다.
1. 선형 보간 (Linear interpolate)
선형 보간은 두 지점을 선형으로 연결해서 두 지점사이의 위치를 파악하는 방법이다.
t를 기준으로 t가 0일 때 시작 벡터이고 t가 1일 때 목표벡터에 도달한다.
당연히 이는 직선 벡터에서 적용되는 것이다.
선형 보간에서 사용하는 직선은 두 벡터를 감싸는 외접원이 있다고 가정했을 때 둘을 잇는 현에 해당하는 벡터이다.
선형 보간으로 얻은 벡터를 정규화하면, 두 점 사이에 가장 짧은 호를 따라가는 보간을 얻을 수도 있다.
그러나 선형 보간의 경우 두 점 사이의 직선을 통과하기 때문에
포물선과 같은 부드러운 선을 통과할 때 일정한 속도로 움직이지 못한다.
2. 구면 선형 보간 (Spherially interpolate)
구면 선형보간은 포물선과 같은 곡선에서 보간을 해주는 방법이다.
선형 보간보다 시간이 더 걸리지만, 3d 공간에서 부드러운 애니메이션
혹은 속도가 일정한 회전 운동 , 포물선 운동을 구현할 때 자주 쓰인다.
0 <= t <= 1인 단위원에서 두 점 사이 보간 결과를 V3이라고 하면
V3 = n * V1 + m * v2이다.
여기서 n을 구하려면
h = n * sinθ , h = sinθ(1 - t)
n = sinθ(1-t) / sinθ이다.
그리고 m은
h = m * sinθ , h = sinθ * t
m = sinθ * t / sinθ이다.
즉 V3 = (sinθ(1-t) / sinθ) * V1 + (sinθ * t / sinθ) * V2이다.
3. 마무리
유니티의 SLerp는 사원수(Quaternion)를 사용하여 선언되어있다.
사실 유니티뿐만이 아닌, 거의 모든 3D 공간에서 사원수를 활용하여 보간을 시도한다.
사원수를 활용하기 때문에, Lerp의 호를 그리는 방법의 한계(비율이 일정하지 않은 문제)를 극복할 수 있다.
사원수는 복소수를 일반화한 것이다.
사원수에선 복소수를 2차원의 점이나 벡터로 간주한다.
그리고 복소수를 활용하여 2차원의 회전을 표현할 수 있다.
이러한 성질을 가진 복소수의 순서쌍으로 3차원 공간에서 회전을 표현하거나, 보간을 시도한다.
다음 게시글에서는 사원수의 성질과 이것으로 어떻게 SLerp가 선언되어있는지 자세하게 게시하겠다.
'게임 수학과 물리 > Math In Unity' 카테고리의 다른 글
Unity2D에서 메쉬를 활용한 출렁이는 물 구현 (0) | 2023.06.28 |
---|