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.

렌더러 모드

OpenXR API 디자인의 초석은 가능한 한 플랫폼에 구애받지 않는 것입니다. 이에 대한 좋은 예는 사용 중인 하드웨어에 대한 상호 작용 프로필이 없는 경우 XR 런타임이 대체할 핵심 상호 작용 프로필을 지원해야 하는 OpenXR의 작업 맵 시스템입니다. 이를 통해 OpenXR 응용 프로그램은 응용 프로그램이 출시될 당시 존재하지 않았거나 응용 프로그램 개발자도 액세스할 수 없었던 하드웨어에서 사용되는 경우에도 계속 작동합니다.

결과적으로 XR 런타임은 다른 하드웨어를 모방할 수 있으므로 애플리케이션 개발자는 어떤 하드웨어가 사용되고 있는지 확실하게 알 수 없습니다. 따라서 애플리케이션 개발자는 사용된 실제 하드웨어와 관련하여 아무 것도 표시할 수 없으며, 가장 일반적인 사용 사례는 사용자가 현재 들고 있는 컨트롤러를 표시하는 것입니다.

올바른 컨트롤러 모델을 표시하고 이러한 모델을 올바르게 배치하는 것은 적절한 몰입감을 위해 중요합니다.

OpenXR의 `렌더 모델 API <https://registry.khronos.org/OpenXR/specs/1.1/html/xrspec.html#XR_EXT_render_models>`_이 필요한 곳입니다. 이 API를 사용하면 사용 중인 물리적 하드웨어에 적합한 3D 자산에 대해 XR 런타임을 쿼리할 수 있습니다. 또한 API를 사용하면 추적 볼륨 내에서 이 하드웨어의 위치와 이 하드웨어 하위 구성 요소의 올바른 위치를 쿼리할 수 있습니다.

예를 들어, 트리거를 올바르게 배치하고 애니메이션을 적용하거나 누르고 있는 버튼을 표시할 수 있습니다.

`손 추적을 위한 컨트롤러 데이터 소스 <https://registry.khronos.org/OpenXR/specs/1.1/html/xrspec.html#XR_EXT_hand_tracking_data_source>`_를 지원하는 런타임의 경우 컨트롤러 모양에 따라 사용자의 손가락과 손의 위치를 올바르게 지정할 수도 있습니다. 이 기능은 `손 관절 동작 범위 확장 <https://registry.khronos.org/OpenXR/specs/1.1/html/xrspec.html#XR_EXT_hand_joints_motion_range>`_과 함께 작동하여 손가락이 잘리는 것을 방지합니다.

렌더러 모드

OpenXRRenderModelManager 노드는 대부분의 렌더링 모델 기능을 자동화하는 데 사용할 수 있습니다. 이 노드는 현재 XR 런타임에서 사용할 수 있는 활성 렌더 모델을 추적합니다.

각 활성 렌더 모델에 대해 자식 노드를 생성하여 해당 렌더 모델이 표시됩니다.

이 노드에는 XROrigin3D 노드가 상위 항목으로 있어야 합니다.

``tracker``가 ``Any``로 설정된 경우 노드는 현재 추적 중인 모든 렌더 모델을 표시합니다. 이 시나리오에서 이 노드는 XROrigin3D 노드의 직계 하위 항목이어야 합니다.

``tracker``가 ``None set``로 설정된 경우 노드는 추적기가 식별되지 않은 렌더 모델만 표시합니다. 이 시나리오에서 이 노드는 XROrigin3D 노드의 직계 하위 항목이기도 해야 합니다.

tracker``가 ``Left Hand 또는 ``Right Hand``로 설정된 경우 노드는 각각 왼손 또는 오른손과 관련된 렌더 모델만 표시합니다. 이 시나리오에서는 노드를 씬 트리의 더 깊은 곳에 배치할 수 있습니다.

경고

대부분의 XR 런타임에서 이는 렌더링 모델이 실제로 사용자가 보유하고 있는 컨트롤러를 나타냄을 의미하지만 이것이 보장되는 것은 아닙니다. 일부 XR 런타임은 컨트롤러가 현재 잡혀 있지 않지만 추적되고 있는 경우에도 항상 추적기를 왼쪽 또는 오른쪽으로 설정합니다. 원치 않는 동작이 발생할 수 있으므로 항상 테스트해야 합니다.

