Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

노드와 전문 용어(Nodes and terminology)

소개

참고

이 페이지에서는 특히 OpenXR을 통해 공개되는 기능 세트에 중점을 둡니다. 여기에 제시된 기능 중 일부는 WebXR에도 적용되며 다른 XR 인터페이스에서 제공될 수도 있습니다.

핸드 트래킹에 대해 논의할 때 선이 그려지는 위치에 대한 의견 차이가 있다는 것을 아는 것이 중요합니다. 이에 대한 실질적인 결과는 서로 다른 OpenXR 런타임 간에 구현에 차이가 있다는 것입니다. 선택한 하드웨어가 퍼즐 조각을 지원하지 않거나 추가 작업이 필요한 다른 플랫폼과 다르게 작업을 수행하는 위치에 있을 수 있습니다.

즉, OpenXR 사양의 최근 개선 사항은 이러한 격차를 해소하고 있으며 플랫폼이 이러한 개선 사항을 구현함에 따라 플랫폼 간 완전한 이식성을 가지거나 최소한 플랫폼의 기능을 감지할 수 있는 명확한 방법을 갖춘 미래에 점점 더 가까워지고 있습니다.

VR 초기를 살펴보면 주요 플랫폼의 초점은 추적된 컨트롤러 기반 입력에 있었습니다. 여기서는 추가 입력을 위한 버튼도 있는 물리적 장치를 추적하고 있습니다. 추적 데이터를 통해 플레이어의 손 위치를 추론할 수 있지만 더 이상 알려진 정보는 없습니다. 전통적으로 버튼을 누르거나 근접 센서를 통해 컨트롤러의 추가 입력을 기반으로 플레이어의 손을 표시하고 손가락에 애니메이션을 적용하는 메커니즘을 구현하는 것은 게임의 몫이었습니다. 상황, 사용자가 들고 있는 것, 사용자가 수행하는 작업에 따라 손가락이 배치되는 경우도 많습니다.

최근에는 카메라가 사용자의 손을 추적하고 손과 손가락 위치에 대한 전체 추적 데이터를 사용할 수 있는 광학 손 추적이 인기 있는 솔루션이 되었습니다. 많은 공급업체에서는 이를 컨트롤러 추적과 완전히 분리된 것으로 보고 손과 손가락 위치 및 방향 데이터에 액세스하기 위한 독립적인 API를 도입했습니다. 입력을 처리할 때 제스처 감지 메커니즘을 구현하는 것은 게임 개발자의 몫이었습니다.

이러한 분할은 OpenXR에도 존재합니다. 여기서 컨트롤러 추적은 주로 동작 맵 시스템에 의해 처리되고 광학 손 추적은 주로 손 추적 API 확장에 의해 처리됩니다.

그러나 세상은 그렇게 흑백이 아니며 우리는 선을 넘는 여러 시나리오를 보고 있습니다.

  • 추적 장갑, 손가락 추적도 수행하는 인덱스 컨트롤러와 같은 컨트롤러 등 두 범주에 모두 적합한 장치입니다.

  • 여러 컨트롤러의 적절한 손가락 배치를 해결하기 위한 수단으로 컨트롤러 데이터에서 추론된 손 추적을 구현하는 XR 런타임입니다.

  • 컨트롤러와 핸드 트래킹 사이를 원활하게 전환하여 사용된 접근 방식에 관계없이 동일한 사용자 경험을 제공하려는 XR 애플리케이션입니다.

OpenXR은 XR 런타임/하드웨어의 기능을 쿼리할 수 있게 하거나 이러한 구분에 더 많은 기능을 추가할 수 있는 추가 확장 기능을 도입하여 이 요청에 응답하고 있습니다. 현재 남아 있는 문제는 이러한 확장을 채택하는 데 격차가 있어 일부 플랫폼이 기능을 완전히 보고하지 않는다는 것입니다. 따라서 특정 하드웨어에서 사용할 수 있는 기능을 테스트하고 이에 따라 접근 방식을 조정해야 할 수도 있습니다.

내적

이 문서 외에 여러가지 Godot 데모 프로젝트들도 살펴보면 좋습니다.

굽기

