ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [TIL] 4주차 4일 Input System 그리고 게임수학 ( 오일러, 쿼터니언, 짐벌 락, 아크 탄젠트 )
    개발일지/스파르타 코딩클럽 부트캠프 2024. 5. 9. 21:35

    오늘 배운 내용

    • Input System
    • 캐릭터의 이동
    • Tilemap 그리기
    • 조준 시스템
    • 쿼터니언
    • 짐벌락 현상
    • 아크탄젠트
    • 마우스를 따라서 회전하는 무기 만들기

    배운 걸 정리해보자


    InputManager의 문제점

     

    일단 new Input System을 알기 전에 InputManager의 문제에 대해 조금 짚고가자.

     

    1. 여러 장비의 대응이 안된다.

      현재 InputManager에서는 다양한 플랫폼에 대응하거나 , 키를 변경하는 리바인딩하는 부분이 부족하다.

     

    2. 입력처리와 실제로직 실행 주체를 분리

      이건 InputManager 자체의 문제는 아니지만, 해당 버전에서 구현했던 내용이

    한 클래스에 모여있어서 클래스에 대한 확장성과 유지보수성이 많이 떨어진다.

     

    그럼 InputSystem의 핵심 개념을 알아보자

     

    1. Input Action : 입력 행동 자체를 정의한다. 예를 들어서 '점프','공격' 등을 정의하고

                              그 행동을 트리거하는 키와 버튼 등을 지정할 수 있다.

    2. Input Action Asset : 여러 개의 입력 행동을 그룹화 하는 방법.

                                       재사용 가능한 입력 설정을 만들어서 게임 내 다른 캐릭터나 메뉴에 적용가능하다.

    3. Player Inpue Component : Unity의 New Input System에 추가된 새로운 컴포넌트이다.

                                                  자동으로 입력 행동을 처리하고 해당 게임 오브젝트에 메시지를 보낸다.

     

    먼저 InputSystem을 사용하려면

    Window -> Package Manager -> Unity Register -> Input System -> Install

    을 눌러서 패키지를 추가해줘야한다. 재부팅되고 Install 대신 Remove가 뜨면 완료

     

    Input Action을 만들고나면 각 Action의 Action Type과 Control Type을 정할 수 있다.

    Action Type : 입력을 어떻게 받을 것인지

    Controle Type은 입력 데이터가 어떤 식으로 들어올지를 정하는데

    주로

    Axis(float), Button(일반적으론 버튼을 누름에 따라 1,0, 하지만 특이 케이스 있음), Vector2(조이스틱 같은 것에 활용)

    이렇게 사용한다.

     

     

    쿼터니언

     

    유니티 인스펙터 창에서 나오는 회전은 Vector3로 표현된다 우리가 잘 알듯이 x, y, z 를 말한다.

    그리고 이는 다른 말로 오일러각(Euler Angle) 이라고한다. 하지만 유니티를 포함한 많은 3D소프트웨어는

    내부적으로 쿼터니언을 사용한다. 이유는

    쿼터니언을 사용할 시에 짐벌 락(Gimbal Lock) 문제를 피할 수 있다.

    극단적인 각도로 회전할 경우 한 축으로의 회전을 잃어버리는걸 짐벌락이라고 하는데

    출처 : 위키피디아

    이렇게 x, y, z 의 고리가 보인다고 치자

    그러면 계속 돌거나 한쪽만 돌리더라도 고리끼리 겹치는 현상이 나타난다

    이를 짐벌락 현상이라고 하는데 이는 컴퓨터에서도 회전에대한 계산을 못하기 때문에

    한 축의 회전을 아예 잃어버리게 된다.

    하지만 쿼터니언을 쓰면 이를 피할 수 있게된다.

     

    쿼터니언은 수학적으로는 4차원 복소수를 이용한 회전 표현 방법이다.

    x, y, z, w형태로 표현하는데 우리가 직접 계산하거나 조절하는 방식은 아니다.

    직접 값을 변경하는 대신 Unity 내장함수를 통해서 사용한다.

    (예: Quaternion.Euler, Quaternion.LookRotation, Quaternion.Slerp 등).

     

    Quaternion.Euler는 오일러각을 쿼터니언으로 변경해준다.

    Quaternion.LookRotation는 앞과 위를 특정한 방향으로 하는 회전 쿼터니언을 만든다(뭔소린지 모르겠다.)

    Quaternion.Slerp는 쿼터니언과 다른 쿼터니언 사이의 내분점을 알 수 있다.

     

    아크탄젠트(ArcTangent)

     

    일단 이것도 알기전에 삼각함수의 기초적인 것들을 알고가야한다.

     

    삼각함수는 각도를 통해서 각 변의 비율을 알아낼 수 있는 함수인데

    sin = 높이/빗변 , cos = 밑변/빗변, tan = 높이/밑변 이다.

     

    자 여기서 탄젠트에 주목해보자.

    탄젠트는 그림에서도 보이듯이 밑변과 높이의 각도로 비율을 구하는 함수인데

    그렇다면 아크탄젠트는??

     

    그의 반대인 역삼각함수로 각도 -> 비율이 비율 -> 각도가 되는것이다.

    즉 말 그대로 아크탄젠트는 삼각함수인 탄젠트의 역함수이며, 가로와 세로의 비에 따른 각도를 계산할 때 사용한다.

     

    2D에서 점 또는 벡터에 대한 각도를 찾는 데 아크탄젠트 함수가 종종 사용되는데

    여기에 x, y 자체가 양수인지 음수인지를 통해 360도를 다 구분할 수 있게까지 사용법을 추가했다. ( 미친..)

     

    원래는 x,y가 같은 부호지만 둘다 양수, 둘다 음수거나 x,y가 다른 부호지만 x가 음수거나 y가 음수인 상황 때문에

    아크탄젠트는 180도 각도범위에서만 알아낼 수 있었다.

    이 구현을 개발자들은 Atan2라고 이름 붙이고, 밑변/높이였던 탄젠트의 기본 개념을 적용해서 y, x 순으로 인수를 넣는다.

     

    이를 통해서 점 (x, y)에서 Math.Atan2(y,x) 함수를 사용하면 벡터가 x축과 이루는 각도를 [-\pi , \pi]

    까지의 값으로 얻을 수 있는데, 각도를 \pi가 180도가 되도록 표현하는 단위를 라디안 이라고 한다.​

     

    그러면 여기서 어? pi는 3.14인데 180도를 어떻게 구하는건데? 할 수 있는데 그것 또한 함수로 해결한다.

    Mathf.Rad2Deg; 를 곱하게 되면 약 57.29를 곱해서 라디안으로 표현하게된다. 라디안투디글랜

    float rotZ = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;

    를 하게되면 rotZ의 아크탄젠트가 구해지는 셈.

     

    나도 강의를 여러번 돌려보며.. 뇌를 괴롭혔다.. 힘들다

    게임수학 더 공부해야겠다

     

Designed by Tistory.