728x90
문제
두 점 간의 거리는 각 요소(x, y, z) 의 차를 제곱한 다음 더한 값에 루트를 씌운 값이다. 게임에서도 이 공식을 사용해야할 때가 자주 있다. 이때 정확한 거리값이 필요하다면 이 공식을 사용하지만, 일정 거리 내 들어왔다던가하는 단순 비교에는 굳이 루트를 취하지 않아도 계산이 가능하다. 차원이 달라도 점 간 거리 공식은 같기 때문에 Vector3뿐만 아니라 Vector2, Vector4에도 모두 해당된다.
해결방안
따라서 이런 상황에서는 Vector3.Distance
또는 Vector3.magnitude
보다는 Vector3.sqrMagnitude
를 사용한다. 참고로 sqrMagnitude
는 square root of Magnitude가 아니라, square of Magnitude이다.
UnityCsReference에는 다음과 같이 구현되어있다. 링크
public float magnitude
{
get
{
return (float)Math.Sqrt(x * x + y * y + z * z);
}
}
public static float SqrMagnitude(Vector3 vector)
{
return vector.x * vector.x + vector.y * vector.y + vector.z * vector.z;
}
보면 알겠지만 Math.Sqrt
연산을 해서 반환하므로 더 느리다.
당연한 사실이지만 놓칠 수도 있는 점은, 거리비교를 할 때 비교한 값도 제곱한 값이여야 한다!
Vector3 offset = other.position - transform.position;
float sqrLen = offset.sqrMagnitude;
// 비교할 거리값을 제곱해준다.
if (sqrLen < closeDistance * closeDistance)
{
print("The other transform is close to me!");
}
출처
Unity - Scripting API: Vector3.sqrMagnitude
728x90