스파르타 게임개발종합반(Unity)/TIL - 본캠프 매일 공부 기록

2024.05.17 TIL - localRotation, rotation 차이, Quaternion.Slerp, Mathf.Atan2, Mathf.Rad2Deg

테크러너 2024. 5. 18.

 

 

    private void Rotate(float inputX)
    {
        Quaternion from = transform.localRotation; 
        float angle = Mathf.Atan2(0, inputX) * Mathf.Rad2Deg;
        Quaternion to = Quaternion.Euler(0, 0, angle - 90); 
        transform.localRotation = Quaternion.Slerp(from, to, ROTATIONSPEED); 
    }

위의 코드는 영상처럼 회전을할 때 부드럽게 회전할 수 있도록 `Quaternion.Slerp`를 활용한 것이다.

하나씩 살펴보겠다.

 

Quaternion from = transform.localRotation;

`transform.rotation`은 월드 좌표계라서 로컬 좌표계인 `transform.localRotation`을 사용했다.

이유는 로켓의 방향대로 앞으로 나아가야하기 때문이다.
`from`은 시작 회전을 담는다.

 

float angle = Mathf.Atan2(0, inputX) * Mathf.Rad2Deg;

`Atan2`는 라디안값이므로 `Mathf.Rad2Deg`로 디그리 변환(pi -> 180)
`inputX`는 -1,1값을 가지므로 180,0도의 값을 가진다.

입력된 x의 방향대로 회전 각도를 계산하는 것이다.

 

Quaternion to = Quaternion.Euler(0, 0, angle - 90);

기본은 90도 방향을 보고 있어서 90을 빼줘야한다.
`to`는 목표 회전을 담는다.

 

transform.localRotation = Quaternion.Slerp(from, to, ROTATIONSPEED);

`Slerp` : 부드럽게 회전(회전 경로를 곡선으로 처리하여 일정한 속도로 회전하게 만든다)

세 번째 파라미터값은 보간 파라미터 0~1사이의 값을 가짐
값이 0이면 결과는 from
값이 1이면 결과는 to
값이 0~1사이면 두 쿼터니언 사이를 부드럽게 보간
0 < ROTATIONSPEED < 1 -> 부드럽게 보간

반응형

댓글