Unity 공부 (5)

도토코·2025년 2월 17일

Unity공부

목록 보기
5/22

Vector


1. 벡터 크기(Magnitude)란?

Description
Returns the length of this vector (Read Only).

벡터의 길이를 반환한다(읽기 전용)

The length of the vector is square root of (xx+yy+z*z).

벡터의 길이는 피타고라스의 정리와 같은 x*x + y*y의 제곱근이다.

If you only need to compare magnitudes of some vectors, you can compare squared magnitudes of them using sqrMagnitude (computing squared magnitudes is faster).

벡터들의 크기만 비교해야 한다면, sqrMagnitude를 사용하여 크기의 제곱을 비교할 수 있습니다. 크기의 제곱을 계산하는 것이 더 빠릅니다.

벡터의 길이를 반환한다는 것은 거리(크기)를 의미하여 케릭터의 position값을 가져올 수 있다는 것이다.

벡터의 크기(길이)는 벡터의 시작점에서 끝점까지의 거리와 같다. 쉽게 말해, 점 A에서 점 B까지의 거리를 의미한다.

✅ 벡터 크기 공식

  • 2D 벡터(Vector2)

Magnitude=x2+y2\text{Magnitude} = \sqrt{x^2 + y^2}

  • 3D 벡터(Vector3)

Magnitude=x2+y2+z2\text{Magnitude} = \sqrt{x^2 + y^2 + z^2}

📌 코드 예제: 벡터 크기 구하기

Vector3 v = new Vector3(3, 4, 0);
Debug.Log(v.magnitude); // 출력: 5

위 코드에서 벡터 (3,4,0)의 크기를 구하면,

32+42=9+16=5\sqrt{3^2 + 4^2} = \sqrt{9 + 16} = 5

즉, 벡터의 크기는 두 점 사이의 거리와 동일하다.


2. 벡터 정규화(Normalization)란?

Description
Makes this vector have a magnitude of 1.

이 벡터의 크기를 1로 만듭니다.

When normalized, a vector keeps the same direction but its length is 1.0.

정규화되면, 벡터는 같은 방향을 유지하지만 크기는 1.0이 됩니다.

Note that this function will change the current vector. If you want to keep the current vector unchanged, use normalized variable.

이 함수는 현재 벡터를 변경합니다. 현재 벡터를 변경하지 않으려면 normalized 변수를 사용하세요.

If this vector is too small to be normalized it will be set to zero.

이 벡터가 너무 작아서 정규화할 수 없으면 0으로 설정됩니다.

벡터를 정규화한다는 것은 벡터의 크기를 1로 만드는 과정을 의미한다. 즉, 주어진 벡터의 방향은 그대로 유지하면서 크기만 1로 만들어 단위 벡터(Unit Vector)를 얻는 것이다. 이 작업은 벡터의 방향을 유지하면서 벡터의 크기를 1로 만드는 데 유용하다.

✅ 정규화 공식

  • 2D 벡터(Vector2)에서 벡터의 정규화는 다음과 같다:

Normalized=VectorMagnitude\text{Normalized} = \frac{\text{Vector}}{\text{Magnitude}}

  • 3D 벡터(Vector3)에서도 동일하게 적용된다:

Normalized=VectorMagnitude\text{Normalized} = \frac{\text{Vector}}{\text{Magnitude}}

📌 정규화된 벡터 계산 예제

예를 들어, 벡터 (3, 4, 0)의 크기는 5입니다. 이를 정규화하면 크기가 1인 단위 벡터 (0.6, 0.8, 0)가 된다.

Normalized=(35,45,05)=(0.6,0.8,0)\text{Normalized} = \left(\frac{3}{5}, \frac{4}{5}, \frac{0}{5}\right) = (0.6, 0.8, 0)

📌 코드 예제: 벡터 정규화

Vector3 v = new Vector3(3, 4, 0);
Vector3 normalizedV = v.normalized;
Debug.Log(normalizedV); // 출력: (0.6, 0.8, 0)

위 코드에서 벡터 (3, 4, 0)는 크기가 5이고, 이를 정규화하면 (0.6, 0.8, 0)으로 변환됩니다. 이 벡터는 동일한 방향을 유지하면서 크기가 1인 단위 벡터가 된다.


// 1. 위치 벡터
// 2. 방향 벡터
struct MyVector
{
    public float x;
    public float y;
    public float z;

    public float magnitude {get { return math.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);
    }

}

public class PlayerController : MonoBehaviour
{
    [SerializeField]
    float _speed = 10.0f;
    
    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 magnitude
            // 2. 실제 방향   ->
    }

이 코드에서 to와 from 객체는 각각 (10, 0, 0)과 (5, 0, 0)의 위치를 나타내고 있다.

  • dir = to - from; 이 부분에서는 to와 from 간의 차이를 구하고 있다. 즉, (10, 0, 0)에서 (5, 0, 0)을 빼면 dir 벡터는 (5, 0, 0)이 된다. 이것은 from에서 to까지의 방향 벡터이다.

  • 그 후 dir = dir.normalized;는 이 방향 벡터를 단위 벡터로 바꿔준다. 즉, (5, 0, 0) 벡터의 크기(5)를 1로 정규화하여 (1, 0, 0)으로 만든다.

따라서, dir 벡터는 (1, 0, 0)로 정규화된 방향 벡터이고, 이 벡터는 from 위치에서 to 위치로 향하는 방향을 나타낸다.

profile
코(딩)(꿈)나무

0개의 댓글