This document is about: FUSION 2
SWITCH TO

레거시 Meta OVR 손 동기화

Topology
SHARED AUTHORITY
Fusion Industries 프로토타이핑 애드온

이 애드온은 Meta의 OVR 손 상태(손가락 추적 포함)를 어떻게 동기화할 수 있는지를 보여줍니다.

손은 다음의 두 가지 방식 중 하나로 표시됩니다:

  • 컨트롤러로부터 받은 데이터 기반
  • 손가락 추적 데이터 기반

손가락 추적 데이터를 사용하는 경우, 이 애드온은 손 뼈 데이터(bone data)를 고도로 압축하여 네트워크 대역폭 사용을 줄이는 방법을 보여줍니다.

Meta OVR 손 동기화

Meta XR SDK

다른 샘플에서 사용된 OpenXR 플러그인 대신, 여기서는 Oculus XR 플러그인을 사용합니다.
혼합 현실 패스스루(MR Passthrough) 및 공유 공간 앵커를 활성화하기 위해 Meta XR Core SDK가 필요하므로 권장됩니다.

Meta XR SDK는 다음의 스코프 레지스트리에서 추가됩니다:
https://npm.developer.oculus.com/
자세한 내용은 Meta 공식 문서를 참고하세요.

Meta 레지스트리에서 설치되는 주요 패키지:

  • Meta XR Core SDK: MR 패스스루, 공유 앵커 지원, 손가락 추적 API 제공
  • Meta XR Platform SDK: Oculus 사용자 ID 접근 지원 (이 애드온에는 필수 아님)

Oculus 리그 및 빌딩 블록

OpenXR 대신 Oculus XR 플러그인을 기반으로 하기 때문에, 헤드셋 및 손의 위치, 입력, 손가락 추적 정보를 캡처할 수 있는 전용 리그가 필요합니다.

이 하드웨어 리그는 Meta의 Building Blocks를 통해 생성되었습니다.

  • 기본 빌딩 블록 프리팹은 /Prefabs/Rig/BaseBuildingBlocks/[BuildingBlock] BaseRig 경로에 위치합니다.
  • 동기화 컴포넌트가 추가된 실제 사용 프리팹은 /Prefabs/Rig/[BuildingBlock] HardwareRig 경로에 있습니다.
Meta 빌딩 블록 기반 리그

그 후, VR 공유 페이지HardwareRigHardwareHand와 동일한 컴포넌트를 사용해 위치 동기화를 수행합니다.

손가락 추적 또는 컨트롤러 기반 손 표현을 전환하기 위한 전용 컴포넌트도 추가되었습니다(아래 참고).

손동작 로직 개요

이 애드온은 컨트롤러 기반 손 모델과 손가락 추적 손 모델을 함께 지원하며, 두 방식 간 원활한 전환을 목표로 합니다.

구현 방식:

  • 컨트롤러가 사용될 경우, Oculus 샘플 프레임워크의 손 모델이 표시됩니다.
  • 손가락 추적 시, 로컬 사용자는 OVRHand(Meta XR Core SDK), OVRSkeleton, OVRMesh, OVRMeshRenderer를 통해 손 뼈 구조와 스킨 메시를 구성합니다.
    자세한 구성은 Meta의 Hand Tracking 설정 문서 참조.
  • 원격 사용자에게는 RemoteOVRHand가 손 뼈 위치 데이터를 받아 RemoteOVRSkeleton, RemoteOVRMesh, RemoteOVRMeshRenderer로 손을 재구성합니다.
  • 여러 손 상태는 링 버퍼(ring buffer)에 저장되며, 각 Render() 프레임마다 일정 지연 시간 기준으로 두 상태 사이를 보간하여 부드러운 회전을 표시합니다.
Hand logic overview
Hand RemoteHand logic

노트:
OVRSkeleton, OVRMesh, OVRMeshRenderer는 에디터 환경에서 원격 사용자에게 완벽하게 작동하지 않을 수 있습니다. 관련 이슈 링크

이를 우회하기 위해 RemoteOVRSkeleton, RemoteOVRMesh, RemoteOVRMeshRenderer 버전을 사용합니다.
필요시 원본 컴포넌트로 교체해도 무방합니다.

Meta 패키지 업데이트로 인해 해당 클래스들이 새로운 코드 베이스와 호환되지 않게 될 경우, 원본 컴포넌트로 안전하게 교체하여 사용해도 문제없습니다.

로컬 하드웨어 리그 손 컴포넌트

Local hardware rig hand components

로컬 사용자 네트워크 리그에 있는 RemoteOVRHand 컴포넌트는 HardwareOVRHandCollecter를 통해 로컬 손 상태를 수집한 뒤, 해당 정보를 FixedUpdateNetwork 주기 내에서 네트워크 변수에 저장합니다.

원격 사용자의 경우, 이 데이터를 파싱 하여 로컬 손 상태를 재구성하며, 해당 상태는 뼈대 변형 및 손 메시 상태를 처리하는 RemoteOVRSkeleton, RemoteOVRMesh, RemoteOVRMeshRenderer 컴포넌트에서 사용됩니다.

동기화된 손 상태에는 특히 IsDataValid 값이 포함되며, 이 값이 true이면 손가락 추적이 사용 중임을, false이면 그렇지 않음을 의미합니다. 뼈 정보도 함께 포함됩니다.

