Rotation

회전 초기화

// Reset the world rotation
	transform.rotation = Quaternion.identity;

특정 방향벡터에서 쿼터니언 얻기

Quaternion value = Quaternion.LookRotation( target.position ); 

이값은 rotation 객체에 넣게 되면, 변환 파이프라인에서 자동으로

해당 방향으로 회전을 처리하게 된다.

특정 x,y,z각으로 회전

transform.rotation = Quaternion.Euler( x, y, z);

해당 각으로 회전한다. 오일러 회전처럼 축이 변화하지 않으므로, 동일한 값은 update 루틴에 넣어두어도 동일한 회전으로 유지된다. (오일러 회전은 계속 변화함.)

두 회전 합치기

위의 방향과 x,y,z 회전을 합치려면?

그냥 곱셈(*) 하면 된다.

특정 지점을 원점으로 회전

하늘에 떠 있는 카메라를 원점인 (0,0,0)을 기준으로 회전시킨다고 생각하면.. 오일러 회전에서 RotateAround() 를 사용할 수 있다.

이를 쿼터니온으로 처리하려면 아래와 같은 과정을 거친다. (이해를 위해서 설명한다)

- 기준점과의 거리 저장

float distance = Vector3.Distance( A, B ); or (A-B).magnitude; 

- 로컬좌표계의 카메라(GameObject)를 회전하기 위한 쿼터니언 생성

Quaternion quat = Quaternion.Euler( new Vector3( 30.0f, 0, 0 );    // x축을 기준으로 30도 회전시킬경우 

- 해당 쿼터니언을 rotation으로 지정

transform.rotation = quat; 

- 카메라의 위치를 기준점으로 위치

transform.position = Vector3.zero; // 해당 기준점. 

- 전방을 나타내는 Vector3.forward 벡터를 위의 쿼터니언으로 회전시키고, 해당 축을 기준으로 뒤로 distance 만큼 이동

transform.position -= quat * Vector3.forward * distance; 

대강 이렇게 이루어진다.

여기서 해당 쿼터니언을 transform.rotation 에 지정하지 않고, 이동 처리한 뒤에 해당 기준점을 바라보게 하면 동일한 효과가 나타난다.

transform.LookAt( Vector3.zero ); 

오일러 각(Euler角, Euler angle)

오일러 각(Euler角, Euler angle)은 강체가 놓인 방향을 3차원 공간에 표시하기 위해 레온하르트 오일러가 도입한 세 개의 각도이다.즉, 3차원 회전군 SO(3)의 한 좌표계다. 3차원 공간에 놓인 강체의 방향은 오일러 각도를 사용하여 세 번의 회전을 통해 얻을 수 있다.

// A rotation 30 degrees around the y-axis
 
var rotation = Quaternion.Euler(Vector3(0, 30, 0));