ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 09장. 방향, 크기, 회전
    Unity/레트로의 유니티 게임 프로그래밍 에센스 2020. 11. 10. 16:00

    9.1 벡터 수학

        9.1.1 벡터의 정의

            - 위치와 운동 상태 중 하나를 가르킴.

        9.1.2 절대 위치와 상대 위치

        9.1.3 벡터의 크기

        9.1.4 벡터의 스칼라 곱

        9.1.5 방향벡터

        9.1.6 벡터의 덧셈

        9.1.7 벡터의 뺄셈

        9.1.8 벡터의 내적

        9.1.9 벡터의 외적

     

    9.2 유니티 C# 벡터

        9.2.1 Vector 타입

            - Vector2, Vector3, Vector4

        9.2.2 Vector3 연산

            - 스칼라 곱 : 벡터와 스칼라 값을 곱함

            - 벡터의 덧셈과 뺄셈

            - 정규화된 벡터(방향벡터로 만들기) : {vector_name}.normalized;

            - 벡터의 크기 : {vector_name}.magnitude;

            - 벡터의 내적 : VectorN.Dot({vector_name0}, {vector_name1});

            - 벡터의 외적 : VectorN.Cross({vector_name0}, {vector_name1});

        9.2.3 Vector3 활용

            - 두 지점 사이의 거리 = 차이 벡터의 크기

            - 현재 위치에서 목적지로 향하는 방향 : 차이 벡터를 정규화 한 것

     

    9.3 쿼터니언

        9.3.1 짐벌락 ( *참고: 책 '방향코사인행렬, 오일러각, 그리고 쿼터니언' (공)저: 박성수 )

            - 오일러각(3번에 나눠서 회전) 하면서 우선 회전하는 축이 후순으로 회전하는 축에 영향을 끼치면서 각기 다른 축이 겹치는 현상.

            - 일반적인 경우 물체는 3가지 종류의 축으로 회전할 수 있는 자유가 있음(회전 모습이 3가지). 짐벌락 상태가 되면. 물체는 2가지 종류의 축 방향으로만 회전 가능(회전 모습이 2가지). lock된 상태.

            - 오일러각으로 물체의 자세를 나타낼 때는 짐벌락 상태는 문제가 되지 않음. 반대로 물체의 자세로 오일러각을 나타낼 때, 짐벌락 상태가 되면 물체 자세의 오일럭 각 그래프가 불연속적으로 됨(특이점).

                => 만약 어떠한 자세로 있고, 이 자세를 90, 90, 90으로 나타낸다면, 가운데 축을 1만큼 회전시켰을 때, 90, 89, 90가 된다면, 반대로방향으로 1만큼 회전시키면 -90, 89, -90가됨. 불연속적. 애초에  90, 89, 90와 -90, 89, -90는 중간이 불연속적으로 될 수 밖에 없음.

            - 짐벌락 상태가되면 무수히 많은 오일러각으로 나타낼 수 있음.

        9.3.2 쿼터니언

            - x,y,z,w. 사원수

            - 오일러각과 달리 한 번에 회전하는 방식이므로, 짐벌락 현상이 없음.

            - 유니티에서 내부 계산은 쿼터니언이지만 인스펙터 창에서는 Vector3로 표시.

            - 직접적으로 쿼터니언 생성 불가. 다른 값에서 변환하여 사용.

                Quaternion.Euler({vector3_name});

                Quaternion rotation = Quaternion.Euler(new Vector3(0, 60, 0));

                Vector3 eulerRotation = rotation.eulerAngles;

            - 추가 회전. (30, 0, 0)에서 (0, 60, 0)만큼 더 추가 회전. => 근사적으로 (14.4, 63.4, 26.5)

                Quaternion a = Quaternion.Euler(30, 0, 0);

                Quaternion b = Quaternion.Euler(0, 60, 0);

                Quaternion rotation = a*b; // 행렬곱

                                                                

     

                                                                                                                                                                                                                                                                                                                       

    댓글

Designed by Tistory.