Rotate, rotation, eulerAngles

eulerAngles

 

회전은 transform.rotation 외에 eulerAngles을 사용하는 방법이 있다.

 

transform.eulerAngles = new Vector3(0.0f, 0.0f, 0.0f);

 

오일러 앵글은 몇 도로 회전할 것인지 Vector3를 통해 절대 값(absolute value)을 그대로 넣어준다.

 

 

 

 

여기에서 absolute value라고 했는데 무슨 의미인지 아래 코드를 보자.

 

_yAngle += Time.deltaTime * 100.0f;
transform.eulerAngles = new Vector3(0.0f, _yAngle, 0.0f);

 

 

오일러 앵글은 

transform.eulerAngles = new Vector3(0.0f, Time.deltaTime * 100.0f , 0.0f);

 

이렇게 정확한 값 하나가 아니라 연산중인 값을 안에 넣을 수 없다.

 

유니티 공식 문서를 보면 앵글을 absolute value로만 사용하라고 나와있는데,

이것은 절대 각도에 덧셈을 하지 말라는 의미이다.

왜냐하면 360도 넘어가게 될 경우 오작동을 일으킬 수도 있으니까 하지 말라고 나온다.

 

 

 

 

 

Rotate

 

위의 방법 외에 회전에 대한 대안이 있다.

 

transform.Rotate(new Vector3(0.0f, Time.deltaTime * 100, 0.0f));

 

만약 절대값을 입력하고 싶다면 오일러 앵글에 입력하고,

그것이 아니라면 Rotate를 사용하자.

 

 

 

 

 

 

Quaternion - rotation

 

이제 회전을 배웠으니 원하는 특정 방향으로 캐릭터를 회전시켜서 바라보게 하고 싶다.

우리가 굳이 수학적인 계산을 할 필요 없이 이미 유니티에 구현되어 있다.

 

Quaternion qt = transform.rotation // Rotate가 아니라 rotation

 

 

주의할 점은 transform.rotation이 Vector3 타입이 아니라 Quaternion 타입이란 것이다.

 

만약 Vector3를 이용하면 짐벌록 문제가 발생하기 때문에 쿼터니언 타입을 사용한다.

 

 

 

 

 

Quaternion - Euler

 

Quaternion.Euler()

 

쿼터니언 타입 안에 있는 오일러 함수는 직접 x y z를 입력하거나, Vector3를 이용해서 x y z를 입력하면

쿼터니언으로 변환해준다.

 

 

마치 물체의 이동에서 로컬 좌표와 월드 좌표를 왔다갔다 할 수 있는 것처럼

쿼터니언과 오일러를 왔다갔다 할 수 있는 함수이다.

 

 

그래서

transform.rotation = Quaternion.Euler(new Vector3(0.0f, 90.0f, 0.0f ))

오일러를 사용하는 rotation에도 문제 없이 작동한다.

 

 

 

 

 

 

Quaternion - LookRotation

 

쿼터니언 안에는 또 LookRotation이란 함수가 있다.

 

이 함수는 임의의 쿼터니언으로 만들어주는데, 우리가 원하는 방향을 쳐다보게 로테이션을 만들어준다.

 

Quaternion.LookRotation(Vector3.forward);

 

 

 

로컬 좌표 기준이 아니라 월드 좌표 기준으로 동작한다.

 

 

 

 

 

Quaternion - Slerp 

 

위의 LookRotation은 바라보는 방향으로 회전하지만, 너무 정확히 한 방향으로 경직되게 회전한다.

 

쿼터니언 안의 Slerp 함수 설명을 보면

쿼터니언 a, b, float를 입력해서

현재 지점 a와 최종 목적지 b 에서 몇프로 확률로 어느 방향을 보게 할 것인지 0에서 1사이를 입력한다.

여기에서 0은 a와 가깝다는 의미이고 1은 b와 가깝다는 의미이다.

 

transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.forward), 0.5f);

 

 

 

 

이것을 조합해서 바라보는 방향으로 움직이게 할 수 있다.

if(Input.GetKey(KeyCode.W))
{	
	
    transform.rotation = Quaternion.Slerp(transform.rotaion, Quaternion.LookRotation(vector3.forward), 0.2f);
    transform.position += Vector3.forward * Time.detaTime;
}

 

바라보는 방향으로 물체를 움직일 때는 translate로 바로 조작하기보다 position을 사용하는 것이 더 좋다.

 

그러면 바라보는 방향과 상관없이 무조건 해당 월드 좌표를 기준으로 절대 좌표로 이동할 수 있다. 

 

 

 

 

 

정리

 

절대값을 입력하고 싶다면 오일러 앵글에 입력하고,

그것이 아니라 연산 과정을 바로 넣고싶다면 Rotate를 사용한다.

transform.Rotate(new Vector3(0.0f, Time.deltaTime * 100.0f, 0.0f));

rotation은 Quaternion을 사용한다.

transform.rotation = Quaternion.Euler(new Vector3(0.0f, _yAngle, 0.0f));

 

 

 

 

 


 

 

레퍼런스

 

https://www.inflearn.com/course/mmorpg-%EC%9C%A0%EB%8B%88%ED%8B%B0/dashboard