반응형
참고
- 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:
Unity Pro:
Unity 프리미엄 학습:
반응형
'개발 > Unity' 카테고리의 다른 글
유니티 - 드래그로 평면 위의 오브젝트 움직이기 (Drag and Move on the Plane) (0) | 2022.05.14 |
---|---|
유니티 - 사각형 안에 있는 점 판단하기 (How to Check If a Point Is Inside a Rectangle) (0) | 2022.05.13 |
유니티 - 평면과 점 사이의 최단거리 구하기 (How to Get Shortest Distance between the Plane and the Point) (0) | 2022.05.12 |
유니티 - 3차원 세 점의 좌표로 삼각형의 넓이 구하기 (0) | 2022.05.11 |
유니티 - 콜라이더의 중심과 경계 (center, extents) (0) | 2022.05.11 |
댓글