[Unity]행렬과 Transform 이동 함수

728x90

유니티 행렬과 이동의 관계

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


//게임에서 행렬을 사용하는 경우는 DirectX, OpenGL, 유니티에서는 shader 심화과정에 주로 사용
public class Matrix : MonoBehaviour
{
    private Matrix4x4 worldMat;
    void Start()
    {
        MakeWorldMatrix();
        ExtractionMatrix();
    }

    void MakeWorldMatrix()
    {
        Quaternion rot = Quaternion.Euler(45, 0, 45);
        //회전행렬 이용(오일러 각 : 직관적으로 각도를 이용한 것)
        //오일러 공식을 사용하면 짐벌락이라는 현상이 일어남, 각 회전에 대해서 서로가 종속적이어서 생기는 문제
        //Quaternion(사원수) >> 짐벌락 문제 해결
        //trasform.rotation = new Vector3(45,45,45) //에러 발생 >> 오일러 각으로 대입했기 때문
        //유니티는 내부적으로 쿼터니언 사용, 오일러각을 쿼터니언으로 변환해서 사용
        //회전에 관한 것은 전부 쿼터니언을 걸쳐서 연산을 해야함

        Vector3 tran = new Vector3(2, 1, 0);
        Vector3 scal = new Vector3(3, 3, 3);
        worldMat = Matrix4x4.TRS(tran, rot, scal);
        //worldMat = Matrix4x4.Translate(new Vector3(2, 1, 0)) * Matrix4x4.Rotate(rot) * Matrix4x4.Scale(new Vector3(3,3,3));
        //이동행렬, 회전행렬, 크기변환행렬

        Debug.Log("==== Make Matrix ====");
        for (int i = 0; i < 4; i++)
        {
            Debug.Log(worldMat.GetRow(i));
        }
    }
    private void ExtractionMatrix()
    {
        Matrix4x4 matrix = transform.localToWorldMatrix;
        //localToWorldMatrix를 저장, TRS == localToWorldMatrix 
        Debug.Log("=== Extraction Matrix ===");
        for (int i = 0; i < 4; i++)
        {
            Debug.Log(matrix.GetRow(i));
        }
        
        //=============================
        //변환행렬을 가지고 postion, rotation, scale 값을 추출하고 싶을 때
        Vector3 position = matrix.GetColumn(3);
        Debug.Log("=== Position ===");
        Debug.Log(position);

        Quaternion rotation = Quaternion.LookRotation(
            matrix.GetColumn(2),
            matrix.GetColumn(1)
        );

        Debug.Log("=== Rotation ===");
        Debug.Log(rotation.eulerAngles);

        Debug.Log("=== Scale ===");
        Vector3 scale = new Vector3(
            matrix.GetColumn(0).magnitude,
            matrix.GetColumn(1).magnitude,
            matrix.GetColumn(2).magnitude
        );
        Debug.Log(scale);
    }
}

728x90