소개에서 언급했듯이 손 추적 API는 주로 광학 손 추적과 함께 사용되며 많은 플랫폼에서는 사용자가 컨트롤러를 잡고 있지 않을 때만 작동합니다. 일부 플랫폼은 컨트롤러 추론 손 추적을 지원합니다. 즉, 사용자가 컨트롤러를 잡고 있어도 손 추적 데이터를 얻을 수 있습니다. 여기에는 SteamVR, Meta Quest(현재는 기본으로만 제공되지만 메타 링크 지원이 예정되어 있음) 및 조만간 다른 기능도 포함됩니다.

Godot의 손 추적 구현은 Godot Humanoid Skeleton을 중심으로 표준화되었으며 OpenXR과 WebXR 모두에서 작동합니다. 따라서 아래 지침은 두 환경 모두에서 작동합니다.

OpenXR에서 손 추적 API를 사용하려면 먼저 활성화해야 합니다. 이는 프로젝트 설정에서 수행할 수 있습니다:

../../_images/xr_enable_handtracking.webp

일부 독립형 XR 장치의 경우 Meta Quest와 같이 내보내기 설정에서 손 추적 확장도 구성해야 합니다.

../../_images/openxr_enable_hand_tracking_meta.webp

이제 각 손에 대해 씬에 3개의 구성 요소를 추가해야 합니다.

  • 손 위치를 지정하는 추적된 노드입니다.

  • 뼈대가 있는 적절하게 스킨 처리된 손 메시입니다.

  • 뼈대에 손가락 추적 데이터를 적용하는 뼈대 수정자입니다.

../../_images/openxr_hand_tracking_nodes.webp

굽기

손 추적 시스템은 별도의 손 추적기를 사용하여 추적 공간 내에서 플레이어 손의 위치를 추적합니다.

다음과 같은 주의 사항이 있습니다:

  • 추적은 XROrigin3D 노드의 로컬 공간에서 발생합니다. 이 노드가 올바르게 배치되려면 XROrigin3D 노드의 하위 항목이어야 합니다.

  • 이 노드는 별도의 손 메시 대신 팔이 있는 상체 메시를 사용할 때 IK 대상으로 사용할 수 있습니다.

  • 손의 실제 배치는 아바타 생성 UI, 가짜 거울 또는 유사한 상황과 같은 시나리오에서 추적에 느슨하게 바인딩되어 손 메시와 손가락 추적이 다른 곳에 국한될 수 있습니다.

우리는 첫 번째 사용 사례에만 집중할 것입니다.

이를 위해서는 XROrigin3D 노드에 XRNode3D 노드를 추가해야 합니다.

  • 이 노드에서 tracker``는 왼손 또는 오른손에 대해 각각 ``/user/hand_tracker/left 또는 ``/user/hand_tracker/right``로 설정되어야 합니다.

  • ``pose``는 ``default``로 설정된 상태로 유지되어야 하며 여기서는 다른 옵션이 작동하지 않습니다.

  • Show When Tracked 확인란을 선택하면 추적 데이터가 없으면 이 노드가 자동으로 숨겨지고, 추적 데이터가 있으면 이 노드가 표시됩니다.

라이트 베이킹

손을 표시하려면 적절하게 리깅되고 스킨 처리된 손 메시가 필요합니다. 이를 위해 Godot는 :ref:`Godot Humanoid <class_skeletonprofilehumanoid>`에 정의된 손 뼈 구조를 사용하지만 선택적으로 각 손가락에 추가 팁 뼈를 지원합니다.

이 문서 외에 여러가지 Godot 데모 프로젝트들도 살펴보면 좋습니다.

여기서는 이를 사용하여 XRNode3D 노드의 하위 항목으로 추가합니다. 또한 Skeleton3D 노드에 액세스하려면 편집 가능한 자식 노드를 활성화해야 합니다.

뼈대 완성하기

마지막으로 XRHandModifier3D 노드를 Skeleton3D 노드의 자식으로 추가해야 합니다. 이 노드는 OpenXR에서 손가락 추적 데이터를 가져와 손 모델에 적용합니다.

왼손 또는 오른손 각각의 추적 데이터를 적용할지 여부에 따라 Hand Tracker 속성을 /user/hand_tracker/left 또는 ``/user/hand_tracker/right``로 설정해야 합니다.