이 시나리오에서는 make_local_to_pose 속성을 포즈 액션으로 설정하여 액션 맵의 포즈에 대한 액션을 지정할 수도 있습니다. 동일한 포즈를 사용하는 XRController3D 노드와 함께 이것을 사용하면 이제 컨트롤러와 관련 렌더 모델 모두의 추적된 위치에서 벗어날 수 있는 레이어를 추가할 수 있습니다(아래 예 참조).

참고

위의 내용을 손 추적과 결합하면 손 추적이 동작 맵 시스템과 완전히 독립적이라는 문제가 발생합니다. 렌더링 모델을 적절하게 오프셋하려면 손 추적 및 컨트롤러 추적 포즈를 결합해야 합니다.

Godot 문서는 무엇입니까

렌더 모델 관리자 예

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

../../_images/openxr_render_models_setup.webp

이 설정에서는 XROrigin3D 노드 바로 아래에 OpenXRRenderModelManager 노드가 있습니다. 이 노드에서 target 속성은 ``None set``로 설정되었으며 현재 왼쪽 또는 오른쪽 컨트롤러와 관련되지 않은 모든 렌더 모델 표시를 처리합니다.

그런 다음 왼손과 오른손에 동일한 설정이 표시되므로 왼손에만 집중하겠습니다.

우리 손의 위치를 추적하는 :ref:`XRController3D<class_XRController3D>`가 있습니다.

참고

이 예에서는 grip 포즈를 사용하고 있습니다. palm 포즈는 틀림없이 더 적합하고 예측 가능하지만 모든 XR 런타임에서 지원되지는 않습니다. 지원되는 항목에 따라 이러한 포즈 간 전환에 대한 솔루션은 손 추적 데모 프로젝트를 참조하세요.

노드의 하위 요소로서 우리는 손의 추적된 위치를 따르는 AnimatableBody3D 노드를 가지고 있습니다. 하지만 플레이어의 손이 벽 등을 통과하는 것을 막기 위해 물리 개체와 상호 작용합니다. 이 노드에는 손을 캡슐화하는 충돌 모양이 있습니다.

참고

이 논리가 XROrigin3D 노드를 이동하는 물리 논리 이후에 실행되도록 물리 우선 순위를 설정하는 것이 중요합니다. 그렇지 않으면 손이 프레임 뒤처지게 됩니다.

아래의 스크립트는 이를 기반으로 구축할 수 있는 기본 구현을 보여줍니다.

class_name CollisionHands3D
extends AnimatableBody3D

func _ready():
    # Make sure these are set correctly.
    top_level = true
    sync_to_physics = false
    process_physics_priority = -90

func _physics_process(_delta):
    # Follow our parent node around.
    var dest_transform = get_parent().global_transform

    # We just apply rotation for this example.
    global_basis = dest_transform.basis

    # Attempt to move to where our tracked hand is.
    move_and_collide(dest_transform.origin - global_position)

마지막으로 또 다른 OpenXRRenderModelManager 노드가 표시됩니다. 이 ``target``는 적절한 손으로 설정되고 ``make_local_to_pose``는 올바른 포즈로 설정됩니다. 이렇게 하면 충돌 처리기가 위치를 변경한 경우 이 손과 관련된 렌더링 모델이 올바르게 표시되고 오프셋됩니다.

렌더러 모드

OpenXRRenderModel 노드는 렌더링 모델 API에서 제공하는 지정된 렌더링 모델을 표시하고 배치하는 모든 논리를 구현합니다.

이 노드의 인스턴스는 위에서 사용한 렌더 모델 관리자 노드에 의해 추가되지만 원하는 경우 직접 상호 작용할 수 있습니다.

Godot가 새로운 렌더링 모델에 대한 정보를 얻을 때마다 해당 렌더링 모델을 참조하기 위해 RID가 생성됩니다.

