DirectX의 헤드 및 모션 컨트롤러

참고

이 문서는 레거시 WinRT 네이티브 API와 관련이 있습니다. 새 네이티브 앱 프로젝트의 경우 OpenXR API를 사용하는 것이 좋습니다.

Windows Mixed Reality 손 및 모션 컨트롤러 입력은 Windows.UI.Input.Spatial 네임스페이스에 있는 공간 입력 API를 통해 처리됩니다. 이렇게 하면 선택 과 같은 일반적인 작업을 손과 모션 컨트롤러에서 동일한 방식으로 쉽게 처리할 수 있습니다.

시작

Windows Mixed Reality 공간 입력에 액세스하려면 SpatialInteractionManager 인터페이스로 시작합니다. 일반적으로 앱 시작 중에 SpatialInteractionManager::GetForCurrentView를 호출하여 이 인터페이스에 액세스할 수 있습니다.

using namespace winrt::Windows::UI::Input::Spatial;

SpatialInteractionManager interactionManager = SpatialInteractionManager::GetForCurrentView();

SpatialInteractionManager의 작업은 입력 소스를 나타내는 SpatialInteractionSources에 대한 액세스를 제공하는 것입니다. 시스템에서 사용할 수 있는 SpatialInteractionSources에는 세 가지 종류가 있습니다.

  • 은 사용자의 감지된 손을 나타냅니다. 손 소스는 HoloLens의 기본 제스처부터 HoloLens 2 완전히 관절된 손 추적에 이르기까지 디바이스를 기반으로 하는 다양한 기능을 제공합니다.
  • 컨트롤러 는 쌍을 이루는 모션 컨트롤러를 나타냅니다. 동작 컨트롤러는 트리거 선택, 메뉴 단추, 손아귀 단추, 터치패드 및 엄지스틱과 같은 다양한 기능을 제공할 수 있습니다.
  • 음성 은 시스템에서 감지된 키워드를 말하는 사용자의 음성을 나타냅니다. 예를 들어 이 원본은 사용자가 "선택"을 표시할 때마다 Select 보도 및 릴리스를 삽입합니다.

원본의 프레임별 데이터는 SpatialInteractionSourceState 인터페이스로 표시됩니다. 애플리케이션에서 이벤트 기반 또는 폴링 기반 모델을 사용할지 여부에 따라 이 데이터에 액세스하는 방법에는 두 가지가 있습니다.

이벤트 기반 입력

