벡터

·2023년 4월 8일
0

Unity

목록 보기
6/22

📌벡터


사용하는 방법에 따라서 2가지로 벡터가 나뉨

  1. 위치벡터
  2. 방향벡터

벡터구현

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

    public MyVector(float x, float y, float z) { this.x = x; this.y = y; this.z = z; }
}

x,y,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);
    }

기존의 Vector3에 있던 내용을 가져와서 사용

방향벡터

어떤 방향값을 나타내기도 하고 방향의 크기도 나타낸다
두 지점사이의 뺄셈을 이용해서 방향벡터를 추출가능

방향 = 상대방의 위치좌표 - 나의 위치좌표

1)거리(크기) magnitude
2)실제방향 normalized

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) 방향벡터

//방향 벡터
// 1. 거리(크기) 5
// 2. 실제방향 ->

from(5,0,0)                          to(10,0,0)

magnitude

  • 두 벡터 사이의 거리(크기)를 나타낼 때 사용한다.
//         +
//    +    +
// +-------+    밑변^2 + 높이^2 = 대각선^2
//두점사이의 거리
 public float magnitude { get { return Mathf.Sqrt(x * x + y * y + z * z); } }

여기서 x2-x1가 아닌이유는 방향벡터 자체가 x(x2-x1)으로 표현되기 때문이다

normalized

  • 크기가 1짜리인 벡터를 만든다(단위벡터)
public MyVector normalized { get { return new MyVector(x / magnitude, y / magnitude, z / magnitude); } }

방향에 대한 정보만 나타낸다.


전체코드


  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);
    }
}
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. 실제방향 -> normalized
    }
	//Update부분
}

참고자료


Part3: 유니티 엔진
섹션 2.Transform(트랜스폼)

profile
개인공부저장용(하루의 기록)

0개의 댓글