네트워크 리그 손 컴포넌트

RemoteOVRHand

RemoteOVRHand는 로컬의 HardwareOVRHandCollecter에서 손 데이터를 가져와 FixedUpdateNetwork에서 네트워크 변수에 저장합니다.
원격 사용자에게는 이 데이터를 기반으로 손 뼈 정보를 복원하여 RemoteOVRSkeleton, RemoteOVRMesh, RemoteOVRMeshRenderer에 제공합니다.

네트워크 동기화된 손 데이터에는 IsDataValid 값도 포함되어 있으며, 이는 손가락 추적 사용 여부를 나타냅니다.

대역폭 최적화

뼈대 정보는 전송 비용이 상당히 높은 편입니다. 손 상태에는 총 24개의 쿼터니언(quaternion)이 포함되어 있으며, 단순한 동기화 방식은 모든 쿼터니언을 그대로 전송하기 때문에 대역폭 최적화를 전혀 고려하지 않지만, 기본적인 동작에는 문제가 없습니다. 이 방식은 RemoteOVRHand의 대체 버전인 UncompressedRemoteOVRHand를 통해 테스트할 수 있습니다.

실제 RemoteOVRHand 구현은 손 뼈의 특성(회전 축의 제한, 동작 범위 제한 등)을 활용하여 필요한 대역폭을 줄입니다.
각 뼈대에 대해 원하는 정밀도는 HandSynchronizationScriptable이라는 전용 스크립터블 오브젝트에서 지정할 수 있으며, 이 오브젝트는 HardwareOVRHandCollecterRemoteOVRHand 모두에 제공되어야 합니다.

이 애드온에는 기본 제공 설정인 HandSynchronizationConfigForCompressedMetaOVRHands가 포함되어 있으며, 이는 대부분의 요구 사항을 충족하도록 설계되었습니다:

  • 매우 높은 압축률을 제공하며, 전체 손 뼈 회전 데이터를 386바이트 대신 18바이트로 저장하여 약 20배의 전송량 절감을 실현합니다.
    전체 쿼터니언을 전송하는 방식은 HandSynchronizationConfigForMetaOVRHands 스크립터블로 테스트할 수 있습니다.
  • 이러한 압축이 원격 사용자의 손가락 표현 품질에 눈에 띄는 영향을 주지 않습니다.

보간 처리

RemoteOVRHands에서는 각 Render 시점에 ParseNetworkData()를 통해 네트워크 데이터에 변경이 감지되면, 해당 데이터를 압축된 손 상태로 변환한 뒤, 실제 손 뼈 애니메이션에 사용할 수 있는 손 상태로 다시 변환합니다.

이 손 상태는 삽입 시점과 함께 타임드 링 버퍼(timed ring buffer)에 저장됩니다.

그 후 각 Render 프레임에서 InterpolateBonesRotations 함수가 호출되어, 지정된 과거 시간 지점 기준으로 링 버퍼에 저장된 두 개의 손 상태 사이를 보간(interpolation)하여 최종 뼈 회전 상태를 계산합니다.

이 방식 덕분에 틱(tick) 수신 간의 간격에서도 손 뼈 회전이 자연스럽고 매끄럽게 이어지며, 부드러운 손가락 움직임을 구현할 수 있습니다.

손 모델 전환 처리

OVRHandRepresentationManager 컴포넌트는 현재 사용 중인 손 추적 모드에 따라 어떤 손 메시(mesh)를 표시할지를 제어합니다:

  • 컨트롤러 추적이 사용 중일 경우: Oculus Sample Framework의 손 메시 사용
  • 손가락 추적이 사용 중일 경우: OVRSkeleton 컴포넌트의 애니메이션 로직을 기반으로 한 손 뼈대 메시 사용

또한, 아바타의 피부색에 따라 손의 색상이 정확하게 반영되도록 합니다.
이 기능은 Avatar 애드온이 제공하는 IAvatarRepresentationListener 인터페이스를 구현함으로써 이루어집니다.

이 스크립트는 두 가지 버전이 존재합니다:

로컬 하드웨어 손: 손 뼈대 애니메이션, 충돌체 위치 조정, 또는 오프라인 상태의 손 표현에 사용됩니다.
네트워크 손: 네트워크를 통해 전달된 손 상태를 기반으로 손 모델을 표시합니다.

로컬 하드웨어 리그 손

OVRHands가 하드웨어 손에 부착됩니다.
손 추적 방식에 따라 두 종류의 집기 콜라이더를 전환하며,
기본 설정상 하드웨어 손 메시를 표시하지 않고, 손 뼈 회전만 수집하여 네트워크 전송합니다.
이를 위해 메시 머티리얼은 투명하게 설정되며, overrideMaterialForRenderers에 투명 머티리얼을 지정하고
MaterialOverrideModeOverride로 설정합니다.

네트워크 리그 손

NetworkOVRHandRepresentationManagerRemoteOVRHand 데이터를 참조해 현재 손 추적 모드에 따라 적절한 메시를 표시합니다.

NetworkHand

의존성

  • Avatar 애드온 2.0.2 이상
  • Meta XR Core SDK

지원되는 토폴로지

  • 공유 모드

변경 로그

  • 버전 2.0.0: 최초 릴리즈
Back to top