게임엔진/윈도우API

윈도우API)11. 역삼각함수

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

역삼각함수

역삼각함수는 삼각함수의 역함수를 의미한다. 역삼각함수를 사용하는 이유는 바로 주어진 값에 따른 각도를 얻을수 있기 때문이다.

윈도우API)11. 역삼각함수 - 역삼각함수
Sin의 역함수
윈도우API)11. 역삼각함수 - 역삼각함수
Cos의 역함수

 

 

게임수학) Chapter1. 삼각함수

삼각형은 꽤나 오래전부터 연구되어온것중 하나이다. 게임에서도 이러한 삼각형의 성질을 이용해서 콘텐츠를 제작하는데, 그중에서 삼각함수에 대해 알아보려고 한다. 삼각함수 모든 삼각함수...

pjnull.tistory.com

 

역삼각함수와 내적/외적

 

역삼각함수에서 각도를 구할때 내적을 이용한다면 손쉽게 cos값을 얻을수 있다. 또한 외적을 이용한다면 역삼각함수가 닿지 않는 범위까지 보정이 가능하다. 

 

 

게임에서 활용

 

그렇다면 게임에서는 역삼각함수를 어떻게 활용할수 있을까?

윈도우API)11. 역삼각함수 - 역삼각함수 - 게임에서 활용

이러한 식으로 x축을 기준으로 cos은 수직적인 범위를 가지고 있으며, sin은 수평적인 범위를 가지게 된다. 이를 이용하여 피격의 범위(백어택)과 같은 로직을 구현하는 유용하게 사용할수 있다.

 

구현

 

Vector _lookPos = {};
Vector _lookDir = {};

 

	Vector monsterTomouseDir=mousepos - _pos;
	monsterTomouseDir.Normalize();
	Vector dir = _lookDir;
	dir.Normalize();
	float dot1 = (monsterTomouseDir.Dot(dir));
	float radian = acos(dot1);
	float angle = radian * 180 / 3.14f;
	wstring str = format(L"angle({0})",angle);
	Utils::DrawText(hdc, { 20,50 }, str);

 

 

 

윈도우API)11. 역삼각함수 - 역삼각함수 - 구현
윈도우API)11. 역삼각함수 - 역삼각함수 - 구현

 

위 코드의 문제점은 arccos함수가 0~180º까지 밖에 판별을 하지못하므로 180도가 넘어가면 각도가 줄어들게 된다.

이러한 현상은 외적을 이용하고 보정을 해주면 쉽게 고칠수 있다.

 

	float crossval=_lookDir.Cross(monsterTomouseDir);
	if (crossval < 0)angle = 360 - angle;

 

윈도우API)11. 역삼각함수 - 역삼각함수 - 구현

 

 

윈도우API)11. 역삼각함수 - 역삼각함수 - 구현

 

 

백어택 적용

이를 통해 백어택과 같은 방향성 로직을 만들수있다.

if (angle < 240 && angle>120)
	{
		wstring str2 = format(L"BackAttack");
		Utils::DrawText(hdc, { 20,80 }, str2);

	}

 

윈도우API)11. 역삼각함수 - 역삼각함수 - 구현 - 백어택 적용
윈도우API)11. 역삼각함수 - 역삼각함수 - 구현 - 백어택 적용

 

728x90
반응형

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

윈도우API)13.플립북 애니메이션  (0) 2022.12.24
윈도우API)12. 모작  (1) 2022.12.23
윈도우API)10. 벡터의 외적  (0) 2022.12.22
윈도우API)9. 벡터의 내적  (0) 2022.12.22
윈도우API)8. 벡터  (0) 2022.12.18

댓글