SpatialInteractionManager는 앱이 수신 대기할 수 있는 여러 이벤트를 제공합니다. 몇 가지 예로 SourcePressed, [SourceReleased 및 SourceUpdated가 있습니다.

예를 들어 다음 코드는 MyApp::OnSourcePressed라는 이벤트 처리기를 SourcePressed 이벤트에 연결합니다. 이렇게 하면 앱이 모든 유형의 상호 작용 원본에서 누름을 감지할 수 있습니다.

using namespace winrt::Windows::UI::Input::Spatial;

auto interactionManager = SpatialInteractionManager::GetForCurrentView();
interactionManager.SourcePressed({ this, &MyApp::OnSourcePressed });

이 누름 이벤트는 프레스가 발생했을 때 해당 SpatialInteractionSourceState와 함께 비동기적으로 앱으로 전송됩니다. 앱 또는 게임 엔진은 즉시 처리를 시작하거나 입력 처리 루틴에서 이벤트 데이터를 큐에 대기할 수 있습니다. 다음은 SourcePressed 이벤트에 대한 이벤트 처리기 함수로, 선택 단추를 눌렀는지 여부를 확인합니다.

using namespace winrt::Windows::UI::Input::Spatial;

void MyApp::OnSourcePressed(SpatialInteractionManager const& sender, SpatialInteractionSourceEventArgs const& args)
{
	if (args.PressKind() == SpatialInteractionPressKind::Select)
	{
		// Select button was pressed, update app state
	}
}

위의 코드는 디바이스의 기본 작업에 해당하는 'Select' 누름만 확인합니다. 예를 들어 HoloLens에서 AirTap을 수행하거나 모션 컨트롤러에서 트리거를 당기는 것이 있습니다. 'Select' 누름은 대상으로 하는 홀로그램을 활성화하려는 사용자의 의도를 나타냅니다. SourcePressed 이벤트는 다양한 단추와 제스처에 대해 실행되며 SpatialInteractionSource의 다른 속성을 검사하여 이러한 경우를 테스트할 수 있습니다.

폴링 기반 입력

SpatialInteractionManager를 사용하여 모든 프레임마다 입력의 현재 상태를 폴링할 수도 있습니다. 이렇게 하려면 모든 프레임마다 GetDetectedSourcesAtTimestamp를 호출합니다. 이 함수는 모든 활성 SpatialInteractionSource에 대해 하나의 SpatialInteractionSourceState 가 포함된 배열 반환합니다. 즉, 각 활성 모션 컨트롤러에 대해 하나씩, 추적된 각 손에 대해 하나씩, 최근에 'select' 명령이 발화된 경우 음성용 1개를 의미합니다. 그런 다음 각 SpatialInteractionSourceState의 속성을 검사하여 애플리케이션에 입력을 구동할 수 있습니다.

다음은 폴링 방법을 사용하여 'select' 작업을 검사 방법의 예입니다. 예측 변수는 HolographicFrame에서 가져올 수 있는 HolographicFramePrediction 개체를 나타냅니다.

using namespace winrt::Windows::UI::Input::Spatial;

auto interactionManager = SpatialInteractionManager::GetForCurrentView();
auto sourceStates = m_spatialInteractionManager.GetDetectedSourcesAtTimestamp(prediction.Timestamp());

for (auto& sourceState : sourceStates)
{
	if (sourceState.IsSelectPressed())
	{
		// Select button is down, update app state
	}
}

각 SpatialInteractionSource에는 새 원본을 식별하고 프레임에서 프레임으로 기존 원본의 상관 관계를 지정하는 데 사용할 수 있는 ID가 있습니다. 손은 떠날 때마다 새 ID를 가져오고 FOV를 입력하지만 컨트롤러 ID는 세션 기간 동안 정적 상태로 유지됩니다. SourceDetectedSourceLost와 같은 SpatialInteractionManager의 이벤트를 사용하여 손이 디바이스의 보기에 들어오거나 나갈 때 또는 모션 컨트롤러가 켜지거나 꺼져 있거나 페어링/언페어링될 때 반응할 수 있습니다.

예측된 포즈와 기록 포즈 비교

GetDetectedSourcesAtTimestamp에는 타임스탬프 매개 변수가 있습니다. 이렇게 하면 상태를 요청하고 예측되거나 기록된 데이터를 제기하여 공간 상호 작용을 다른 입력 원본과 상호 연결할 수 있습니다. 예를 들어 현재 프레임에서 손의 위치를 렌더링할 때 HolographicFrame에서 제공하는 예측 타임스탬프를 전달할 수 있습니다. 이를 통해 시스템은 렌더링된 프레임 출력과 밀접하게 일치하도록 손 위치를 정방향 예측하여 인식된 대기 시간을 최소화할 수 있습니다.

그러나 이러한 예측된 포즈는 상호 작용 원본을 대상으로 하는 데 이상적인 포인팅 광선을 생성하지 않습니다. 예를 들어 모션 컨트롤러 단추를 누르면 해당 이벤트가 Bluetooth를 통해 운영 체제로 버블링되는 데 최대 20ms가 걸릴 수 있습니다. 마찬가지로 사용자가 손 제스처를 수행한 후 시스템이 제스처를 감지하고 앱이 이를 폴링하기까지 약간의 시간이 경과할 수 있습니다. 앱이 상태 변경을 폴링할 때 머리 및 손 포즈는 과거에 실제로 발생한 상호 작용을 대상으로 하는 데 사용됩니다. 현재 HolographicFrame의 타임스탬프를 GetDetectedSourcesAtTimestamp에 전달하여 대상으로 지정하는 경우 포즈는 프레임이 표시될 때 대상 광선으로 앞으로 예측되며, 이는 향후 20ms 이상이 될 수 있습니다. 이 향후 포즈는 상호 작용 원본 을 렌더링하는 데 좋지만, 사용자의 대상 지정이 과거에 발생했으므로 상호 작용 을 대상으로 하는 시간 문제가 복잡합니다.

다행히 SourcePressed, [SourceReleased 및 SourceUpdated 이벤트는 각 입력 이벤트와 연결된 기록 상태를 제공합니다. 여기에는 TryGetPointerPose를 통해 사용할 수 있는 기록 헤드 및 손 포즈와 이 이벤트와 상관 관계를 지정하기 위해 다른 API에 전달할 수 있는 기록 타임스탬프 가 직접 포함됩니다.

이렇게 하면 각 프레임마다 손과 컨트롤러를 사용하여 렌더링하고 대상으로 지정할 때 다음과 같은 모범 사례가 발생합니다.

  • 각 프레임을 렌더링하는 손/컨트롤러의 경우 앱은 현재 프레임의 광자 시간에 각 상호 작용 원본의 정방향 예측 포즈를 폴링해야 합니다. 각 프레임 마다 GetDetectedSourcesAtTimestamp 를 호출하여 HolographicFrame::CurrentPrediction에서 제공하는 예측 타임스탬프를 전달하여 모든 상호 작용 원본에 대해 폴링할 수 있습니다.
  • 보도 또는 릴리스를 대상으로 하는 손/컨트롤러의 경우 앱은 해당 이벤트에 대한 기록 머리 또는 손 포즈를 기반으로 눌렀거나 놓인 이벤트, 레이캐스팅을 처리해야 합니다. SourcePressed 또는 SourceReleased 이벤트를 처리하고, 이벤트 인수에서 State 속성을 가져오고, TryGetPointerPose 메서드를 호출하여 이 대상 광선을 가져옵니다.

디바이스 간 입력 속성

SpatialInteractionSource API는 다양한 기능을 갖춘 컨트롤러 및 손 추적 시스템을 지원합니다. 이러한 여러 기능은 디바이스 유형 간에 일반적입니다. 예를 들어 손 추적 및 모션 컨트롤러는 모두 'select' 작업과 3D 위치를 제공합니다. 가능한 경우 API는 이러한 공통 기능을 SpatialInteractionSource의 동일한 속성에 매핑합니다. 이를 통해 애플리케이션은 다양한 입력 형식을 보다 쉽게 지원할 수 있습니다. 다음 표에서는 지원되는 속성과 입력 형식 간에 비교하는 방법을 설명합니다.

속성 Description HoloLens(1세대) 제스처 모션 컨트롤러 관절 손
SpatialInteractionSource::Handedness 오른쪽 또는 왼손/컨트롤러. 지원되지 않음 지원 여부 지원됨
SpatialInteractionSourceState::IsSelectPressed 기본 단추의 현재 상태입니다. 에어 탭 트리거 편안한 에어 탭(수직 손가락 모으기)
SpatialInteractionSourceState::IsGrasped 잡기 단추의 현재 상태입니다. 지원되지 않음 잡기 단추 손가락 모으기 또는 닫힌 손
SpatialInteractionSourceState::IsMenuPressed 메뉴 단추의 현재 상태입니다. 지원되지 않음 메뉴 단추 지원되지 않음
SpatialInteractionSourceLocation::Position 컨트롤러의 손 또는 그립 위치의 XYZ 위치입니다. 팜 위치 그립 포즈 위치 팜 위치
SpatialInteractionSourceLocation::Orientation 컨트롤러에서 손이나 그립 포즈의 방향을 나타내는 쿼터니언입니다. 지원되지 않음 그립 포즈 방향 손바닥 방향
SpatialPointerInteractionSourcePose::Position 포인팅 광선의 원점입니다. 지원되지 않음 지원 여부 지원됨
SpatialPointerInteractionSourcePose::ForwardDirection 포인팅 광선의 방향입니다. 지원되지 않음 지원 여부 지원 여부

위의 속성 중 일부는 일부 디바이스에서 사용할 수 없으며 API는 이를 테스트하는 방법을 제공합니다. 예를 들어 SpatialInteractionSource::IsGraspSupported 속성을 검사하여 원본이 파악 작업을 제공하는지 여부를 확인할 수 있습니다.

그립 포즈와 포인팅 포즈

Windows Mixed Reality 다양한 폼 팩터에서 모션 컨트롤러를 지원합니다. 또한 관절식 손 추적 시스템도 지원합니다. 이러한 모든 시스템은 손 위치와 앱이 사용자의 손에서 개체를 가리키거나 렌더링하는 데 사용해야 하는 자연스러운 "앞으로" 방향 간에 서로 다른 관계를 갖습니다. 이 모든 것을 지원하기 위해 손 추적 및 모션 컨트롤러 모두에 제공되는 두 가지 유형의 3D 포즈가 있습니다. 첫 번째는 사용자의 손 위치를 나타내는 그립 포즈입니다. 두 번째는 사용자의 손 또는 컨트롤러에서 발생하는 포인팅 광선을 나타내는 포인팅 포즈입니다. 따라서 사용자의 손 이나 사용자의 손에 들고 있는 개체(예: 칼이나 총)를 렌더링하려면 그립 포즈를 사용합니다. 컨트롤러 또는 손에서 광선 투사하려는 경우(예: 사용자가 **UI를 가리키는 경우) 포인팅 포즈를 사용합니다.

SpatialInteractionSourceState::P roperties::TryGetLocation(...)을 통해 그립 포즈에 액세스할 수 있습니다. 다음과 같이 정의됩니다.

  • 그립 위치: 컨트롤러를 자연스럽게 잡을 때 손바닥 중심이 그립 내의 위치를 가운데에 맞도록 왼쪽 또는 오른쪽으로 조정합니다.
  • 그립 방향의 오른쪽 축 : 평평한 5 손가락 포즈를 형성하기 위해 손을 완전히 열면 손바닥에 정상적인 광선 (왼쪽 손바닥에서 앞으로, 오른쪽 손바닥에서 뒤로)
  • 그립 방향의 정방향 축: 손을 부분적으로 닫을 때(컨트롤러를 들고 있는 것처럼) 엄지 손가락이 아닌 손가락으로 형성된 튜브를 통해 "앞으로" 가리키는 광선입니다.
  • 그립 방향의 위쪽 축: 오른쪽 및 정방향 정의에 포함된 위쪽 축입니다.

SpatialInteractionSourceState::P roperties::TryGetLocation(...)::SourcePointerPose 또는 SpatialInteractionSourceState::TryGetPointerPose(...)::TryGetInteractionSourcePose를 통해 포인터 포즈에 액세스할 수 있습니다.

컨트롤러별 입력 속성

컨트롤러의 경우 SpatialInteractionSource에는 추가 기능이 있는 컨트롤러 속성이 있습니다.

  • HasThumbstick: true이면 컨트롤러에 엄지스틱이 있습니다. SpatialInteractionSourceState의 ControllerProperties 속성을 검사하여 thumbstick x 및 y 값(ThumbstickX 및 ThumbstickY)과 누름 상태(IsThumbstickPressed)를 가져옵니다.
  • HasTouchpad: true이면 컨트롤러에 터치 패드가 있습니다. SpatialInteractionSourceState의 ControllerProperties 속성을 검사하여 터치 패드 x 및 y 값(TouchpadX 및 TouchpadY)을 획득하고 사용자가 패드를 만지고 있는지(IsTouchpadTouched) 터치 패드를 누르고 있는지(IsTouchpadPressed) 확인합니다.
  • SimpleHapticsController: 컨트롤러에 대한 SimpleHapticsController API를 사용하면 컨트롤러의 햅틱 기능을 검사할 수 있으며 햅틱 피드백을 제어할 수도 있습니다.

터치 패드 및 엄지스틱 범위는 두 축(아래쪽에서 위쪽, 왼쪽에서 오른쪽)에 대해 -1~1입니다. SpatialInteractionSourceState::SelectPressedValue 속성을 사용하여 액세스되는 아날로그 트리거의 범위는 0에서 1까지입니다. 값 1은 IsSelectPressed가 true와 같은 상관 관계가 있습니다. 다른 값은 IsSelectPressed가 false와 같은 상관 관계가 있습니다.

관절형 손 추적

Windows Mixed Reality API는 관절식 손 추적(예: HoloLens 2)을 완전히 지원합니다. 굴절식 손 추적을 사용하여 애플리케이션에서 직접 조작 및 지점 및 커밋 입력 모델을 구현할 수 있습니다. 또한 완전히 사용자 지정 상호 작용을 작성하는 데 사용할 수 있습니다.

손 골격

관절형 손 추적은 다양한 유형의 상호 작용을 가능하게 하는 25개의 관절 골격을 제공합니다. 골격은 인덱스 / 중간 / 링 / 작은 손가락을위한 다섯 관절, 엄지 손가락에 대한 네 개의 관절, 하나의 손목 관절을 제공합니다. 손목 관절은 계층 구조의 기초 역할을합니다. 다음 그림에서는 골격의 레이아웃을 보여 줍니다.

손 골격

대부분의 경우, 각 관절은 나타내는 뼈에 따라 이름이 지정됩니다. 모든 관절에 두 개의 뼈가 있기 때문에, 우리는 그 위치에서 아이 뼈에 따라 각 관절의 이름을 지정하는 규칙을 사용합니다. 자식 뼈는 손목에서 더 멀리 뼈로 정의됩니다. 예를 들어 "인덱스 근시" 관절에는 인덱스 근위 뼈의 시작 위치와 해당 뼈의 방향이 포함됩니다. 그것은 뼈의 끝 위치를 포함하지 않습니다. 필요한 경우 계층 구조의 다음 조인트인 "인덱스 중간" 조인트에서 가져옵니다.

25 개의 계층적 관절 외에도 시스템은 손바닥 관절을 제공합니다. 손바닥은 일반적으로 골격 구조의 일부로 간주되지 않습니다. 손의 전반적인 위치와 방향을 가져오는 편리한 방법으로만 제공됩니다.

각 관절에 대해 다음 정보가 제공됩니다.

이름 Description
위치 요청된 좌표계에서 사용할 수 있는 조인트의 3D 위치입니다.
방향 요청한 좌표계에서 사용할 수 있는 뼈의 3D 방향입니다.
반지름 관절 위치에서 피부 표면까지의 거리입니다. 손가락 너비를 사용하는 직접 상호 작용 또는 시각화를 조정하는 데 유용합니다.
정확도 시스템이 이 관절의 정보에 대해 얼마나 확신하는지에 대한 힌트를 제공합니다.

SpatialInteractionSourceState의 함수를 통해 손 골격 데이터에 액세스할 수 있습니다. 함수를 TryGetHandPose라고 하며 HandPose라는 개체를 반환합니다. 소스가 관절형 손을 지원하지 않는 경우 이 함수는 null을 반환합니다. HandPose가 있으면 관심 있는 관절의 이름으로 TryGetJoint를 호출하여 현재 공동 데이터를 가져올 수 있습니다. 데이터는 JointPose 구조체로 반환됩니다. 다음 코드는 인덱스 손가락 끝의 위치를 가져옵니다. currentState 변수는 SpatialInteractionSourceState의 instance 나타냅니다.

using namespace winrt::Windows::Perception::People;
using namespace winrt::Windows::Foundation::Numerics;

auto handPose = currentState.TryGetHandPose();
if (handPose)
{
	JointPose joint;
	if (handPose.TryGetJoint(desiredCoordinateSystem, HandJointKind::IndexTip, joint))
	{
		float3 indexTipPosition = joint.Position;

		// Do something with the index tip position
	}
}

손 메시

관절형 손 추적 API를 사용하면 완전히 변형 가능한 삼각형 손 메시를 사용할 수 있습니다. 이 메시는 손 골격과 함께 실시간으로 변형할 수 있으며 시각화 및 고급 물리학 기술에 유용합니다. 손 메시에 액세스하려면 먼저 SpatialInteractionSource에서 TryCreateHandMeshObserverAsync를 호출하여 HandMeshObserver 개체를 만들어야 합니다. 이 작업은 원본당 한 번만 수행하면 되며, 일반적으로 처음으로 표시됩니다. 즉, 이 함수를 호출하여 손이 FOV에 들어갈 때마다 HandMeshObserver 개체를 만듭니다. 비동기 함수이므로 여기서 약간의 동시성을 처리해야 합니다. 사용 가능하면 GetTriangleIndices를 호출하여 HandMeshObserver 개체에 삼각형 인덱스 버퍼를 요청할 수 있습니다. 인덱스는 프레임을 통해 변경되지 않으므로 한 번 가져와서 원본의 수명 동안 캐시할 수 있습니다. 인덱스는 시계 방향으로 구불구불한 순서로 제공됩니다.

다음 코드는 분리된 std::thread를 스핀업하여 메시 관찰자를 만들고 메시 관찰자를 사용할 수 있게 되면 인덱스 버퍼를 추출합니다. 추적된 손을 나타내는 SpatialInteractionSourceState의 instance currentState라는 변수에서 시작합니다.

using namespace Windows::Perception::People;

std::thread createObserverThread([this, currentState]()
{
    HandMeshObserver newHandMeshObserver = currentState.Source().TryCreateHandMeshObserverAsync().get();
    if (newHandMeshObserver)
    {
		unsigned indexCount = newHandMeshObserver.TriangleIndexCount();
		vector<unsigned short> indices(indexCount);
		newHandMeshObserver.GetTriangleIndices(indices);

        // Save the indices and handMeshObserver for later use - and use a mutex to synchronize access if needed!
     }
});
createObserverThread.detach();

분리된 스레드를 시작하는 것은 비동기 호출을 처리하는 한 가지 옵션일 뿐입니다. 또는 C++/WinRT에서 지원하는 새로운 co_await 기능을 사용할 수 있습니다.

HandMeshObserver 개체가 있으면 해당 SpatialInteractionSource가 활성 상태인 기간 동안 개체를 유지해야 합니다. 그런 다음 각 프레임에서 GetVertexStateForPose를 호출하고 꼭짓점을 원하는 포즈를 나타내는 HandPose instance 전달하여 손을 나타내는 최신 꼭짓점 버퍼를 요청할 수 있습니다. 버퍼의 각 꼭짓점은 위치와 법선입니다. 다음은 손 메시에 대한 현재 꼭짓점 집합을 가져오는 방법의 예입니다. 이전과 마찬가지로 currentState 변수는 SpatialInteractionSourceState의 instance 나타냅니다.

using namespace winrt::Windows::Perception::People;

auto handPose = currentState.TryGetHandPose();
if (handPose)
{
    std::vector<HandMeshVertex> vertices(handMeshObserver.VertexCount());
    auto vertexState = handMeshObserver.GetVertexStateForPose(handPose);
    vertexState.GetVertices(vertices);

    auto meshTransform = vertexState.CoordinateSystem().TryGetTransformTo(desiredCoordinateSystem);
    if (meshTransform != nullptr)
    {
    	// Do something with the vertices and mesh transform, along with the indices that you saved earlier
    }
}

스켈레톤 관절과 달리 손 메시 API에서는 꼭짓점의 좌표계를 지정할 수 없습니다. 대신 HandMeshVertexState 는 꼭짓점이 제공되는 좌표계를 지정합니다. 그런 다음 TryGetTransformTo 를 호출하고 원하는 좌표계를 지정하여 메시 변환을 가져올 수 있습니다. 꼭짓점을 사용할 때마다 이 메시 변환을 사용해야 합니다. 이 방법은 특히 렌더링 목적으로만 메시를 사용하는 경우 CPU 오버헤드를 줄입니다.

응시 및 커밋 복합 제스처

응시 및 커밋 입력 모델, 특히 HoloLens(1세대)를 사용하는 애플리케이션의 경우 공간 입력 API는 'select' 이벤트 위에 빌드된 복합 제스처를 사용하도록 설정하는 데 사용할 수 있는 선택적 SpatialGestureRecognizer 를 제공합니다. SpatialInteractionManager에서 홀로그램의 SpatialGestureRecognizer로 상호 작용을 라우팅하여 앱은 누름 및 릴리스를 수동으로 처리하지 않고도 손, 음성 및 공간 입력 디바이스에서 탭, 홀드, 조작 및 탐색 이벤트를 균일하게 검색할 수 있습니다.

SpatialGestureRecognizer는 요청하는 제스처 집합 간의 최소한의 명확성만 수행합니다. 예를 들어 탭만 요청하면 사용자가 원하는 만큼 손가락을 누를 수 있으며 탭은 계속 발생합니다. 길게 누르기를 모두 요청하는 경우 손가락을 누른 후 약 1초 후에 제스처가 보류로 승격되고 탭이 더 이상 발생하지 않습니다.

SpatialGestureRecognizer를 사용하려면 SpatialInteractionManager의 InteractionDetected 이벤트를 처리하고 거기에 노출된 SpatialPointerPose를 가져옵니다. 이 포즈에서 사용자의 머리 응시 광선을 사용하여 사용자 주변의 홀로그램 및 표면 메시와 교차하여 사용자가 상호 작용할 대상을 결정합니다. 그런 다음, 이벤트 인수의 SpatialInteraction을 CaptureInteraction 메서드를 사용하여 대상 홀로그램의 SpatialGestureRecognizer로 라우팅합니다. 이렇게 하면 생성 시 해당 인식기 또는 TrySetGestureSettings에 설정된 SpatialGestureSettings 에 따라 상호 작용을 해석 하기 시작합니다.

HoloLens(1세대)에서 상호 작용 및 제스처는 손의 위치에서 렌더링하거나 상호 작용하는 대신 사용자의 머리 응시에서 대상 지정을 파생해야 합니다. 조작이 시작되면 조작 또는 탐색 제스처와 마찬가지로 손의 상대 동작을 사용하여 제스처를 제어할 수 있습니다.

추가 정보