본문 바로가기
UNITY/Basic

Vector3의 magnitude와 normalized

by neohtux 2020. 6. 30.
728x90

방향 벡터의 정보에는 1. 거리(크기) 라는 정보와 2.실제 방향 의 정보가 있다

 

1. 거리 (크기)  magnitude

 

Description

벡터의 길이를 반환합니다. (읽기전용)

벡터의 길이는 (x*x+y*y+z*z)의 제곱근입니다.

일부 벡터의 길이만 비교하는 경우에, sqrMagnitude를 사용해서 길이의 제곱값을 비교할 수 있습니다.

(길이의 제곱값을 사용하는 경우가 더 빠릅니다.)

 

 

 

Unity에서 제공하는 Doc를 살펴보면 설명이 되어있다. 벡터의 길이를 반환 한다는 것은

거리(크기)를 의미한다. 즉 예를들어 케릭터의 Position 값 (X, Y, Z)의 거리를 얻어올 수 있다. 

 

두 케릭터가 각각 (10,0,0) (5,0,0) 의 위치해 있다면 두 케릭터간의 거리는 x좌표로 5만큼 차이가 난다. 

 

Unity Doc에 나와있듯 3차원에서의 피타고라스 정의에 의해 벡터 길이를 구할 수 있다. 

 

void Start() 유니티 스크립트 코드를 보면 
Myvector 의 to와 from의 객체가 위의 예에서 두 케릭터가 (10,0,0) , (5,0,0)의 위치에서

거리 차를 구한것이다.

struct MyVector
{
    public float x;
    public float y;
    public float z;

    //
    //       + 
    //   +---+
    //+------+
    public float magnitude { get { return Mathf.Sqrt(x*x + y*y +z*z); } } //방향 벡터의 크기

    public MyVector normalized {  get { return new MyVector(x / magnitude, y / magnitude, z / magnitude); } }

    public MyVector(float x, float y, float z)
    {
        this.x = x;
        this.y = y;
        this.z = z;
    }
    public static MyVector operator +(MyVector a, MyVector b)
    {
        return new MyVector(a.x + b.x, a.y + b.y, a.z + b.z);
    }
    public static MyVector operator -(MyVector a, MyVector b)
    {
        return new MyVector(a.x - b.x, a.y - b.y, a.z - b.z);
    }
    public static MyVector operator *(MyVector a, float d)
    {
        return new MyVector(a.x * d, a.y * d, a.z * d);
    }
}
void Start()
    {
        MyVector to = new MyVector(10.0f, 0.0f, 0.0f);
        MyVector from = new MyVector(5.0f, 0.0f, 0.0f);
        MyVector dir = to-from; //{-5.0f,0.0f,0.0f}

        dir = dir.normalized; //{1.0f,0.0f,0.0f}; 단위벡터 얻어오기

        MyVector newPos = from + dir * _speed;

        //방향 벡터
        //1. 거리 (크기)    5 //manitude
        //2. 실제 방향      -> //단위벡터 nomalized
    }

 

2. 방향에 대한 정보 (nomalized)

Description

해당 벡터의 magnitude 가 1인 벡터를 반환합니다.(읽기전용)

벡터가 정규화(normalized)되면, 벡터는 갖은 방향값을 갖지만, 정규화 벡터의 길이는 1.0입니다.

현재 벡터가 변화하지 않고 새로운 정규화 벡터가 반환된다는 점을 주의하십시오. 현재 벡터를 정규화 하고 싶은 경우에 Normalize 함수를 사용합니다.

해당 벡터가 정규화되기에 너무 작은 경우에 0 벡터가 반환됩니다.

관련 항목: Normalize 함수.

 

 

nomalized에 대한 스크립트에서 보듯 해당 벡터의 manitude가 1인 벡터를 반환 하는것이다

즉, 크기가 1인 벡터인 단위 벡터를 받아올 수 있다는 뜻인데.

 

단위 벡터는 결국 방향을 의미한다, 예를 들어 (1,0,0) 은 xyz 순으로 x축이 단위가 되는 벡터인데

이 정보를 가지고 

 

Vector3.Forward , Back, Left, Right 와 같이 방향을 결정하여

 

해당 값에 속도 연산을 한다던지 Deltatime과 같이 사용자의 프레임 률을 곱하여 적용 시킬때 사용 된다.

 

예)입력키 s 를 눌렀을때 Vector3.Back (Z축으로 -1) 방향을 갖는다.

(Z축을 기준으로 3차원에서 앞 뒤라는  로컬 영역을 설정했을때)

 

이후 Time.deltaTime을 이용하여 프레임 보정을 해주고 , 실수형의_speed 를 곱하여
플레이어(케릭터 유저)가 뒤로 가는 속도를 연산할수 있다.

if (Input.GetKey(KeyCode.S))
            transform.position += transform.TransformDirection(Vector3.back * Time.deltaTime * _speed);
   public static MyVector operator *(MyVector a, float d)
    {
        return new MyVector(a.x * d, a.y * d, a.z * d);
    }

 

실제 Vector3의 지원 오퍼레이터 보면 위와 같이 활용하여 벡터타입과 실수형 float 자료형과 연산할 수 있다.

 

300x250

'UNITY > Basic' 카테고리의 다른 글

Time.deltaTime  (0) 2020.07.01
Jump  (0) 2016.12.28
Throw  (0) 2016.12.28
identity(회전 일치)  (0) 2016.12.27
Rotate  (0) 2016.12.27

댓글