Unity Study

2025-11-26 3rd person camera(3) - LookAt, Quaternion

NyumMa 2025. 11. 26. 20:48

Unity 3rd Person Camera

 

LookAt 메서드

대상 위치, 트랜스폼을 향하도록 게임 오브젝트를 회전시킬 때 사용함

Ex)

하나의 오브젝트가 다른 오브젝트를 바라보게 하거나 특정방향 따라 회전하게 할 때

 

Transfrom target;

Transform object;

object.LookAt(target)

 

Object가 타겟으로 하는 객체 혹은 위치 등을 바라보도록 object가 회전하게 됨

 

Object.LookAt(target, Vector3.up);

Constraint 부여

Object가 타겟을 바라보지만 방향은 위쪽을 유지(x, z축에 대해서만 transform)

 

LookAt이 방향을 구사하는 원리에 있어서 오일러 각을 사용하게 되면 짐벌락의 문제가 생기므로

쿼터니언 계산 처리로 동작한다

 

Object, target vector 2개에 대해서

Target – object를 하게 되면 object에서 target을 바라보는 방향벡터(dir vector)가 됨

오브젝트는 오브젝트 고유의 local 좌표가 있으며 forward 방향은 +z 방향

, lookAt(target) 동작시 오브젝트 로컬 +z 좌표가 해당 target의 방향을 가리키도록 회전하게 됨

 

 

쿼터니언 계산에서는 오브젝트가 target을 바라보는 축을 기준으로 하는 정규 직교 좌표계를 계산해야 함

1.     Right 벡터 방향

world공간에서의 up에 대한 방향벡터와 objecttarget을 바라보는 forward 방향벡터를 서로 외적(cross product)하면 right 벡터 성분을 구할 수 있다

2.     Target을 바라보는 정규 직교에 대한 up 벡터

Target을 바라보는 벡터와 이전에 구한 right 벡터를 외적하여 target을 정규 직교로 하는 공간의 up 벡터를 구하여

최종적으로 up right lookat에 대한 세가지 벡터를 통해 target을 바라보는 정규 직교 기저를 정의할 수 있다.

 

해당 up right, lookat 벡터들을 통해 target 3x3 matrix를 정의할 수 있음

 

목표는 기존월드공간의 정규 직교 공간에서 target 3x3 matrix로 회전되는 행렬을 구하는 것이다.

이를 Euler 방법으로 하여 각각 x축에대한 고정, y축에 대한 고정, z축에 대한 고정으로 총3번의 과정을 연속적으로 하여 구할 수는 있지만 이렇게 처리될 경우

짐벌락의 문제를 해결하기 어렵다.

 

따라서 사원수의 개념을 통해 도출한 공식을 활용하여 quaternion(x,y,z,w)의 값을 도출할 수 있고

이를 통해 object에 쿼터니언 연산을 하여 target 벡터의 방향으로

한번에 바로 변환시킬 수 있다.

è  (두 정규직교기저 행렬을 통한 쿼터니언 구하기에 대해서는 나중에 정리)

 

쿼터니언 계산시, 수학적으로는 qvq-1연산을 통해 처리하지만

유니티에서는 코드 효율성을 위해 q * v로 각 계산되도록 처리한다

 

 

복소수에서 오일러의 복소평면 개념을 도입하였을 때 기하학적인 의미로는 회전을 의미함

이에 확장하여 3차원 공간을 허수의 개념으로 확장하기 위해 수학자 해밀턴이 직관적으로 하나의 실수체계와 x,y,z 3축을 의미하는 3개의 허수부를 두어 사원수를 정의한 것

 

복소회전에서 실수부는 cos에 대한 부분을(2차원에서 가로축),

허수부는 sin(2차원에서 세로축)에 대한 부분을 담당함

 

x,y,z축에 대하여 이를 각각 분리하여 x,y,z 회전 축에 대한 회전을 구할 수 있다

 

점에 대한 회전벡터)의 경우로 먼저 내용을 증명하여, 회전축이 있고 해당 회전축을 중심으로 돌아가는 계산을 쿼터니언 계산을 통해 할 수 있는데.

오브젝트는 vertex의 집합(벡터의 집합)으로 이루어져 있으며 최종적으로 오브젝트 회전 시 vertex들의 집합에 대해서 쿼터니언회전을 처리하게 됨

 

Q 계산시 회전축을 구하는 것이 관건인데 회전축은 target을 바라보는 정교 직교 기저 R을 통해서 구할 수 있다.

-> 이에 대해서는 케이스에 따라 내용이 나뉘어지므로 추후 보강하여 설명하도록 함

 

unity에서는 특정 target에 대해 회전하는 식으로서 다음과 같이 응용할 수 있음

//각 초기화
//회전 변환은 이동에 대한 translation 처리가 update에서 끝난 후 lateupdate에서 사용하여야 됨
float angle = 0;

angle += rotatespeed * Time.deltaTime;
//y축(수직축) 회전을 쿼터니언으로 변환

//각 lateupdate에서 계속 더해지며 갱신, 2pi일때 어짜피 원점이므로 2pi로 나누어주어도 무방(float 메모리 크기 고려)
Quaternion rotation = Quaternion.Euler(0f, angle, 0f); 

//회전축으로부터 일정 거리만큼 떨어진 곳에서 회전되도록 처리 
Vector3 offset = rotation * new Vector3(0, 0, -distance); 

//물체의 원래 position을 원점으로 하여 회전 처리 Translation + rotation
obj.position = target.position + rotation*offset; 

//회전하는 물체가 중심을 계속 보게 하도록 갱신(내부적으로 쿼터니언 연산 처리)
obj.LookAt(target);

 

'Unity Study' 카테고리의 다른 글

2025-11-28 Quaternion(2)  (0) 2025.11.28
2025-11-27 Quaternion  (0) 2025.11.27
2025-11-24 version control  (0) 2025.11.24
2025-11-23 3rd perosn camera(2)  (0) 2025.11.24
2025-11-22 3rd person camera  (0) 2025.11.24