한 오브젝트에서 다른 오브젝트로의 방향과 거리

공간에서 한 점을 다른 것으로부터 뺀다면, 그 결과는 한 오브젝트에서 다른 오브젝트를 "가리키는" 벡터가 됩니다:

//플레이어의 위치에서 목표의 위치를 가리키는 벡터를 얻습니다.
var heading = target.position - player.position;

목표 오브젝트의 방향을 가리키는 것뿐 아니라, 이 벡터의 크기는 두 점의 거리와 같습니다. 일반적으로는 목표로 향하는 방향과 목표에 대한 거리를 보여주는 정규화 된 벡터가 필요합니다(예를 들면, 발사체(projectile)을 지시하기 위해). 오브젝트 사이의 거리는 방향성 벡터의 크기와 같으며 이 벡터는 그 크기를 나눔으로써 정규화 될 수 있습니다:-

var distance = heading.magnitude;
var direction = heading / distance;  // 이제 정규화된 방향을 표시합니다.

둘 다 상당히 CPU을 소요하기 때문에(모두 제곱근 계산을 포함) 이러한 접근 방식은 크기와 표준화된 속성을 별도로 모두 사용하는 것보다 바람직합니다.

만일 사용자가 비교를 위해 거리를 사용한다면 (예를 들면, 근접성 체크 등을 위해), 크기 계산을 모두 피할 수 있습니다. sqrMagnitude 속성은 크기 값은 제곱을 제공하고, 이는 크기를 시간이 많이 소요되는 제곱근 연산 없이 계산하게 됩니다. 알려진 거리에 대한 크기를 비교하기 보다는, 제곱 거리에 대한 제곱 크기를 비교할 수 있습니다:-

if (heading.sqrMagnitude < maxRange * maxRange) {
	// Target is within range.
}

이는 비교에서 실제 크기를 사용하는 것보다 훨씬 효율적입니다.

때로는, 목표에 대한 지상 행군(overground heading)이 필요합니다. 예를 들면, 지상에 서 있는 플레이어가 공중에 떠 있는 목표에 접근할 필요가 있을 경우를 상상하여 보십시오. 만일 목표의 위치에서 플레이어를 위치를 빼면, 그러면 그 결과로써 나타나는 벡터는 목표를 향해 위 방향을 가리킬 것 입니다. 이렇게 되면 그 역시 위쪽을 가리키고 있으므로 플레이어의 트랜스폼(transform)을 맞추는 데 적합하지 않습니다; 정작 필요한 것은 플레이어의 위치에서 목표의 바로 아래에 있는 지상을 가리키는 벡터입니다. 이는 뺄셈의 결과를 가지고 Y 좌표를 0으로 설정하면 쉽게 얻을 수 있습니다:-

var heading = target.position - player.position;
heading.y = 0;	// This is the overground heading.

역링크