이 노드의 render_model 속성에 해당 RID를 할당하면 노드는 렌더링 모델 표시를 시작하고 렌더링 모델을 올바른 위치에 배치하고 모든 하위 개체에 애니메이션을 적용하는 변환을 모두 관리합니다.

get_top_level_path 함수는 이 렌더링 모델과 관련된 최상위 경로를 반환합니다. 이것은 왼손이나 오른손을 가리킬 것입니다. 사용자가 집거나 내려놓는 여부에 따라 최상위 경로가 설정되거나 지워질 수 있으므로 컨트롤러를 render_model_top_level_path_changes 시그널에 연결하고 이러한 변경 사항에 대응할 수 있습니다.

OpenXRRenderModelManager 노드 설정에 따라 렌더링 모델은 최상위 경로 변경에 따라 제거되거나 추가됩니다.

백그라운드 처리

위에서 자세히 설명한 노드는 모든 디스플레이 로직을 처리하지만 이를 직접 구동하는 데이터와 상호 작용하고 고유한 구현을 만드는 것도 가능합니다.

이를 위해 OpenXRRenderModelExtension 싱글톤에 액세스할 수 있습니다.

또한 이 개체를 사용하면 이 개체에 대해 is_active 함수를 호출하여 현재 사용 중인 장치에서 렌더링 모델이 지원되고 활성화되는지 여부를 쿼리할 수 있습니다.

내장된 로직은 작업 맵에 있는 컨트롤러 및 유사한 장치와 관련된 모든 렌더링 모델을 나열하는 `상호작용 렌더링 모델 API <https://registry.khronos.org/OpenXR/specs/1.1/html/xrspec.html#XR_EXT_interaction_render_model>`_를 구현합니다. 이 API를 통해 노출되는 렌더링 모델 엔터티를 자동으로 생성하고 제거합니다.

다른 확장 기능을 사용할 수 있게 되면 GDExtension 플러그인에서 구현할 수 있습니다. 이러한 플러그인은 render_model_create``render_model_destroy``를 호출하여 핵심 렌더링 모델 API를 통해 해당 렌더링 모델에 대한 액세스를 제공하는 객체를 생성할 수 있습니다.

이 논리 외부에서 렌더링 모델을 삭제하면 안 됩니다.

render_model_addedrender_model_removed 시그널에 연결하면 새 렌더 모델이 추가되거나 제거될 때 알림을 받을 수 있습니다.

이 API를 사용하기 위한 핵심 방법은 다음과 같습니다.

모델 렌더링 확장 기능

함수

설명

render_model_get_all

추적 중인 모든 렌더링 모델에 대한 RID 배열을 제공합니다.

노드와 리소스

렌더링 모델을 표시하는 데 필요한 모든 메시가 포함된 새로운 씬을 제공합니다.

render_model_get_subaction_paths

이 렌더링 모드와 관련된 작업 맵의 하위 작업 경로 목록을 제공합니다.

render_model_get_top_level_path

이 렌더링 모델(있는 경우)과 관련된 최상위 경로를 반환합니다. 이러한 변화에 대응하려면 render_model_top_level_path_changed 시그널를 사용하세요.

render_model_get_confidence

이 렌더링 모델에 대한 추적 데이터에 대한 추적 신뢰도를 반환합니다.

render_model_get_root_transform

현재 참조 공간 내에서 이 렌더링 모델의 루트 변환을 반환합니다. 이는 렌더링 모델을 공간에 배치하는 데 사용할 수 있습니다.

render_model_get_animatable_node_count

애니메이션할 수 있는 렌더링 모델 씬에서 노드 수를 반환합니다.

render_model_get_animatable_node_name

애니메이션할 수 있는 노드의 이름을 반환합니다. 이 노드는 씬 내에서 여러 레벨이 될 수 있습니다.

render_model_is_animatable_node_visible

이 애니메이션 가능한 노드가 표시되어야 하는 경우 true를 반환합니다.

render_model_get_animatable_node_transform

이 애니메이션 가능한 노드에 대한 변환을 반환합니다. 이는 직접 적용할 수 있는 로컬 변환입니다.