1. 외적
a와 b의 외적의 방향은 오른손 법칙을 이용(a에서 b로 감아줬을 때 엄지손가락이 가리키는 방향)하여 알아낼 수 있다.
2. 게임에서 외적의 응용
(1) 시계 방향과 반시계 방향 이동 구하기
두 벡터가 원 또는 타원을 회전할 때 어떤 방향으로 이동하고 있는지 알 수 있다.
(2) 벡터가 다른 두 벡터 사이의 범위 내에 있는지 구하기
위의 그림과 같이 OP 선분이 OA, OB 선분 사이에 있으면, OA와 OP의 외적과 OP와 OB의 외적의 부호가 같다.
즉, 외적의 부호가 서로 같으면 => (+, +) 또는 (-, -) 이면 => 해당 영역(부채꼴 BOA) 안에 있다고 판단할 수 있다.
3. 몬스터가 영역 내에 위치하는지 판별하기
(1) 외적 구현하기
Types.h에서 수정한다.
float Crss(Vector other)
{
return x * other.y - y * other.x;
}
(2) 벡터 그리기
Monster.h에서 수정한다.
private:
Vector _pt1 = { 400, 150 };
Vector _pt2 = { 600, 450 };
Vector _pt3 = { 200, 450 };
};
이어서 Monster.cpp에서 삼각형을 그려준다.
void Monster::Render(HDC hdc)
{
Utils::DrawCircle(hdc, _pos, 50);
HPEN pen = ::CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
HPEN oldpen = (HPEN)::SelectObject(hdc, pen);
{
Utils::DrawLine(hdc, _pt1, _pt2);
Utils::DrawLine(hdc, _pt2, _pt3);
Utils::DrawLine(hdc, _pt3, _pt1);
}
::SelectObject(hdc, oldpen);
::DeleteObject(pen);
그리고 삼각형의 위쪽 꼭지점에서 마우스까지 이어지는 선분을 그린다.
// 마우스에서 꼭지점까지의 선분
Utils::DrawLine(hdc, _pt1, mousePos);
이제 꼭지점에서 마우스로 이어지는 벡터와, 왼쪽 오른쪽 벡터를 만들어 단위벡터로 만들어준다.
// 왼쪽
Vector v12 = _pt2 - _pt1;
// 마우스
Vector v1m = mousePos - _pt1;
// 오른쪽
Vector v13 = _pt3 - _pt1;
v12.Normalize();
v1m.Normalize();
v13.Normalize();
(3) 외적하고 판별하기
float c1 = v12.Cross(v1m);
float c2 = v1m.Cross(v13);
if (c1 >= 0 && c2 >= 0)
{
}
else
{
}
벡터들에 외적을 취하고 그 값을 저장한다.
wstring str = std::format(L"c1({0}), c2({1})", c1, c2);
Utils::DrawTextW(hdc, { 20, 50 }, str);
그리고 위의 코드로 출력시켜 값을 확인하면, 위 꼭지점과 마우스와의 벡터가 다른 두 벡터의 사이에 있으면 양수, 양수로 나타나는 것을 확인할 수 있다.
또한 삼각형의 위쪽으로 커서를 올리면 두 값이 음수, 음수로 나타나는 것을 확인할 수 있다.
이런 점을 활용하면 범위 공격이나 쿨타임 표시기를 만들 수 있게 된다.
'Windows API & 게임 수학' 카테고리의 다른 글
1-9. 리소스를 관리하는 매니저 클래스(LineMesh, ResourceManager) (0) | 2023.11.01 |
---|---|
2-5. 삼각함수의 역함수 활용 - 각도 구하기, 백스텝 (0) | 2023.10.30 |
2-3. 벡터의 내적을 이용해 마우스를 따라다니는 몬스터 구현 (0) | 2023.10.30 |
2-2. 벡터를 이용한 기능 개선 - 유도탄 (0) | 2023.10.26 |
2-1. 삼각함수를 이용하여 여러 각도로 발사하기 (1) | 2023.10.26 |