이 노드에서 Bone Update 모드를 설정할 수도 있습니다.

  • ``Full``는 손 추적 데이터를 완전히 적용합니다. 이는 골격 위치가 잠재적으로 사용자의 실제 손 크기를 반영한다는 것을 의미합니다. 이를 설명하기 위해 메쉬에 가중치를 제대로 부여하지 않으면 스크런칭 효과가 발생할 수 있습니다. 광학 손 추적을 사용할 때는 모든 규모의 플레이어를 대상으로 게임을 테스트하십시오!

  • ``Rotation Only``는 손 뼈에만 회전을 적용하고 뼈 길이를 그대로 유지합니다. 이 모드에서는 손 메시의 크기가 변경되지 않습니다.

이를 추가하면 프로젝트를 실행할 때 손 추적이 지원되면 손이 올바르게 표시되는 것을 볼 수 있습니다.

노드와 전문 용어(Nodes and terminology)

이는 손 추적 데이터의 소스에 대한 정보를 제공하는 OpenXR 확장입니다. 현재로서는 소수의 런타임만이 이를 구현하지만, 사용 가능하다면 Godot는 이를 활성화할 것입니다.

이 확장이 지원되지 않아 알 수 없음이 반환되는 경우 다음과 같이 가정할 수 있습니다.

  • SteamVR(Steam 링크 포함)을 사용하는 경우 컨트롤러 기반 핸드 트래킹만 지원됩니다.

  • 다른 런타임의 경우 손 추적이 지원되면 광학 손 추적만 지원됩니다(참고, Meta Link는 현재 이 범주에 속함).

  • 다른 모든 경우에는 손 추적이 전혀 지원되지 않습니다.

코드를 통해 이 정보에 액세스할 수 있습니다.

var hand_tracker : XRHandTracker = XRServer.get_tracker('/user/hand_tracker/left')
if hand_tracker:
    if hand_tracker.has_tracking_data:
        if hand_tracker.hand_tracking_source == XRHandTracker.HAND_TRACKING_SOURCE_UNKNOWN:
            print("Hand tracking source unknown")
        elif hand_tracker.hand_tracking_source == XRHandTracker.HAND_TRACKING_SOURCE_UNOBSTRUCTED:
            print("Hand tracking source is optical hand tracking")
        elif hand_tracker.hand_tracking_source == XRHandTracker.HAND_TRACKING_SOURCE_CONTROLLER:
            print("Hand tracking data is inferred from controller data")
        else:
            print("Unknown hand tracking source ", hand_tracker.hand_tracking_source)
    else:
        print("Hand is currently not being tracked")
else:
    print("No hand tracker registered")

오른손에 대해서도 같은 작업을 반복합니다.

이 예에서 ``get_tracker``가 핸드 트래커를 반환하지 않으면 이는 핸드 트래킹 API가 XR 런타임에서 전혀 지원되지 않음을 의미합니다.

추적기가 있지만 `has_tracking_data`가 false인 경우 사용자의 손이 현재 추적되고 있지 않은 것입니다. 이는 다음 이유 중 하나로 인해 발생할 수 있습니다.

  • 헤드셋의 추적 카메라에서는 플레이어의 손이 보이지 않습니다.

  • 플레이어는 현재 컨트롤러를 사용하고 있으며 헤드셋은 광학 손 추적만 지원합니다.

  • 컨트롤러가 꺼지고 컨트롤러 핸드 트래킹만 지원됩니다.

시그널 다루기

컨트롤러를 사용하는 경우 사용자가 수행한 작업에 대한 반응은 :ref:`doc_xr_action_map`를 통해 처리됩니다. 액션 맵에서는 컨트롤러의 트리거나 조이스틱과 같은 다양한 입력을 액션에 매핑할 수 있습니다. 그러면 게임에서 논리를 구동할 수 있습니다.

손 추적을 사용할 때 원래는 그러한 입력이 없었습니다. 입력은 주먹을 쥐거나 엄지손가락과 집게손가락을 모아서 무언가를 선택하는 등 사용자가 수행하는 제스처에 의해 구동됩니다. 이를 구현하는 것은 게임 개발자의 몫이었습니다.

