1. 벡터의 기초


a. 스칼라와 벡터

  1. 스칼라:

    • 고정된 값으로 크기만 존재합니다. (예: 속력, 온도, 거리 등)
    • 단일 숫자로 표현되며 방향은 고려하지 않습니다.
  2. 벡터:

    • 크기와 방향을 가집니다.

    • 표현: 화살표로 표시하며, 시작점 없이 방향과 크기만으로 나타냅니다.

    • 예시: 중력, 바람의 세기와 방향 등.

    • 벡터는 목적지 - 시작점의 계산 결과입니다:

      • 예를 들어, 점 ( B )에서 점 ( A )로 향하는 벡터는 ( vAB\vec{v_{AB}} = B - A )로 계산됩니다.

b. 벡터의 특징

  1. 벡터 곱셈:

    • 스칼라(고정값 ( k ))와 벡터를 곱하면 벡터의 크기만 변화:
      • ( v\vec{v} = (x, y) ), ( kvk\vec{v} = (kx, ky) )
      • ( k > 1 ): 벡터의 크기 증가.
      • ( 0 < k < 1 ): 벡터의 크기 감소.
      • ( k < 0 ): 반대 방향으로 크기 변화.
  2. 벡터 덧셈과 뺄셈:

    • 덧셈: 한 벡터의 끝점에서 다른 벡터가 시작.
    • 뺄셈: 반대 방향으로 덧셈:
      • ( v1+v2=(x1+x2,y1+y2)\vec{v_1} + \vec{v_2} = \vec{(x_1 + x_2, y_1 + y_2)} )
      • ( v1v2=(x1x2,y1y2)\vec{v_1} - \vec{v_2} = \vec{(x_1 - x_2, y_1 - y_2)} )

c. 벡터의 법칙

  1. 교환 법칙:

    • ( v1+v2=v2+v1\vec{v_1} + \vec{v_2} = \vec{v_2} + \vec{v_1} ).
  2. 결합 법칙:

    • ( (v1+v2)+v3=v1+(v2+v3)(\vec{v_1} + \vec{v_2}) + \vec{v_3} = \vec{v_1} + (\vec{v_2} + \vec{v_3}) ).

d. 벡터의 크기 구하기

  1. 벡터의 크기(길이)는 피타고라스 정리를 사용:

    • ( v=x2+y2|\vec{v}| = \sqrt{x^2 + y^2} ).
  2. 정규화 (Normalization):

    • 벡터를 단위 벡터로 변환 (크기 ( 1 )):
      • ( n=(xv,yv)\vec{n} = \left(\frac{x}{|\vec{v}|}, \frac{y}{|\vec{v}|}\right) ).
    • 용도:
      • 방향을 유지하면서 길이를 조정.

e. 벡터의 용도 (게임 개발에서):

  1. 위치 벡터: 위치를 나타냄 (예: ( vA=(1,1)\vec{v_A} = (1, 1) )).
  2. 방향 벡터: 특정 방향과 크기를 표현.

2. 게임에 벡터 활용

a. 미사일 유도탄

  1. 기본적으로 미사일은 삼각함수를 사용하여 발사되지만, 유도 미사일에서는 타겟을 추적하기 위해 벡터를 사용.
  2. 벡터는 타겟과 미사일의 방향 및 거리를 계산하여 이동.

b. 벡터 연산을 통한 충돌 처리

  1. 충돌 계산 시 벡터 간 거리 계산:
    • 벡터 방식: ( v1v2=(x1x2)2+(y1y2)2|\vec{v_1} - \vec{v_2}| = \sqrt{(x_1 - x_2)^2 + (y_1 - y_2)^2} ).

코드 분석


1. 벡터 구조체 정의

struct Vector {
    Vector() {}
    Vector(float x, float y) : x(x), y(y) {}

    Vector operator+(const Vector& other) {
        Vector ret;
        ret.x = x + other.x;
        ret.y = y + other.y;
        return ret;
    }

    Vector operator-(const Vector& other) {
        Vector ret;
        ret.x = x - other.x;
        ret.y = y - other.y;
        return ret;
    }

    Vector operator*(float value) {
        Vector ret;
        ret.x = x * value;
        ret.y = y * value;
        return ret;
    }

    void operator+=(const Vector& other) {
        x += other.x;
        y += other.y;
    }

    float Length() {
        return ::sqrt(x * x + y * y);
    }

    void Normalize() {
        float length = Length();
        if (length < 0.00000001f)
            return;
        x /= length;
        y /= length;
    }

    float x = 0;
    float y = 0;
};

기능별 설명:
1. 생성자:

  • Vector(float x, float y)를 통해 초기화.
  • 기본값은 ( (0, 0) ).
  1. 연산자 오버로딩:

    • 덧셈, 뺄셈, 스칼라 곱셈, 대입 연산 지원.
  2. 벡터 길이 계산:

    • Length: ( x2+y2\sqrt{x^2 + y^2} )을 계산.
  3. 정규화:

    • Normalize: 벡터를 단위 벡터로 변환.

2. 미사일 클래스

void Missile::Update() {
    float deltaTime = GET_SINGLE(TimeManager)->GetDeltaTime();

    if (_target == nullptr) {
        _pos.x += _stat.speed * deltaTime * ::cos(_angle);
        _pos.y -= _stat.speed * deltaTime * ::sin(_angle);
        _sumTime += deltaTime;

        if (_sumTime >= 0.2f) {
            const vector<Object*>& objects = GET_SINGLE(ObjectManager)->GetObjects();
            for (Object* object : objects) {
                if (object->GetObjectType() == ObjectType::Monster) {
                    _target = object;
                    break;
                }
            }
        }
    } else {
        Vector dir = _target->GetPos() - GetPos();
        dir.Normalize();
        _pos += dir * deltaTime * _stat.speed;
    }

    const vector<Object*>& objects = GET_SINGLE(ObjectManager)->GetObjects();
    for (Object* object : objects) {
        if (object == this || object->GetObjectType() != ObjectType::Monster)
            continue;

        Pos dir = object->GetPos() - GetPos();
        if (dir.Length() < 25) {
            GET_SINGLE(ObjectManager)->Remove(object);
            GET_SINGLE(ObjectManager)->Remove(this);
            return;
        }
    }
}

상세 분석:
1. 초기 이동:

  • 삼각함수를 사용하여 초기 방향으로 이동.
  1. 유도 미사일 활성화:

    • _sumTime이 ( 0.2 )초 이상이면 타겟 검색.
  2. 추적:

    • Vector dir = _target->GetPos() - GetPos();:
      • 타겟과의 방향 벡터 계산.
    • dir.Normalize();:
      • 방향만 유지한 채 정규화.
    • _pos += dir * deltaTime * _stat.speed;:
      • 정규화된 방향으로 속도에 따라 이동.
  3. 충돌 처리:

    • 타겟과의 거리가 ( 25 ) 미만일 때 충돌로 처리하고 객체 제거.

profile
李家네_공부방

0개의 댓글