본문 바로가기
개발/Unity

유니티 - 평면과 점 사이의 최단거리 구하기 (How to Get Shortest Distance between the Plane and the Point)

by 피로물든딸기 2022. 5. 12.
반응형

Unity 전체 링크

 

참고

- 평면과 점 사이의 최단거리를 만드는 평면 위의 점 구하기

- 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:

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Unity Pro:

 

Unity Pro

The complete solutions for professionals to create and operate.

unity.com

 

Unity 프리미엄 학습:

 

Unity Learn

Advance your Unity skills with live sessions and over 750 hours of on-demand learning content designed for creators at every skill level.

unity.com

반응형

댓글