참고
- 평면과 점 사이의 최단거리를 만드는 평면 위의 점 구하기
- Vector3.Cross로 평면 위에서 시계 방향 판단하기
아래의 그림에서 평면은 (0, 0, 0)에 Sphere는 (0, 3, 2)에 위치하고 있다.
이 평면과 Sphere 사이의 최단거리는 3이 된다.
그러나 두 오브젝트의 거리를 구하면 3이 나오지 않는다.
빈 오브젝트를 생성하여 Distance라고 이름을 변경한 후, DistanceTest.cs를 추가해보자.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DistanceTest : MonoBehaviour
{
public GameObject plane;
public GameObject dot;
void Start()
{
Debug.Log(Vector3.Distance(plane.transform.position, dot.transform.position));
}
void Update()
{
Debug.DrawLine(plane.transform.position, dot.transform.position, Color.red);
}
}
Distance는 오브젝트의 중심이 되는 transform.position으로 부터 거리를 구하는 함수다.
따라서 DrawLine으로 오브젝트 사이의 선을 그려보면 아래와 같이 나오는데,
이 선의 길이가 3.605551이 된다고 볼 수 있다.
평면과 점의 최단거리를 구하기 위해서는 평면과 점의 공식을 사용해야 한다.
하지만 유니티에서 Plane의 GetDistanceToPoint 메서드를 이용하면 간단히 구할 수 있다.
먼저 Plane의 방향은 normal vector와 Plane을 포함하는 점 하나로 생성된다.
따라서 new로 Plane을 만들 때, 노멀 벡터(법선 벡터)와 점 하나를 넣으면 평면이 만들어지고,
GetDistanceToPoint에 거리를 구하고 싶은 점을 넣으면 최단거리를 구할 수 있다.
float distancePlaneToPoint(Vector3 normal, Vector3 planeDot, Vector3 point)
{
Plane plane = new Plane(normal, planeDot);
return plane.GetDistanceToPoint(point);
}
void Start()
{
//Debug.Log(Vector3.Distance(plane.transform.position, dot.transform.position));
Debug.Log(
distancePlaneToPoint(
plane.transform.up, plane.transform.position, dot.transform.position));
}
현재 Plane의 방향이 (0, 1, 0)이라고 할 수 있으므로 plane.transform.up을 normal vector로 넘겨주었다.
이제 아래와 같이 정상적으로 최단 거리 3을 얻을 수 있다.
Unity Plus:
Unity Pro:
Unity 프리미엄 학습:
'개발 > Unity' 카테고리의 다른 글
유니티 - 사각형 안에 있는 점 판단하기 (How to Check If a Point Is Inside a Rectangle) (0) | 2022.05.13 |
---|---|
유니티 - 평면과 직선의 접점 좌표 구하기 (Intersection of a Line and a Plane) (0) | 2022.05.12 |
유니티 - 3차원 세 점의 좌표로 삼각형의 넓이 구하기 (0) | 2022.05.11 |
유니티 - 콜라이더의 중심과 경계 (center, extents) (0) | 2022.05.11 |
(6) 버튼에 이벤트 연결하기 - 파이 메뉴(Pie / Radial Menu) 만들기 (0) | 2022.05.10 |
댓글