본문 바로가기

unity3d

평면과 다른 한 물체 사이의 거리 구하기

물체 사이의 거리를 구하는 간단한 방법을 설명하겠습니다.


우선, 힘겹게 "그림판"으로 완성 된 아래 이미지 부터 보시죠.

(허접하다는게 반전)



① 두 물체 사이의 거리


  구하는  방법은 아주 간단합니다. Unity 에서 Scene 내에 존재하는 모든 GameObject 들은 각각 transform 을 기본적으로 가지고 있기 때문에 두 transform 사이의 거리를 계산하면 됩니다.

  Transform 에는 world space 상에서의 transform 의 위치를 나타내는 Vector3형의 position 값이 존재합니다. 위 이미지 상에서 (0,0,0) , (4,5,0) 이 바로 이 값이죠. 

  그럼, 두 position 을 이용 해 어떻게 거리를 구할까요?

  피타고라스의 정리를 통해 (4*4 + 5*5) 의 제곱근을 구하는 코드를 구현할까요? 아, 물론 그렇게 하면 두 물체 사이의 거리가 나옵니다. 하지만, Vector3 에서 제공하는 함수 중에 Distance 라는 함수가 있어, 좀 더 편하게 코드를 구현하실 수 있습니다.



return Vector3.Distance(PlaneObj.transform.position, SphereObj.transform.position);


  이렇게 하면 두 물체 사이의 거리를 구할 수 있습니다.



② 평면과 물체 사이의 거리


  그렇다면, 평면과 물체 사이의 거리는 어떻게 구할까요?


  Unity 에서 제공하는 Plane (struct) 을 이용하면 간단히 해결 하실 수 있습니다. -① 번 보단 덜 간단하지만-

  방법은, Plane 객체를 생성해서 Plane 에서 제공하는 GetDistanceToPoint 함수를 통해 Sphere 객체와의 거리를 구하면 됩니다.

  Plane 객체를 생성시 3D 평면의 정의와 똑같이 생성자를 요구합니다. (법선 벡터 N이 가리키는 방향과 수직이며 점P를 지나는 점 Q들의 집합.. 뭐 대충 이런;;). 위 경우에는 법선 벡터 N을 Plane 객체와 수직인 PlaneObj.transform.up 으로 지정, 점 P는 PlaneObj.transform.position 가 되겠죠.



Plane plane = new Plane(PlaneObj.transform.up, PlaneObj.transform.position);

return plane.GetDistanceToPoint(SphereObj.transform.position);


  이렇게 하면 평면과 한 물체 사이의 거리를 구하실 수 있습니다.


  (아! 위 이미지에서 평면과 물체 사이는 5 - 0 값인 5가 맞습니다. 쉽게 설명 드리기 위해서 position 을 설정했기 때문에 위와 같은 코드가 의미가 없어 보일 수도 있습니다만, position 도 다양할 수 있고 평면의 rotate 또한 x,y,z 어떤 축으로든 다양하게 설정 될 수 있겠죠. 그럴 때에는 위와 같은 코드가 상당히 의미 있게 사용 될 수 있습니다 ^^)