솔버 — MRTK3
솔버는 미리 정의된 알고리즘에 따라 개체의 위치 및 방향을 쉽게 계산하는 구성 요소입니다. 예: 사용자의 응시 레이캐스트가 교차하는 개체를 표면에 배치합니다.
솔버 시스템은 구성 요소의 업데이트 순서를 Unity 신뢰할 수 있는 방법이 없기 때문에 이러한 변환 계산에 대한 작업 순서를 결정적으로 정의합니다.
솔버에서는 개체를 다른 개체 또는 시스템에 연결하는 다양한 동작을 제공합니다. 다른 한 가지 예는 카메라를 기반으로 사용자 앞에 마우스를 가져가는 태그를 따라 개체입니다. 또한 컨트롤러와 개체에 솔버를 연결하여 컨트롤러를 따라 개체 태그를 만들 수도 있습니다. 모든 솔버를 안전하게 쌓을 수 있습니다(예: 태그 따라 동작과 표면 자성 및 모멘텀).
사용 방법
해 찾기 시스템은 세 가지 범주의 스크립트로 구성됩니다.
-
Solver
: 모든 솔버가 파생되는 추상 기본 클래스입니다. 상태 추적, 매개 변수 및 구현 다듬기, 자동 솔버 시스템 통합 및 업데이트 순서를 제공합니다. -
SolverHandler
: 에 대한 참조 개체 추적(예: 기본 카메라 변환, 손 광선 등)을 설정하고, 솔버 구성 요소의 수집을 처리하고, 적절한 순서로 업데이트를 실행합니다.
세 번째 범주는 솔버 자체입니다. 다음 솔버에서는 기본 동작을 위한 구성 요소를 제공합니다.
-
Orbital
: 참조된 개체에서 지정된 위치 및 오프셋으로 잠기세요. -
ConstantViewSize
: 참조된 개체의 뷰를 기준으로 일정한 크기를 유지하도록 크기를 조정합니다. -
RadialView
: 참조된 개체가 캐스팅한 뷰 원뿔 내에 개체를 유지합니다. -
Follow
: 참조된 개체의 사용자 정의 범위 집합 내에 개체를 유지합니다. -
InBetween
: 추적된 두 개체 사이에 개체를 유지합니다. -
SurfaceMagnetism
: 전 세계의 표면에 광선을 캐스팅하고 개체를 해당 표면에 맞춥니다. -
DirectionalIndicator
: 개체의 위치와 방향을 방향 표시기로 결정합니다. SolverHandler 추적 대상의 참조 지점에서 이 표시기는 제공된 DirectionalTarget을 지향합니다. -
Momentum
: 가속/속도/마찰을 적용하여 다른 솔버/구성 요소에서 이동하는 개체의 모멘텀과 탄력을 시뮬레이션합니다. -
HandConstraint
: GameObject와 손과 교차하지 않는 지역에서 손을 따라야 하는 Constraints 개체입니다. 메뉴 등과 같이 손이 제한된 대화형 콘텐츠에 유용합니다. 이 솔버가 을 사용하여 작동XRNode
합니다. -
HandConstraintPalmUp
: HandConstraint에서 파생되지만 정품 인증 전에 손바닥이 사용자를 향하고 있는지 테스트하는 논리가 포함되어 있습니다. 이 솔버가 컨트롤러에서XRNode
만 작동하며 다른 컨트롤러 형식의 기본 클래스와 마찬가지로 작동합니다. -
Overlap
: 추적된 개체와 겹칩니다.
해 찾기 시스템을 사용하려면 위에 나열된 구성 요소 중 하나를 GameObject에 추가합니다. 모든 솔버에는 가 SolverHandler
필요하므로 Unity 자동으로 생성됩니다.
참고
솔버 시스템을 사용하는 방법의 예는 SolverExamples.scene 파일에서 찾을 수 있습니다.
추적 참조를 변경하는 방법
구성 요소의 SolverHandler
추적 대상 형식 속성은 모든 솔버가 알고리즘을 계산하는 데 사용할 참조 지점을 정의합니다. 예를 들어, 단순 SurfaceMagnetism
구성 요소가 있는 의 Head
값 형식은 헤드에서 광선을 투사하고 어떤 표면이 적중된지 해결하기 위해 사용자의 시선 방향으로 투사됩니다. 속성의 잠재적 값은 TrackedTargetType
다음과 같습니다.
- *헤드: 참조 지점은 기본 카메라의 변형입니다.
-
ControllerRay: 참조 지점은
LinePointer
선 광선의 방향을 가리키는 컨트롤러(즉, 모션 컨트롤러 또는 손 컨트롤러의 포인터 원점)의 변환입니다.- 사용 된
TrackedHandedness
손수 기본 설정(즉, 왼쪽, 오른쪽, 둘 다)을 선택하려면 속성을 사용합니다.
- 사용 된
-
HandJoint: 참조 지점은 특정 손 조인트 변환입니다.
- 사용 된
TrackedHandedness
손수 기본 설정(즉, 왼쪽, 오른쪽, 둘 다)을 선택하려면 속성을 사용합니다. - 사용 하 여는
TrackedHandJoint
속성을 사용 하 여 공동 변환을 확인 합니다.
- 사용 된
-
CustomOverride: 할당된 의 참조 지점
TransformOverride
참고
ControllerRay 및 HandJoint 형식 모두에 대해 솔버 처리기는 먼저 왼쪽 컨트롤러/손 변환을 제공한 다음, 전자를 사용할 수 없거나 속성이 달리 지정하지 않는 한 오른쪽을 TrackedHandedness
제공하려고 시도합니다.
중요
대부분의 솔버에서는 에서 제공하는 SolverHandler
추적된 변환 대상의 전방 벡터를 사용합니다.
손 관절 추적 대상 유형을 사용하는 경우 손바닥 관절의 전방 벡터는 손바닥이 아닌 손가락을 가리킬 수 있습니다. 이는 손 관절 데이터를 제공하는 플랫폼에 따라 달라집니다. 입력 시뮬레이션 및 Windows Mixed Reality 경우 위쪽 벡터가 손바닥을 가리킵니다(즉, 녹색 벡터가 위쪽이고 파란색 벡터가 앞으로).
이를 해결하려면 의 추가 회전 속성을 SolverHandler
90, 0, 0으로< 업데이트합니다>. 이렇게 하면 솔버에 제공된 전방 벡터가 손바닥을 가리키고 손에서 바깥쪽으로 가리킵니다.
또는 컨트롤러 광선 추적 대상 유형을 사용하여 손으로 가리키는 유사한 동작을 가져옵니다.
솔버를 연결하는 방법
동일한 GameObject에 여러 Solver
구성 요소를 추가하여 알고리즘을 연결할 수 있습니다.
SolverHandler
구성 요소는 동일한 GameObject의 모든 솔버 업데이트를 처리합니다. 기본적으로 시작에서 SolverHandler
를 호출 GetComponents<Solver>()
합니다. 그러면 검사기에서 나타나는 순서대로 솔버가 반환됩니다.
또한 업데이트된 연결된 변환 속성을 true로 설정하면 계산된 위치, 방향 및 크기를 모든 솔버가 액세스할 수 있는 중간 변수(즉, GoalPosition
)로 저장하도록 지시 Solver
합니다. false이면 는 Solver
GameObject의 변환을 직접 업데이트합니다. 변환 속성을 중간 위치에 저장하면 다른 솔버가 중간 변수부터 계산을 수행할 수 있습니다. 이는 Unity gameObject.transform에 대한 업데이트를 동일한 프레임 내에서 스택으로 허용하지 않기 때문입니다.
참고
개발자는 속성을 직접 설정하여 솔버 실행 순서를 수정할 SolverHandler.Solvers
수 있습니다.
새 솔버를 만드는 방법
모든 솔버가 추상 기본 클래스 Solver
에서 상속되어야 합니다. 해 찾기 확장의 기본 요구 사항에는 메서드 재정의가 포함됩니다 SolverUpdate
. 이 메서드에서 개발자는 상속된 GoalPosition
, GoalRotation
및 GoalScale
속성을 원하는 값으로 업데이트해야 합니다. 또한 소비자가 원하는 참조 프레임으로 활용하는 SolverHandler.TransformTarget
것이 중요합니다.
아래에 제공된 코드는 연결된 개체를 앞에 2m 배치하는 라는 InFront
새 해 찾기 구성 요소의 SolverHandler.TransformTarget
예를 제공합니다. 소비자는 를 로 Head
설정한 SolverHandler.TrackedTargetType
다음SolverHandler.TransformTarget
, 는 카메라 변환이 되므로 이 해 찾기는 연결된 GameObject 2m를 모든 프레임의 사용자 응시 앞에 배치합니다.
/// <summary>
/// InFront solver positions an object 2m in front of the tracked transform target
/// </summary>
public class InFront : Solver
{
...
public override void SolverUpdate()
{
if (SolverHandler != null && SolverHandler.TransformTarget != null)
{
var target = SolverHandler.TransformTarget;
GoalPosition = target.position + target.forward * 2.0f;
}
}
}
해 찾기 구현 가이드
일반적인 솔버 속성
모든 해 찾기 구성 요소에는 핵심 해 찾기 동작을 제어하는 동일한 속성의 핵심 집합이 있습니다.
Smoothing을 사용하도록 설정하면 해 찾기는 시간이 지남에 따라 GameObject의 변환을 계산 값으로 점진적으로 업데이트합니다. 모든 변환 구성 요소의 LerpTime 속성은 이 변경 속도를 결정합니다. 예를 들어 MoveLerpTime 값이 높을수록 프레임 간 이동 속도가 느려집니다.
MaintainScale을 사용하도록 설정하면 해 찾기가 GameObject의 기본 로컬 배율을 활용합니다.
궤도의
클래스는 Orbital
태양계의 행성처럼 동작하는 태그를 따라 구성 요소입니다. 이 해 찾기는 연결된 GameObject가 추적된 변환 주위로 궤도를 돌도록 합니다. 따라서 의 추적 대상 유형SolverHandler
이 로 설정된 Head
경우 GameObject는 고정 오프셋이 적용된 사용자의 머리 주위를 공전합니다.
개발자는 이 고정 오프셋을 수정하여 사용자 주위에 메뉴 또는 기타 장면 구성 요소를 눈 높이 또는 허리 수준 등으로 유지할 수 있습니다. 이 작업은 로컬 오프셋 및 월드 오프셋 속성을 변경하여 수행됩니다. Orientation Type 속성은 원래 회전을 유지하거나 항상 카메라를 향하거나 위치를 구동하는 모든 변환에 직면해야 하는 경우 개체에 적용된 회전을 결정합니다.
RadialView
는 RadialView
GameObject의 특정 부분을 사용자 보기의 frustum 내에 유지하는 또 다른 태그 기반 구성 요소입니다.
Min & Max View Degrees 속성은 GameObject가 항상 표시되어야 하는 부분의 양을 결정합니다.
최소 & 최대 거리 속성은 GameObject를 사용자로부터 유지해야 하는 거리를 결정합니다. 예를 들어 최소 거리가 1m인 GameObject를 향해 걸어가면 GameObject를 밀어 내어 사용자에게 1m보다 더 가깝지 않도록 합니다.
일반적으로 RadialView
은 로 설정된 Head
추적 대상 유형과 함께 사용되므로 구성 요소가 사용자의 응시를 따릅니다. 그러나 이 구성 요소는 추적된 대상 형식의 "보기"에 유지되도록 작동할 수 있습니다.
팔로우
클래스는 Follow
로컬 정방향 축을 기준으로 추적된 대상 앞에 요소를 배치합니다. 요소를 느슨하게 제한("태그 따라"라고도 함)할 수 있으므로 추적된 대상이 사용자 정의 범위를 초과할 때까지 수행되지 않습니다.
이는 RadialView 솔버와 유사하게 작동하며, 개체의 방향을 변경하는 최대 가로 & 수직 뷰 도 및 메커니즘을 관리하는 추가 컨트롤이 있습니다.
InBetween
클래스는 InBetween
두 변환 사이에 연결된 GameObject를 유지합니다. GameObject의 자체 SolverHandler
추적 대상 유형 과 InBetween
구성 요소의 두 번째 추적 대상 유형 속성은 이러한 두 변환 엔드포인트를 정의합니다. 일반적으로 두 형식이 로 설정 CustomOverride
되고 결과 SolverHandler.TransformOverride
및 InBetween.SecondTransformOverride
값이 추적된 두 엔드포인트로 설정됩니다.
구성 InBetween
요소는 두 번째 추적 대상 유형 및 두 번째 변환 재정의 속성을 기반으로 런타임에 다른 SolverHandler
구성 요소를 만듭니다.
두 변환 사이의 선을 따라 는 개체가 중간으로 0.5, 첫 번째 변환 PartwayOffset
에서 1.0, 두 번째 변환에서 0.0으로 배치될 위치를 정의합니다.
SurfaceMagnetism
는 SurfaceMagnetism
표면의 설정된 LayerMask에 대해 레이캐스트를 수행하고 해당 접점에 GameObject를 배치하여 작동합니다.
Surface Normal Offset은 GameObject를 표면의 적중 지점에서 정상 방향으로 표면으로부터 몇 미터 떨어진 곳에 배치합니다.
반대로 Surface 광선 오프셋 은 GameObject의 설정된 거리를 표면에서 몇 미터 떨어져 있지만 수행된 광선캐스트의 반대 방향으로 배치합니다. 따라서 레이캐스트가 사용자의 응시인 경우 GameObject는 표면의 적중 지점에서 카메라까지 선을 따라 더 가깝게 이동합니다.
방향 모드는 표면의 보통과 관련하여 적용할 회전 유형을 결정합니다.
- 없음 - 회전이 적용되지 않음
- TrackedTarget - 개체가 레이캐스트를 구동하는 추적된 변환에 직면하게 됩니다.
- SurfaceNormal - 표면의 적중 지점에서 표준에 따라 개체가 정렬됩니다.
- 혼합 - 개체는 추적된 변환을 향하여 표면 및 표면의 적중 지점에서 표준에 따라 정렬됩니다.
연결된 GameObject가 None 이외의 모든 모드에서 수직으로 유지되도록 하려면 방향 세로 유지를 사용하도록 설정합니다.
참고
Orientation Blend 속성을 사용하여 방향 모드가 Blended로 설정된 경우 회전 계수 간의 균형을 제어합니다. 값 0.0은 TrackedTarget 모드에서 완전히 구동되는 방향을 가지며, 값 1.0은 SurfaceNormal에 의해 완전히 구동되는 방향을 갖습니다.
겹침
는 Overlap
개체의 변환을 변환 대상과 동일한 위치 및 회전 SolverHandler's
으로 유지하는 간단한 솔버입니다.
적중할 수 있는 표면 결정
GameObject에 SurfaceMagnetism
구성 요소를 추가할 때 충돌체가 있는 경우 GameObject 및 해당 자식 계층을 고려하는 것이 중요합니다. 구성 요소는 다양한 광선 캐스트를 수행하여 "자석"자체에 대해 어떤 표면을 결정하여 작동합니다. 솔버 GameObject에 의 속성SurfaceMagnetism
에 나열된 레이어 중 하나에 충돌기가 있다고 MagneticSurfaces
가정해 보겠습니다. 이 경우 레이캐스트가 자체적으로 충돌하여 GameObject가 자체 충돌 지점으로 연결됩니다. 이 이상한 동작은 기본 GameObject 및 모든 자식을 광선 캐스트 무시 레이어로 설정하거나 LayerMask 배열을 적절하게 수정하여 MagneticSurfaces
방지할 수 있습니다.
반대로 SurfaceMagnetism
GameObject는 속성에 나열 MagneticSurfaces
되지 않은 레이어의 표면과 충돌하지 않습니다. 원하는 모든 표면을 전용 레이어(즉, Surface)에 배치하고 속성을 이 레이어로 설정하는 MagneticSurfaces
것이 좋습니다.
기본값 또는 모든 항목을 사용하면 UI 구성 요소 또는 커서가 솔버에 기여할 수 있습니다.
마지막으로, 속성 설정보다 더 멀리 있는 MaxRaycastDistance
표면은 레이캐스트에서 SurfaceMagnetism
무시됩니다.
DirectionalIndicator
클래스는 DirectionalIndicator
원하는 공간 지점의 방향을 지향하는 태그 기반 구성 요소입니다. 의 추적 대상 유형SolverHandler
이 로 설정된 Head
경우 가장 일반적으로 사용됩니다. 이러한 방식으로 솔버가 있는 DirectionalIndicator
UX 구성 요소는 사용자에게 원하는 공간 지점을 확인하도록 지시합니다. 이 점은 Directional Target 속성에 의해 결정됩니다.
사용자가 방향 대상을 볼 수 있거나 에 설정된 참조 프레임이 있는 경우 이 솔버는 그 아래에 있는 SolverHandler
모든 Renderer
구성 요소를 사용하지 않도록 설정합니다. 볼 수 없는 경우 표시기에서 모든 항목이 사용하도록 설정됩니다.
표시기의 크기는 사용자가 FOV에서 방향 대상 을 캡처할수록 줄어듭니다.
최소 표시기 배율 - 표시기 개체의 최소 눈금입니다.
최대 표시기 배율 - 표시기 개체의 최대 눈금입니다.
표시 유형 배율 - 방향 대상 지점을 볼 수 있는지 여부를 결정하는 FOV를 늘리거나 줄이는 승수입니다.
뷰 오프셋 - 참조 프레임(즉, 카메라 가능)의 관점에서 표시기 방향으로 이 속성은 개체가 뷰포트의 중심에서 얼마나 멀리 떨어져 있는지를 정의합니다.
방향 표시기 예제 장면(Assets/MRTK/Examples/Demos/Solvers/Scenes/DirectionalIndicatorSolverExample.unity)
HandConstraint 및 HandConstraintPalmUp이 있는 손 메뉴
동작은 HandConstraint
손 제한 콘텐츠(예: 손 UI, 메뉴 등)에 대해 추적된 개체를 안전한 지역으로 제한하는 솔버를 제공합니다. 안전한 지역은 손과 교차하지 않는 영역으로 간주됩니다. 손바닥이 사용자를 향할 때 솔버 추적 개체를 활성화하는 일반적인 동작을 보여 주는 파생 클래스 HandConstraint
도 포함 HandConstraintPalmUp
됩니다.
손 제약 조건 솔버를 사용하여 손 메뉴를 만드는 예제는 손 메뉴 설명서를 참조하세요.