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
'게임 프로그래밍 > 유니티 프로젝트' 카테고리의 다른 글
[Unity]등속도/등가속도 운동을 활용한 게임 구현하기 (0) | 2021.12.30 |
---|---|
[Unity]힘과 가속도의 관계와 AddForce를 활용한 게임 구현하기 (0) | 2021.12.29 |
[Unity]벡터의 외적을 활용한 게임요소 구현하기 (0) | 2021.12.29 |
[Unity]벡터의 내적을 활용한 게임요소 구현하기 (0) | 2021.12.29 |
[Unity]벡터를 이용한 플레이어 이동 구현하기 (0) | 2021.12.28 |