전에 선형보간법을 공부했는데 오늘은 구면선형 보간법에 대해서 공부해보겠습니다.
원래 짐벌락이 무엇인지에 대해 조사를하다가 쿼터니언에 대해 알게되었고,
해당 쿼터니언에 대해 좀 더 알기 위해서는 구면선형 보간법이 필요했습니다.
먼저 선형보간법에 대해 다시한번 살펴보면
p1과 p2가 각각 정규화된 벡터 (크기가1)이라고 가정하면
Ps1벡터 (방향) / Ps1벡터의 크기 = 를하게되면 호를 그리게 될것입니다.
그림을 통해 살펴보면

다음과 같이 정규화를 시켜주면 p1에서 p2로 가는 호를 그릴것입니다.
(
=>정규화는 크기를 1로 만들고 벡터의 방향을 수집하는 작업으로 1보다 작은 벡터는 커지게됩니다.
그림에서 ||p1||=||p2|| = 1이기 때문입니다.
)
저는 여기서 몇가지 사실을 깨닫게 되었습니다.
아 ,구면상에서 선형보간을 하게 된다면 정규화된 Ps1을 찾기 위해 추가 작업을 해야하는 구나
그렇다면 정규화된 Ps1을 통해 Ps1' 을 그냥 사용하면 되는데 , 왜 구면선형보간법을 사용할까?
라는 생각이 들었고, 제가 찾은 이유는 다음과 같습니다.
t에 따라 p1에서 p2로 보간된 점들을 이어서 호를 그려본다면
직선 상에서는 일정한 간격이였지만, 원의 측면에서 호의 길이로 본다면 일정한 간격이 아니기 때문입니다.

위의 그림을 보면 호의 길이 L = r x 세타 입니다.
과연 위의 사진에서 세타1,2,3,4의 각도가 같을까하는 생각이 들었습니다.
정답은 아닙니다. 그래서 똑같은 호의 길이를 보장하기위해 우리는 세타를 균등하게 나눠줘야합니다.

기존의 선형보간법에서 구면선형보간법은 중심축을 원점으로 둔다고 생각하고
P1을 P2로 회전시키는데 그 사이의 각을 쪼개서 구면상에서의 최단거리와 그 사이의 간격을 보장함과 동시에
P1,과 P2 그리고 추가적으로 생성되는 Ps또한 정규화가 유지됩니다 (원의 성질)
그러면 구체적으로 Ps를 관계식으로 정의해보겠습니다.

다음과 같이 관계식으로 쓸 수 있고
이제 n과 m을 구해보겠습니다.

1번 삼각형에서보면 h 와 n의 관계를 세타를 통해 알 수 있습니다 왜냐하면 엇각의 성질과 평행사변형의 성질때문입니다.
그리고 2번 전체 큰 삼각형에서보면 h와 각을 통해 관계식을 정의할 수 있습니다.
위와 같이 m도 구하게 되면 최종적으로 관계식을 다음과 같이 유추할 수 있게 됩니다.

