Meta OVR 손 동기화
이 애드온은 Meta의 OVR 손 상태(손가락 추적 포함)를 동기화하는 방법을 보여줍니다.
손을 표시할 수도 있습니다:
- 수집된 컨트롤러에서 받은 데이터에서
- 손가락 추적 데이터에서
손가락 추적 데이터와 관련하여, 애드온은 대역폭 소비를 줄이기 위해 손뼈 데이터를 고도로 압축하는 방법을 보여줍니다.
Meta XR SDK
여기에는 다른 샘플에 사용되는 OpenXR 플러그인 대신 Oculus XR 플러그인이 사용됩니다.
여기서 혼합 현실 패스스루를 가능하게 하기 위해 필요한 Meta XR Core SDK와 공유 공간 앵커를 사용할 때 권고합니다.
Meta XR SDK는 범위가 지정된 레지스트리 https://npm.developer.oculus.com/ (자세한 내용은 메타 문서 참고)를 통해 추가되었습니다.
메타 레지스터의 주요 설치 패키지는 다음과 같습니다:
- Meta XR Core SDK: 혼합 현실 패스스루에 필요하며, 공유 공간 앵커, 핑거 트래킹 API 및 클래스도 제공합니다.
- Meta XR 플랫폼 SDK: 공유 공간 앵커 등록 프로세스에 사용되는 Oculus 사용자 ID에 액세스할 수 있습니다(이 애드온에는 필요하지 않지만 프로젝트에서 공유 공간 앵커 또는 메타 아바타를 사용하는 경우 필요합니다).
Oculus 리그 및 빌딩 블록
OpenXR 플러그인 대신 Oculus XR 플러그인을 기반으로 헤드셋 및 손 위치, 입력 또는 손가락 추적에 대한 세부 정보를 캡처할 수 있는 특정 리그가 만들어졌습니다.
이 하드웨어 수집 리그는 메타 빌딩 블록을 통해 작성되었습니다:
- 이 단계에서 생성된 프리팹은
/Prefabs/Rig/BaseBuildingBlocks/[BuildingBlock] BaseRig
프리팹에서 사용할 수 있습니다. - 이전에 동기화 컴포넌트가 추가된 추가 기능에 사용되는 프리팹은
/Prefabs/Rig/[BuildingBlock] HardwareRig
프리팹에서 사용할 수 있습니다.
그런 다음 헤드셋과 손 위치를 수집하고 동기화하기 위해 VRS 공유 샘플에 사용되는 동일한 컴포넌트를 사용합니다(VR 공유 페이지의 HardwareRig
및 HardwareHand
참조).
마지막으로, 아래에 설명된 바와 같이 손가락 추적 및 컨트롤러 추적 손 표현 간의 손가락 추적 및 토글링을 처리하기 위해 몇 가지 특정 컴포넌트가 추가되었습니다.
손 로직 개요
이 애드온을 통해 컨트롤러 기반 핸드 트래킹과 손가락 기반 핸드 트래킹이 공존합니다. 목표는 한 곳에서 다른 곳으로 원활하게 전환하는 것입니다.
그렇게 하려면:
- 다른 VR 샘플과 마찬가지로 컨트롤러를 사용할 때 표시되는 손 모델은 Oculus 샘플 프레임워크의 손 모델입니다.
- 핑거 트래킹을 사용할 경우 현지 사용자의 경우 Meta XR Core SDK의
OVRHand
컴포넌트가 손과 손가락뼈 데이터를 수집하고OVRSkeleton
이 손가락뼈 게임 객체를 준비하며OVRMesh
와OVRMeshRenderer
가 이 뼈로 스킨 메시 렌더러를 준비합니다. 이 모든 것은 제안된 컴포넌트 설정에서 확인할 수 있습니다. 또는 Meta의 손 트래킹 설정 문서 페이지에서 자세히 확인할 수 있습니다 - 원격 사용자의 경우 원격
RemoteOVRHand
(아래 설명)가OVRSkeleton
,OVRMesh
및OVRMeshRenderer
가 예상하는 동일한 손 및 손가락뼈 위치 데이터를 네트워크에서 복구하여 동일한 방식으로 손을 재구성합니다 - 이러한 손 상태 중 몇 가지는 수신 시 링 버퍼에 저장됩니다. 모든
Render
동안 우리는 2틱 사이에서도 매끄러운 뼈 회전을 나타내기 위해 과거에 일정한 지연으로 보간합니다.
노트:
여기에서는 특정 디버깅 문제로 인해 OVRSkeleton
, OVRMesh
및 OVRMeshRenderer
클래스를 원격 사용자를 위해 편집기에서 완벽하게 사용할 수 없다고 설명했습니다.
이를 우회하기 위해 프로젝트는 문제가 있는 편집자 전용 라인을 제거하는 RemoteOVRSkeleton
, RemoteOVRMesh
및 RemoteOVRMeshRenderer
의 복사본을 사용합니다.
Meta 패키지 업데이트로 인해 새 코드 기반과 호환되지 않는 경우 원래 코드 기반으로 안전하게 교체할 수 있습니다.
로컬 하드웨어 리그 손 컴포넌트
로컬 사용자 하드웨어 리그의 손에 있는 HardwareOVRHandCollecter
컴포넌트는 손 상태를 수집하여 동기화 컴포넌트에 제공합니다.
메타의 OVRHand
컴포넌트에 의존하여 손 상태(특히 손가락뼈 회전 포함)에 접근할 수 있습니다.
여기에는 핀칭 상태에 접근하거나 손가락 추적이 현재 사용되는지 여부를 알 수 있는 헬퍼 속성도 포함됩니다.
네트워크 리그 손 컴포넌트
로컬 사용자 네트워크 리그의 RemoteOVRHand
컴포넌트는 HardwareOVRHandCollecter
에 의존하여 로컬 손 상태를 찾은 다음 FixedUpdateNetwork
에서 네트워크 변수에 저장합니다.
원격 사용자의 경우 이러한 데이터를 파싱 하여 로컬 손 상태를 재현한 다음 실제 뼈 변환 및 손 메시 상태를 처리하는 RemoteOVRSkeleton
, RemoteOVRMesh
및 RemoteOVRMeshRenderer
컴포넌트에 답합니다.
동기화된 손 상태에는 특히 IsDataValid
가 포함되어 있는데, 이는 사용자가 손가락 추적을 사용하고 있었다면 true이고, 그렇지 않으면 false이며, 뼈 정보를 포함합니다.
대역폭 최적화
손 상태는 동기화하기 위해 24개의 4원수(quaternion)을 포함하고 있어 뼈 정보를 전송하는 데 많은 비용이 듭니다. 간단한 동기화 방법은 대역폭 사용을 줄이려고 하지 않고 모든 4원수를 전송하는 것이며, UncrompressedRemoteOVRHand
대체 버전인 RemoteOVRHand
로 테스트할 수 있습니다.
실제 RemoteOVRHand
구현은 손뼈의 일부 특성(특정 회전축, 제한된 이동 범위 등)을 사용하여 대역폭을 줄입니다. 각 뼈에 필요한 정밀도는 전용 HandSynchronizationScriptable
스크립트로 지정할 수 있습니다(HardwareOVRHandCollecter
및 RemoteOVRHand
모두 제공해야 함).
이 애드온에는 기본 기능인 HandSynchronizationConfigForCompressedMetaOVRHands
가 포함되어 있으며, 대부분의 요구 사항에 맞게 제작되었습니다:
- 20배 적은 바이트를 사용하여 매우 높은 압축률을 제공합니다((손 전체 뼈 회전 세트는 전체 전체 4원수 전송을 위해 386바이트가 아닌 18바이트로 저장됨). 전체 4원수 전송은
HandSynchronizationConfigForMetaOVRHands
스크립트 파일을 사용하여 테스트할 수 있습니다. - 압축이 원격 사용자의 손가락 표현에 가시적인 영향을 미치지 않습니다.
보간
RemoteOVRHands
에서는 ParseNetworkData()
에서 네트워크 데이터의 변화가 감지되는 각 Render
에서 네트워크 데이터 값이 압축된 손 상태로 변환된 후, 손 골격을 애니메이션화하는 데 사용할 수 있는 실제 손 상태로 변환됩니다.
그런 다음 이 손 상태는 시간이 지정된 링 버퍼(손 상태의 링 버퍼)에 저장되며, 여기서 삽입 시간도 저장합니다.
그런 다음 각 렌더에서 실제로 뼈를 애니메이션화하는 데 사용되는 손 상태는 InterpolateBonesRotations
에서 계산됩니다. 과거 지정된 지연 시간에 한 번에 링 버퍼에 저장된 두 손 상태 사이에 보간 됩니다.
이렇게 하면 틱 수신 사이에서도 손뼈가 수신된 회전 값 사이에서 원활하게 회전할 수 있습니다.
손 모델 토글
OVRHandRepresentationManager
컴포넌트는 현재 사용 중인 핸드 트래킹 모드를 기반으로 핸드에 대해 표시되는 메시를 처리합니다:
- 컨트롤러 추적을 사용할 때 Oculus 샘플 프레임워크 핸드 메시를 사용합니다,
- 또는 손가락 추적을 사용할 때
OVRSkeleton
컴포넌트에 의해 애니메이션화된 뼈 골격에 의존하는 메시
아바타 추가 기능에서 제공하는 IAvatarRepresentationListener
를 구현해 아바타 피부색에 따라 손 색깔을 입혀야 합니다.
이 스크립트의 두 가지 버전이 존재하는데, 하나는 로컬 하드웨어 핸드용(손 골격 애니메이션화, 콜라이더 로컬 목적 또는 오프라인 핸드가 필요한 경우)이며, 다른 하나는 네트워크 핸드용입니다.
로컬 하드웨어 리그 손
이 버전은 하드웨어 핸드에 배치된 OVRHands
에 의존합니다.
또한 다른 기능 외에도 손가락 추적을 사용할 때 손바닥 위치에 국한된 두 개의 잡는 콜라이더, 컨트롤러 기반 추적을 사용할 때 손바닥 위치에 국한된 두 개의 콜라이더 사이를 전환해야 합니다(손의 "중심"이 이 두 모드에서 정확히 동일한 위치에 있지 않음).
노트:
현재 설정에서는 네트워크로 연결된 손만 표시하도록 선택되었습니다. 하드웨어 리그의 손은 뼈 위치를 수집하기 위해 여기에 있을 뿐이며 인덱스 콜라이더 위치를 적절하게 애니메이션화합니다.
따라서 하드웨어 핸드에 사용되는 머티리얼은 투명합니다(컨트롤러 핸드의 경우 안드로이드에서 필요합니다. 그렇지 않으면 렌더러가 비활성화된 경우 애니메이션이 뼈를 움직이지 않습니다).
HardwareOVRHandRepresentationManager
의 MaterialOverrideMode
가 Override
로 설정됨에 따라 하드웨어 핸드 메시가 자동으로 투명하게 설정됩니다. overrideMaterialForRenderers
필드에는 투명한 머티리얼이 제공됩니다.
네트워크 리그 손
NetworkOVRHandRepresentationManager
컴포넌트는 OVRHand
로직에 의존하는 메시의 컨트롤러 추적을 사용할 때(RemoteOVRHand
데이터에서 확인) 손 모드를 기반으로 표시되는 메시를 처리합니다.
의존성
- Avatar 애드온 2.0.2
- Meta XR Core SDK
다운로드
이 애드온의 최신 버전은 애드온 프로젝트에 포함되어 있습니다.
지원하는 토폴로지
- 공유 모드
변경 내역
- 버전 2.0.0: 최초 릴리즈