}

유니티 - 팁(Tip) 접촉 판정 로직 완벽 이해하기

InverseTransformPoint 예시 설명

Vector3 localTipPos = referential.InverseTransformPoint(tip.position);

월드 좌표계에 있는 tip.positionreferential 기준의 로컬 좌표로 변환합니다.

해석

  • tip.position: 팁의 월드 좌표계 위치
  • referential: 기준이 되는 오브젝트 (예: 접촉 대상의 Transform)
  • localTipPos: referential 기준에서 본 팁의 상대적 위치

즉, localTipPos는 "이 팁이 표면 오브젝트 기준으로 어느 위치에 있는지"를 알려줍니다.

📌 이걸 통해 표면 안으로 얼마나 들어갔는지, 어느 방향으로 들어왔는지를 정밀하게 계산할 수 있습니다.


BlockingSurface 구성은 다음과 같습니다.

public class BlockingSurface : MonoBehaviour
{
    public Transform referential;
    public Vector3 positiveProximityThresholds = new Vector3(0.5f, 0.5f, 0.2f);
    public Vector3 negativeProximityThresholds = new Vector3(-0.5f, -0.5f, -0.001f);
    public float maxDepth = 0.005f;

    private void Awake()
    {
        if (referential == null) referential = transform;
    }
}
  • referential: 기준이 되어줄 좌표계
  • positive/negativeProximityThresholds: 허용 범위
  • maxDepth: 팁이 더 깊이 들어가면 차단될 거리
bool isBlocked =
    localTipPos.x > negative.x && localTipPos.x < positive.x &&
    localTipPos.y > negative.y && localTipPos.y < positive.y &&
    localTipPos.z > negative.z && localTipPos.z < positive.z;

negative.x는 BlockingSurface.negativeProximityThresholds.x를 의미합니다.


bool isBlocked = ... 이 로직은 절대 거리일까, 상대 거리일까?

bool isBlocked =
    localTipPos.x > negative.x && localTipPos.x < positive.x &&
    localTipPos.y > negative.y && localTipPos.y < positive.y &&
    localTipPos.z > negative.z && localTipPos.z < positive.z;

이 코드는 팁의 위치(localTipPos)가 허용된 박스 영역 안에 있는지를 판정하는 조건입니다.
즉, negativepositive는 각각 최소/최대 허용 위치값을 의미합니다.

 


절대 거리일까? 상대 거리일까?

둘 다 될 수 있습니다.  조건은 referential.localScale에 따라 달라집니다.

기준 Transform (referential)의 상태 판정 좌표 의미
localScale == Vector3.one 절대 거리 (미터 기준)
localScale ≠ Vector3.one 상대 거리 (비율 기준)

 


예시 1: 절대 거리로 동작하는 경우

// 기준 좌표계 스케일이 기본값일 때
referential.localScale = Vector3.one; // 무.조.건 정확하게 (1,1,1)만 가능. Vector3.one* 2 안됨!!

positive = new Vector3(0.5f, 0.5f, 0.005f); // 최대 50cm, 깊이 5mm
negative = new Vector3(-0.5f, -0.5f, -0.001f); // 최대 1mm 떠 있어도 허용

➡ 이때 isBlocked미터 기준으로 팁이 들어간 범위를 판단하게 됨


예시 2: 상대 거리로 동작하는 경우

// 기준 좌표계가 2배로 스케일됨
// referential.localScale 따로 건드릴 필요 없음

positive = new Vector3(0.5f, 0.5f, 0.1f);
negative = new Vector3(-0.5f, -0.5f, -0.001f);

➡ 이때는 -0.5 ~ 0.5 범위가 실제로는 -1m ~ +1m 범위가 되어, 
팁 위치가 상대적인 비율로 판단됩니다.


정리

  • isBlocked의 로직은 코드 구조상 절대 거리든 상대 거리든 동일하게 작동합니다.
  • 단, 실제 해석 방식은 referentiallocalScale 상태에 따라 달라집니다.