오늘의 학습 키워드

낮과 밤 구현 해석, 1인칭 회전

 

공부한 내용

낮과 밤

다음과 같은 코드를 해석하려고 그림을 그려가면서 그리고 유니티에서 어떻게 동작하는가 보면서 이해해보았다.

Update에서 불리는 time이 더해지면서 1로 나누는 로직에 따라 라이팅의 회전이 변하는 코드이다.

time = (time + timeRate * Time.deltaTime) % 1.0f;
lightSource.transform.eulerAngles = (time - (lightSource == sun ? 0.25f : 0.75f)) * noon * 4.0f;

가장 중요한 부분해가 뜰 때를 이해하는 것이었다.

해가 뜰 때 기준으로 6시니 time은 0.25겠고 lightSource가 sun이니 0.25f - 0.25f == 0이니까 각도가 0으로 나오게 된다.

이것만 이해해도 다른 것들이 이해가 될 것이다.

여기서 이해가 가지 않는다면 낮 12시에 해의 각도가 90도(위에서 아래로 내리쬐는 각도)라는 것을 기억하면서 그림을 봐보자.

 

 

1인칭 카메라 회전

1인칭 카메라 회전을 구현할 때 x축과 y축의 순서 또는 짐벌락 현상 때문에 고생을 한 적이 있을 것이다.

여기 예제에서는 y축 회전을 transform.eulerAngles로 부모에서 처리하고 x축 회전을 localEulerAngles로 자식에서 처리하는 것으로 각 회전이 독립적으로 수행될 수 있도록 하였다.

void CameraLook()
{
    camCurXRot += mouseDelta.y * lookSensitivity;
    camCurXRot = Mathf.Clamp(camCurXRot, minXLook, maxXLook);
    cameraContainer.localEulerAngles = new Vector3(-camCurXRot, 0, 0);

    transform.eulerAngles += new Vector3(0, mouseDelta.x * lookSensitivity, 0);
}

부모와 자식의 x,y 회전 값을 반대로 수행한다면 안 되는 것을 볼 수 있었다.

찾아보니 이것은 유니티의 회전 순서 때문인 것으로 파악이 된다.

z -> x -> y 순으로 진행해야 제대로 회전이 될 수 있다.

그래서 여기서 알 수 있는 사실은 부모 자식간의 회전은 자식이 먼저 실행 된 뒤 부모가 실행된다.

void CameraLook()
{
    camCurXRot += mouseDelta.y * lookSensitivity;
    camCurXRot = Mathf.Clamp(camCurXRot, minXLook, maxXLook);
    cameraContainer.localEulerAngles = new Vector3(0, mouseDelta.x * lookSensitivity, 0);
    
    transform.eulerAngles += new Vector3(-camCurXRot, 0, 0);
}

 

 

오늘의 회고

 오늘은 낮과 밤 시스템과 1인칭 회전에 대해서 배웠다. 낮과 밤 시스템은 처음에 이해하기 어려웠으나 전자 보드에서 쓱쓱 그려보고 대충 개념을 잡은 뒤 나중에 정리하면서 피그마로 그려봤는데 이해가 된 것 같아 다행이다. 또한 1인칭 회전은 왜 저렇게 수행하는지 이유를 몰랐었는데 이번에 정확히 알게 되어서 기분이 좋다.

 내일은 좀 더 공부를 진행한 뒤 개인 과제를 수행할 계획이다. 시간이 많지는 않아서 최대한 빨리 진행하려고 생각하고 있다. 내일도 열심히 해보자. 파이팅!

 

 

참고 : 

https://docs.unity3d.com/kr/2021.3/Manual/QuaternionAndEulerRotationsInUnity.html#:~:text=Unity%EB%8A%94%20Z%EC%B6%95%2C%20X,%EC%A2%8C%ED%91%9C%EA%B3%84%EA%B0%80%20%EB%B3%80%EA%B2%BD%EB%90%98%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4.

 

Unity의 회전 및 방향 - Unity 매뉴얼

Unity에서는 오일러 각과 쿼터니언을 모두 사용하여 회전과 방향을 나타낼 수 있습니다. 표현은 둘 다 동일하지만 용도와 제한 사항은 서로 다릅니다.

docs.unity3d.com

 

+ Recent posts