본문 바로가기
개발/Unity

유니티 - 평면과 직선의 접점 좌표 구하기 (Intersection of a Line and a Plane)

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

Unity 전체 링크

 

참고

- 세 점을 지나는 평면 구하기

- 3차원에서 두 직선 사이의 최단 거리를 만드는 직선

 

두 점을 이었을 때, 평면을 통과하는 경우, 접점 좌표(교차점)를 구해보자.

 

조금 확대하면 아래의 좌표를 구한다고 할 수 있다.

 

 

두 점으로 이루어진 직선이 평면을 통과할 때의 접점 좌표의 공식은 아래와 같다.

CP = Contact Point, 접점의 좌표

A, B = 두 점의 좌표

nAB = A에서 B를 향하는 직선 방향의 벡터의 normalize

Normal = 평면의 노멀 벡터(법선 벡터)

P = 평면에 포함된 점

 

● 는 벡터의 내적을 의미한다.


빈 오브젝트 ContacPoint를 만들고 ContactPoint.cs를 추가한다.

직선을 만들 두 점 Dot1, 2와 ContactPoint가 제대로 나오는지 확인하기 위한 오브젝트를 추가한다.

그리고 직선을 관통할 평면을 추가한다.

 

하얀 공이 Dot1, 2가 되고, 연두색 공이 Contact Point가 된다.

 

ContactPoint.cs는 아래와 같다.

getContactPoint는 위의 공식을 그대로 유니티에 적용하였다.

벡터의 내적은 Vector3.Dot으로 나타낼 수 있다.

그리고 Plane의 노멀 벡터는 transform.up이 된다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ContactPoint : MonoBehaviour
{
    public GameObject dot1, dot2;
    public GameObject contactPoint;
    public GameObject plane;

    Vector3 getContactPoint(Vector3 normal, Vector3 planeDot, Vector3 A, Vector3 B)
    {
        Vector3 nAB = (B - A).normalized;

        return A + nAB * Vector3.Dot(normal, planeDot - A) / Vector3.Dot(normal, nAB);
    }

    void Update()
    {
        contactPoint.transform.position 
            = getContactPoint(
                plane.transform.up, plane.transform.position, /* plane의 normal vector와 포함하는 점 */
                dot1.transform.position, dot2.transform.position);

        Debug.DrawLine(dot1.transform.position, dot2.transform.position, Color.red);
    }
}

 

Debug.DrawLine으로 두 점을 이었고, contactPoint에 접점의 좌표를 변화하도록 하면 아래와 같이 보이게 된다.

 

 

아래와 같이 점을 움직이면 접점의 좌표도 움직이는 것을 알 수 있다.

 

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

반응형

댓글