저는 왜 SLERP를 사용하는지가 궁금해서 조사를 하다보니 위와 같은 사실을 알게되었고
좀 더 사용하는 이유가 있을까? 생각을 해봤습니다.
그러다보니 다음과 같은 생각이 들었습니다.
우리는 지금 둥근 구 위에 살고 있습니다(지구) 그래서 직선상의 거리보다 북극을 거쳐
다른 나라를 가는 것이 더욱 빠른 경우가 있습니다.
이처럼 구면상의 최단거리는 직선상의 최단거리와 다릅니다.
구체적으로 SLERP를 사용하는 이유를 GPT 와 구글링을 통해 조사를 해봤습니다.
SLERP를 사용하는 이유는 다음과 같습니다. (사실과 다를 수 있으니 직접 찾아보세요 !)
SLERP를 사용하는 이유
1. 구면 보간
SLERP는 데이터가 구면상에 있을 때 최적의 보간 결과를 제공합니다. 이는 선형 보간(LERP)으로는 구현할 수 없는 특징입니다.
- SLERP는 구면상의 호를 따라 이동하기 때문에, 비선형적인 회전 경로나 방향 변화를 정확히 모델링할 수 있습니다.
- LERP는 직선 경로를 따르기 때문에, 구면 데이터를 다룰 때 부정확한 결과를 초래할 수 있습니다.
2. 일정한 속도 유지 (직선 상에서의 LERP와 같은 개념)
/**TODO*/
// 사실 이부분 궁금한게 선형 보간법처럼 ease in-out을 적용할 수 있는지 궁금합니다 .
// 이론상 t가 비선형으로 들어가면 일정한 속도를 유지 못하게 되며 Lerp에서의 EaseInOut과
// 같은 효과를 낼것 같다는게 제 생각인데
// 추후에 진행할 개인 프로젝트에서 한번 실험을 해볼 예정입니다.
// 저는 UE에서 다른 팀 발표를 보며 신기했던 기술인
// 플레이어에게 가속도를 붙인 기술을 SLerp와 ease-in-out으로 한번 만들어 볼 생각입니다.
// 이유는 그래야 이해가 빠를것 같기 때문입니다.
SLERP는 구면 상에서의 보간 과정에서 각속도가 일정하게 유지됩니다.
하지만 LERP는 구면상에서 각속도가 달라지게 됩니다.
- 이로 인해 3D 그래픽스나 물리 시뮬레이션에서 일관된 움직임과 부드러운 전환을 제공합니다.
- 반면, LERP는 속도가 시작과 끝에서 가변적일 수 있어 부드럽지 않은 결과를 초래합니다.
3. 최단 경로 보장
SLERP는 두 점이 구면 상에 있을 때 항상 최단 경로를 따라 이동합니다.
- 예를 들어, 두 방향 벡터 간의 회전을 나타낼 때, SLERP는 불필요한 긴 경로를 회피하고 효율적으로 이동합니다.
- 반면, LERP는 구면 외부를 가로질러 "장거리 경로"를 따라갈 수 있습니다.
쿼터니언과 SLERP의 관계
SLERP는 쿼터니언과 잘 맞는 보간 방식입니다. 그 이유는 다음과 같습니다:
1. 쿼터니언은 4D 구면에 위치
- 쿼터니언은 4차원 공간에서 단위 구 상의 점으로 표현됩니다.
- SLERP는 4D 구면 상에서 두 쿼터니언 사이의 최단 경로를 따라 보간합니다.
2. 정규화 유지
- SLERP는 계산 과정에서 쿼터니언의 정규화를 유지합니다.
- 반면, 단순 선형 보간(LERP)을 사용하면 정규화가 깨질 수 있어 회전이 왜곡됩니다. 따라서 LERP 사용 시에는 추가로 정규화를 수행해야 합니다.
3. 일정한 회전 속도
- SLERP는 구면의 호를 따라 이동하므로, 일정한 각속도를 보장합니다.
- 이와 달리 LERP는 직선 경로를 따르기 때문에 회전 속도가 일정하지 않을 수 있습니다. 특히 두 쿼터니언 간의 각도가 클수록 이러한 문제가 두드러집니다.
SLERP가 필요하지 않은 경우
1. 작은 회전
- 두 점이 구면 상에서 매우 가깝다면, LERP와 SLERP의 차이가 거의 없습니다. 이런 경우 LERP를 사용해도 충분히 좋은 결과를 얻을 수 있습니다.
- 곡선을 잘게 쪼개면 결국에는 직선이 되기 때문입니다.
2. 계산 비용 감소가 중요한 경우
- SLERP는 삼각 함수(사인, 코사인 등)를 계산하므로, LERP보다 계산 비용이 높습니다.
- 실시간 애플리케이션에서 속도가 중요하다면, LERP로 근사값을 계산한 후 정규화하여 사용할 수 있습니다.
- LERP + 정규화를 사용해, SLERP처럼 사용합니다
짐벌락에 대해 조사하다가 쿼터니언 그리고 결국에는 선형보간과 SLERP를 정리하게 되었습니다.
다음번에는 오일러 각으로 인해 생기는 짐벌락에 대해 공부하고, 그 대안인 쿼터니언에 대해 공부하겠습니다.
쿼터니언..참 어렵네요
'Unreal > Unreal 공부 내용' 카테고리의 다른 글
GetOverlappingActors(TArray<AActor*> Array) , IsA (0) | 2025.02.09 |
---|---|
TSubClassOf , UClass* , StaticClass, 클래스,인스턴스,메타데이터(미완성) (0) | 2025.02.05 |
Timer(SetTimer...) (0) | 2025.01.24 |
선형 보간 (0) | 2025.01.22 |
Actor의 생명주기 (라이프 사이클) (1) | 2025.01.21 |