컨트롤러와 손 추적 사이를 원활하게 전환할 수 있는 애플리케이션에 대한 수요가 증가하고 기본 입력 기능이 필요하다는 점을 인식하여 몇 가지 기본적인 제스처 인식을 제공하고 동작 맵과 함께 사용할 수 있는 여러 확장 기능이 사양에 추가되었습니다.

애니메이션 패널

`손 상호 작용 프로필 확장 <https://github.khronos.org/OpenXR-Inventory/extension_support.html#XR_EXT_hand_interaction>`_은 집기, 잡기, 찌르기 제스처 및 관련 포즈를 지원하는 새로운 핵심 확장입니다. 이 확장에 대한 지원은 아직 제한적이지만 가까운 시일 내에 더 많은 런타임에서 사용할 수 있게 될 것입니다.

../../_images/openxr_hand_interaction_profile.webp

집기 동작은 엄지손가락과 집게손가락을 함께 집으면 실행됩니다. 이는 컨트롤러를 사용하여 개체를 가리키고 트리거를 눌러 선택하는 것과 유사하게 메뉴 시스템의 선택 제스처로 자주 사용되므로 종종 그렇게 매핑됩니다.

  • ``pinch pose``는 엄지손가락 끝과 검지 끝 사이의 중간에 위치하며 광선 투사를 통해 대상을 식별할 수 있는 방향으로 배치된 포즈입니다.

  • pinch 부동 소수점 입력은 0.0(엄지손가락 끝과 검지 끝이 떨어져 있음)과 1.0(엄지 손가락 끝과 검지 끝이 닿음) 사이의 값입니다.

  • pinch ready 입력은 손가락 끝이 닿을 때 참입니다.

잡기 동작은 주먹을 쥐는 동작으로 시작되며 컨트롤러에서 쥐기 입력을 실행하는 것과 유사하게 항목을 집는 데 자주 사용됩니다.

  • grasp 플로트 입력은 0.0(펼친 손)과 1.0(주먹) 사이의 값입니다.

  • grasp ready 입력은 사용자가 주먹을 쥔 경우 참입니다.

찌르기 동작은 검지 손가락을 뻗으면 실행됩니다. 검지 끝의 포즈는 상호작용 가능한 개체를 찌르는 데 자주 사용되기 때문에 약간의 예외입니다. ``poke pose``는 검지 끝에 위치하는 포즈입니다.

마지막으로 aim activate (ready) 입력은 검지 손가락을 펴고 활성화할 수 있는 대상을 가리킬 때 1.0/true인 입력으로 정의됩니다. 런타임이 이를 어떻게 해석하는지는 명확하지 않습니다.

이 설정을 사용하면 일반 left_handright_hand 추적기가 사용되므로 컨트롤러와 수동 추적 입력 간에 원활하게 전환할 수 있습니다.

참고

OpenXR 프로젝트 설정에서 손 상호 작용 프로필 확장을 활성화해야 합니다.

Microsoft 손 상호작용 프로필

`Microsoft 손 상호 작용 프로필 확장 <https://github.khronos.org/OpenXR-Inventory/extension_support.html#XR_MSFT_hand_interaction>`_은 Microsoft에서 도입되었으며 간단한 컨트롤러 프로필을 대략적으로 모방합니다. Meta는 또한 이 확장에 대한 지원을 추가했지만 기본 OpenXR 클라이언트에서만 현재 Meta Link를 통해 사용할 수 없습니다.

../../_images/openxr_msft_hand_interaction_profile.webp

핀치 지원은 select 입력을 통해 노출되며, 그 값은 엄지와 검지 끝이 떨어져 있는 경우 0.0, 함께 있는 경우 1.0입니다.

이 프로필에서 ``aim pose``는 광선 투사를 사용하여 대상을 식별할 수 있도록 방향이 지정된 엄지손가락과 집게손가락 사이의 포즈로 재정의됩니다.

쥐기 지지대는 squeeze 입력을 통해 노출되며, 그 값은 손을 펼쳤을 때 0.0, 주먹을 쥐었을 때 1.0입니다.

