피타고라스 정리!!
직각 삼각형 세 변의 길이 a, b, c가 있을 때 빗변 c의 제곱은 a의 제곱과 b의 제곱을 더한 것과 같다
이 피타고라스 정리를 유니티로 간단하게 만들어 보려고 한다
public static float GetDistance(float a, float b)
{
float _Hypotenuse = 0f;
_Hypotenuse = Mathf.Sqrt(a * a + b * b);
return _Hypotenuse;
}
public static float GetDistance(Vector2 a, Vector2 b)
{
float _Hypotenuse = 0f;
float offsetX = a.x - b.x;
float offsetY = a.y - b.y;
_Hypotenuse = Mathf.Sqrt(offsetX * offsetX + offsetY * offsetY);
return _Hypotenuse;
}
public static float GetDistance(Vector3 a, Vector3 b)
{
float _Hypotenuse = 0f;
float offsetX = a.x - b.x;
float offsetY = a.y - b.y;
float offsetZ = a.z - b.z;
_Hypotenuse = Mathf.Sqrt(offsetX * offsetX + offsetY * offsetY + offsetZ * offsetZ);
return _Hypotenuse;
}
결과
Vector의 Distance함수와 비교하니 똑같이 나온다!!
아무 생각 없이 사용했던 Distance함수가 어떻게 동작하는지 알게 되니 게임 개발에 더 많이 활용할 수 있을 거 같당
유니티에서는 피타고라스의 정리를 어떻게 활용하고 있을까?
지피티한테 물어보니
보통 2D나 3D 공간에서 객체의 거리를 계산하거나 충돌 감지에 쓰이고 나중에 공부해 볼 벡터에도 쓰인다고한다
그래서 나는 객체 간의 거리를 이용하여 간단한 기능을 만들어보려고 한다
궁수의 전설이라는 게임을 보면 제일 가까운 적을 공격하는 걸 볼 수 있다
Player위치와 타겟들의 거리를 계산해 가장 가까운 적을 찾고 바라보는 간단한 기능을 만들어보겠다
완성~~~
private void Update()
{
GetClosestObject();
if (closestTarget != null)
{
transform.LookAt(closestTarget);
}
}
void GetClosestObject()
{
float closestDistance = Mathf.Infinity;
foreach (Transform target in targets)
{
float distance = GetDistance(target.position, transform.position);
if (distance < closestDistance)
{
closestDistance = distance;
closestTarget = target;
}
}
}
'공부 > 게임 수학' 카테고리의 다른 글
벡터(내적) (0) | 2024.12.08 |
---|---|
삼각함수(tan) (1) | 2024.12.05 |
삼각함수(Sin, Cos) (3) | 2024.12.04 |
벡터(Vector) (0) | 2024.12.01 |