예외적인 조건 처리
대부분의 경우 WLT는 애플리케이션의 개입 없이 추적 오류를 자동으로 감지하여 수정할 수 있습니다.
그러나 몇 가지 예외적인 조건에서는 애플리케이션이 직접 조정하려는 오류가 발생합니다.
추적 손실은 이러한 조건의 예입니다.
추적은 여러 가지 이유로 언제든지 손실될 수 있습니다. 무언가가 센서를 가리거나, 조명이 부적절하거나, 카메라 주변에 추적할 시각적 물체가 없을 수 있습니다.
예외적인 조건 완화를 위한 WLT의 기능을 포함하여 예외적인 조건에 대한 개념 설명은 이 설명서의 다른 부분에서 다룹니다.
여기서는 애플리케이션 개발자가 예외적 조건 하에서 이러한 기능을 활용하여 애플리케이션의 동작을 사용자 지정하는 방법(선택 사항)을 살펴보겠습니다.
AttachmentPoints
여기에 자세히 설명되어 있는 것처럼, 연결 지점은 애플리케이션이 응답에 사용할 수 있는 적절한 데이터와 함께 예외적인 조건이 발생했음을 알리는 WLT와 애플리케이션 간의 계약입니다.
Adjuster 구성 요소
이러한 애플리케이션 응답의 구현은 "Adjuster" 구성 요소의 형태로 사용할 수 있습니다. 기본 구성 요소는 AdjusterFixed 구성 요소입니다.
AdjusterFixed는 있는 그대로 사용해도 되지만, 어떤 일을 하는지 이해하면 도움이 될 수 있으며, 특히 동작을 추가로 사용자 지정하려는 개발자에게 많은 도움이 됩니다.
Adjuster 구성 요소는 다음 두 가지 역할을 수행한다는 것을 알아 두어야 합니다.
- 기본 AttachmentPoint를 관리합니다.
- 예외적인 조건에 대한 애플리케이션 응답의 구현을 제공합니다.
AttachmentPoint 관리
Start()
및 OnDestroy()
멤버를 검사하면 필요한 AttachmentPoint 관리의 대부분이 해결됩니다.
Start()
에서 기본 AttachmentPoint가 만들어지고, AdjusterFixed의 멤버 함수가 콜백으로 제공됩니다(아래 참조).
OnDestroy()
에서 이러한 콜백 연결이 끊어지고 AttachmentPoint가 해제됩니다.
조건 처리 콜백
두 콜백은 이러한 예외적 조건에서 애플리케이션이 원하는 동작을 구현합니다.
추적 상태 처리
HandleStateAdjust()
에서 AdjusterFixed 구성 요소는 현재 추적되지 않는 조각에 포함된 개체를 사용하지 않도록 설정합니다.
protected virtual void HandleAdjustState(AttachmentPointStateType state)
{
bool visible = state == AttachmentPointStateType.Normal;
if (visible != gameObject.activeSelf)
{
gameObject.SetActive(visible);
}
}
이 간단한 동작은 여러 애플리케이션에 적합하지만, 이 동작으로는 충분하지 않은 다음과 같은 사례를 쉽게 떠올릴 수 있습니다.
- 개체를 숨겨야 하지만 사용하지 않도록 설정하면 안 됩니다(계속 업데이트해야 함).
- 개체를 숨기는 다른 방법을 사용하는 것이 좋습니다(예: 멀리 있는 클리핑 평면을 넘어 이동).
- 개체를 숨기는 대신 다른 재질(예: X선 재질)로 렌더링해야 합니다.
- 개체를 숨기는 대신 대체 개체를 렌더링해야 합니다.
- 기타
다행히 애플리케이션 개발자는 이러한 동작 또는 상상하는 다른 동작을 자유롭게 구현할 수 있습니다.
사용자 지정 동작을 지정하는 가장 간단한 방법은 AdjusterFixed에서 파생되는 사용자 지정 구성 요소를 구현하는 것입니다. 그 후 AttachmentPoint 관리를 상속하고, 처리기를 재정의하여 사용자 지정 동작을 만들 수 있습니다.
위치 변경 처리
개념 설명서의 설명처럼 WLT 시스템은 고정된 공간에서 개체의 위치를 변경하여 개체를 물리적 세계에 최적으로 배치할 수 있다고 결정할 수 있습니다. 시스템은 AttachmentPoint 메커니즘을 통해 해당 상황을 애플리케이션에 알립니다.
애플리케이션에서 물론 이러한 조정을 무시할 수 있습니다. 그러나 AdjusterFixed(및 AdjusterMoving) 구성 요소에서 제공하는 동작은 해당 위치 변경 변환을 즉시 적용됩니다.
protected virtual void HandleAdjustLocation(Pose adjustment)
{
Pose pose = gameObject.transform.GetGlobalPose();
pose = adjustment.Multiply(pose);
gameObject.transform.SetGlobalPose(pose);
}
애플리케이션은 거의 항상 이렇게 되기를 원합니다. 그렇다면 다른 사람들은 AdjusterFixed의 HandlePositionAdjust()
함수를 왜 재정의하려고 하는지 그 이유가 궁금할 수 있습니다.
그 이유는 애플리케이션이 위치 수정 외에도 다른 작업을 수행하려 할 때가 있기 때문입니다. 일시적인 재질 효과는 변경 작업이 수행되었음을 사용자에게 알리는 데 도움이 될 수 있습니다. 위치 변경은 몇 초 동안 이루어질 수 있습니다. 또는 위치 변경이 급격한 경우 애플리케이션은 개체를 이동하는 대신 삭제하는 것을 선호할 수 있습니다.
AdjusterFixed와 AdjusterMoving 비교
AdjusterMoving 구성 요소를 자세히 살펴보면 이 구성 요소가 파생되는 AdjusterFixed 구성 요소와 거의 동일한 것을 알 수 있습니다.
둘의 차이점으로 AdjusterMoving은 대상이 환경 주변을 지속적으로 이동한다고 가정합니다. 따라서 업데이트마다 WLT 시스템에 새 Pose 소식을 알립니다.
AdjusterMoving의 비용은 함수 내에서 수행하는 작업이 아닌 Update() 함수를 추가할 때 주로 발생합니다. 그러나 "거의" 고정되어 있고 스크립트에서 자주 이동되지 않는 개체의 경우 개체가 이동될 때마다 AdjusterFixed 구성 요소를 사용하고 AdjusterFixed.UpdatePosition()을 호출하는 것이 유리할 수 있습니다.
원하는 경우에만 동작을 사용자 지정
다시 말하지만, 이 패턴이 World Locking Tools 전체에서 일관적인 것이 좋습니다. WLT는 간단하지만 일반적으로 유용한 기준 동작을 제공합니다. 이 구현이 다음 중 하나에 해당하는 것이 좋습니다.
- 애플리케이션의 요구 사항을 충족합니다.
- 개선할 기준 구현을 제공합니다.
- 집중할 수 있는 샘플 구현을 제공합니다.