이 설정을 사용하면 일반 left_handright_hand 추적기가 사용되므로 컨트롤러와 수동 추적 입력 간에 원활하게 전환할 수 있습니다.

HTC 손 상호작용 프로필

`HTC 손 상호 작용 프로필 확장 <https://github.khronos.org/OpenXR-Inventory/extension_support.html#XR_HTC_hand_interaction>`_은 HTC에서 도입되었으며 Microsoft 확장과 유사하게 정의됩니다. 이는 Focus 3 및 Elite XR 헤드셋에 대해서만 HTC에서 지원됩니다.

../../_images/openxr_htc_hand_interaction_profile.webp

제스처 지원에 대해서는 Microsoft 손 상호 작용 프로필을 참조하세요.

결정적인 차이점은 이 확장 프로그램에 /user/hand_htc/left``/user/hand_htc/right``라는 두 개의 새로운 추적기가 도입된다는 것입니다. 즉, 사용자가 컨트롤러를 내려놓거나 집어들 때 기본 추적기와 HTC 특정 추적기 사이를 전환하려면 추가 논리를 구현해야 합니다.

간단한 컨트롤러 프로필

단순 컨트롤러 프로파일은 프로파일이 존재하지 않는 컨트롤러를 사용할 때 대체 프로파일로 정의된 표준 코어 프로파일입니다.

수동 추적을 사용할 때 간단한 컨트롤러 프로필을 통해 컨트롤러를 모방하는 OpenXR 런타임이 많이 있습니다.

불행하게도 알 수 없는 컨트롤러가 사용되는지 또는 핸드 트래킹이 이 프로필을 통해 컨트롤러를 에뮬레이트하는지 여부를 확인할 수 있는 확실한 방법이 없습니다.

../../_images/openxr_simple_controller_hand.webp

XR 런타임은 간단한 컨트롤러 프로필이 작동하는 방식을 자유롭게 정의할 수 있으므로 이 프로필이 제스처에 매핑되는 방식에 대한 확실성도 없습니다.

가장 일반적인 매핑은 사용자의 손바닥이 사용자의 반대쪽을 향하고 있는 동안 엄지손가락과 집게손가락 끝이 닿을 때 ``select click``가 true인 것으로 보입니다. ``menu click``는 사용자의 손바닥이 사용자를 향하고 있는 동안 엄지손가락과 집게손가락 끝이 닿으면 true가 됩니다.

이 설정을 사용하면 일반 left_handright_hand 추적기가 사용되므로 컨트롤러와 수동 추적 입력 간에 원활하게 전환할 수 있습니다.

참고

이러한 상호 작용 프로필 중 일부는 중복되므로 각 프로필을 작업 맵에 추가할 수 있으며 XR 런타임이 가장 적합한 프로필을 선택한다는 점을 아는 것이 중요합니다.

예를 들어 Meta Quest는 Microsoft 손 상호 작용 프로필과 간단한 컨트롤러 프로필을 모두 지원합니다. 둘 다 지정되면 Microsoft 손 상호 작용 프로필이 우선적으로 적용되어 사용됩니다.

Meta가 핵심 손 상호 작용 프로필 확장을 지원하면 해당 프로필이 Microsoft 및 단순 컨트롤러 프로필보다 우선할 것으로 예상됩니다.

제스처 기반 입력

손 추적을 사용할 때 플랫폼이 상호 작용 프로필을 지원하지 않거나 더 복잡한 제스처 지원이 필요한 애플리케이션을 구축하는 경우 자체 제스처 인식 시스템을 구축해야 합니다.

각 손에 대한 XRHandTracker 리소스를 통해 전체 손 추적 데이터를 얻을 수 있습니다. XRServer.get_tracker``를 호출하고 ``/user/hand_tracker/left 또는 ``/user/hand_tracker/left``를 추적기로 사용하여 핸드 추적기를 얻을 수 있습니다. 이 리소스는 해당 손에 대한 모든 관절 정보에 대한 액세스를 제공합니다.

전체 동작 인식 알고리즘을 자세히 설명하는 것은 이 설명서의 범위를 벗어나지만 살펴볼 수 있는 여러 커뮤니티 프로젝트가 있습니다.