공부/게임 수학
피타고라스의 정리
밤톨ㅇl
2024. 12. 1. 00:03
피타고라스 정리!!
직각 삼각형 세 변의 길이 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;
}
}
}