게임엔진/윈도우API

윈도우API)8. 벡터

PJNull 2022. 12. 18.
728x90
반응형

벡터

 

벡터또한 예전에 포스팅한것을 참고하면 도움이 될것이다. 이번 포스팅에서도 프로젝트에서 벡터를 어떻게 이용하는지를 중점적으로 다룰 예정이다.

 

게임수학) Chapter2. 벡터

스칼라 (Scalar) ㆍ흔히 생각할 수 있는 수치. ㆍ거리의 값이 있을 때 이 값은 방향정보는 가지고 있지 않고 오로지 수치만을 나타내는것이 스칼라 값. 벡터(Vector) ㆍ벡터를 사용하면 정적인 위치

pjnull.tistory.com

 

벡터 추가하기

 

//Types.h

 struct Vector
{
public:

	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 other)
	{
		Vector ret;
		ret.x = x * other;
		ret.y = y * other;
		return ret;
	}

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

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

	void operator*=(float value)
	{
		x *= value;
		y *= value;
	}

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

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

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

using Pos=Vector;//Pos는 이제 Vector로 대체한다.


/*
Struct Pos
{
 float x;
 float y;
}
*/

 

 

벡터 실습하기(유도탄)

 

유도탄은 타겟을 정하고 타겟의 위치벡터를 얻어서 방향벡터를 구해서 발사체가 그 벡터로 이동하도록 구현한다.

 

//Projectile.h

class Projectile :public Object
{

	protected:
	float _angle = 0.f;
	Object* _target = nullptr;
	float _sumTime = 0.f;
}

 

//Projectile.cpp

void Projectile::Update()
{

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

		{
			const vector<Object*>& objects = GET_SINGLE(ObjectManager)->GetObject();
			for(Object* obj:objects)
			{
				if (obj->GetObjectType() == ObjectType::Monster)
				{
					_target = obj;
					break;
				}
			}
		}
	}
	else
	{
		Vector dir=_target->Getpos() - Getpos();
		dir.Normalize();
		Vector movedir = dir * _stat.speed*deltaTime;
		_pos += movedir;
	}
}

 

위 코드를 실행하게 되면 다음과 같은 결과가 나오게 된다.

 

 

※위치벡터만에서 뺄셈을 하는 이유

위의 코드에서 타켓의 벡터와 자신의 벡터를 빼고 정규화함으로써 단위벡터를 구했다. 이것은 어떠한 이유가 있는 것일까?

현재 A점을 target의 위치벡터라고 하고 B를 Projectile의 벡터라고 가정한다면 우리가 알고 싶은것은 A와B의 벡터이다.

하지만 우리가 알고 있는것은 위치 벡터뿐이고 위치 벡터를 이용해서 A와B의 방향벡터를 알아 내야된다.

 

 

현재 우리가 알고 있는 벡터의 두가지는

(2,6)
(4,5)

두가지이다. 여기서 벡터의 합에 의해서

의 식이 성립되는데,

라는 결론이 나오게된다.

 

문제점

위코드의 유도탄은 정상적으로 작동하는 것 처럼 보이지만 큰 문제점이 하나 존재한다.

보는것과 같이 발사체를 하나이상 발사했을때, 그리고 그 발사체들이 같은 타겟을 공유할때 문제가 발생하게된다.

이러한 문제가 발생하게되는 원인은 발사체와 타겟이 충돌했을 경우 타겟을 Delete하는데에 있다. 이 상황의 최악의 문제점은 만약 타겟이 들고 있던 주소를 다른 오브젝트가 할당 받게되면 심각한 버그를 유발한다는 점이다. 그렇기에 타겟을 이용하여 로직을 설계할때는 항상 이부분을 주의해서 설계하는 것이 좋다.

728x90
반응형

'게임엔진 > 윈도우API' 카테고리의 다른 글

윈도우API)10. 벡터의 외적  (0) 2022.12.22
윈도우API)9. 벡터의 내적  (0) 2022.12.22
윈도우API)7. 삼각함수  (0) 2022.12.18
윈도우API)5. 오브젝트 설계  (0) 2022.12.17
윈도우API)3. Scene과 SceneManager  (0) 2022.12.16

댓글