InverseTransformPoint 예시 설명
Vector3 localTipPos = referential.InverseTransformPoint(tip.position);
월드 좌표계에 있는 tip.position
을 referential
기준의 로컬 좌표로 변환합니다.
해석
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)가 허용된 박스 영역 안에 있는지를 판정하는 조건입니다.
즉, negative
와 positive
는 각각 최소/최대 허용 위치값을 의미합니다.
절대 거리일까? 상대 거리일까?
✅ 둘 다 될 수 있습니다. 조건은 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
의 로직은 코드 구조상 절대 거리든 상대 거리든 동일하게 작동합니다.- 단, 실제 해석 방식은
referential
의localScale
상태에 따라 달라집니다.