Unreal의 직접 추적
이 문서의 내용
손 추적 시스템은 사람의 손바닥과 손가락을 입력으로 사용합니다. 모든 손가락, 전체 손바닥 및 손 제스처의 위치 및 회전에 대한 데이터를 사용할 수 있습니다. Unreal 4.26부터 손 추적은 Unreal HeadMountedDisplay 플러그 인을 기반으로 하며 모든 XR 플랫폼 및 디바이스에서 공통 API를 사용합니다. 기능은 Windows Mixed Reality 및 OpenXR 시스템 모두에 대해 동일합니다.
손 포즈
손 포즈를 사용하면 사용자의 손과 손가락을 추적하고 입력으로 사용할 수 있으며 청사진과 C++에서 모두 액세스할 수 있습니다. Unreal API는 틱이 Unreal 엔진과 동기화된 좌표계로 데이터를 보냅니다.
이미지
계층 구조는 열거형으로 EHandKeypoint
설명됩니다.
동작 컨트롤러 데이터 가져오기 함수를 사용하여 사용자의 손에서 이 모든 데이터를 가져올 수 있습니다. 이 함수는 XRMotionControllerData 구조를 반환합니다. 다음은 XRMotionControllerData 구조를 구문 분석하여 손 조인트 위치를 얻고 각 조인트의 위치에 디버그 좌표계를 그리는 샘플 청사진 스크립트입니다.
구조가 유효하고 손인지 검사 것이 중요합니다. 그렇지 않으면 위치, 회전 및 반경 배열에 액세스할 때 정의되지 않은 동작이 발생할 수 있습니다.
열거형은 EWMRHandKeypoint
손의 뼈 계층 구조를 설명합니다. 청사진에 나열된 각 손 키포인트를 찾을 수 있습니다.
전체 C++ 열거형은 다음과 같습니다.
enum class EWMRHandKeypoint : uint8
{
Palm,
Wrist,
ThumbMetacarpal,
ThumbProximal,
ThumbDistal,
ThumbTip,
IndexMetacarpal,
IndexProximal,
IndexIntermediate,
IndexDistal,
IndexTip,
MiddleMetacarpal,
MiddleProximal,
MiddleIntermediate,
MiddleDistal,
MiddleTip,
RingMetacarpal,
RingProximal,
RingIntermediate,
RingDistal,
RingTip,
LittleMetacarpal,
LittleProximal,
LittleIntermediate,
LittleDistal,
LittleTip
};
Windows.Perception.사람 각 열거형 사례의 숫자 값을 찾을 수 있습니다. HandJointKind 테이블입니다.
손 추적 지원
손 추적 Windows Mixed Reality 지원 손 추적을 추가하여 청사진에서 손 추적> 을 사용할 수 있습니다.
이 함수는 디바이스 false
에서 손 추적이 지원되고 손 추적을 사용할 수 없는 경우 를 반환 true
합니다.
C++:
WindowsMixedRealityHandTrackingFunctionLibrary.h
를 포함합니다.
static bool UWindowsMixedRealityHandTrackingFunctionLibrary::SupportsHandTracking()
손 추적 가져오기
GetHandJointTransform을 사용하여 손에서 공간 데이터를 반환할 수 있습니다. 데이터는 모든 프레임을 업데이트하지만 프레임 내에 있는 경우 반환된 값이 캐시됩니다. 성능상의 이유로 이 함수에 무거운 논리를 사용하지 않는 것이 좋습니다.
C++:
static bool UWindowsMixedRealityHandTrackingFunctionLibrary::GetHandJointTransform(EControllerHand Hand, EWMRHandKeypoint Keypoint, FTransform& OutTransform, float& OutRadius)
GetHandJointTransform의 함수 매개 변수에 대한 분석은 다음과 같습니다.
손 – 사용자가 왼쪽 또는 오른손일 수 있습니다.
키포인트 – 손의 뼈입니다.
변환 – 뼈 베이스의 좌표 및 방향입니다. 다음 뼈의 베이스를 요청하여 뼈 끝에 대한 변환 데이터를 가져올 수 있습니다. 특별한 팁 뼈는 말단의 끝을 제공합니다.
**반경 - 뼈 밑의 반경입니다.
**반환 값 - 뼈가 이 프레임을 추적하면 true이고, 뼈가 추적되지 않으면 false입니다.
핸드 라이브 링크 애니메이션
손 포즈는 Live Link 플러그 인 을 사용하여 애니메이션에 노출됩니다.
Windows Mixed Reality 및 Live Link 플러그 인이 사용하도록 설정된 경우:
창 > 라이브 링크를 선택하여 Live Link 편집기 창을 엽니다.
원본 을 선택하고 Windows Mixed Reality 손 추적 원본 을 사용하도록 설정
원본을 사용하도록 설정하고 애니메이션 자산을 연 후 장면 미리 보기 탭에서 애니메이션 섹션을 확장합니다. 추가 옵션도 볼 수 있습니다.
손 애니메이션 계층 구조는 의 EWMRHandKeypoint
와 동일합니다. 애니메이션은 WindowsMixedRealityHandTrackingLiveLinkRemapAsset 를 사용하여 대상을 변경할 수 있습니다.
편집기에서 서브클래스할 수도 있습니다.
손 메시
Microsoft OpenXR 플러그 인은 Unreal Marketplace 또는 GitHub 에서 사용할 수 있어야 합니다.
추적된 기하 도형으로서의 손 메시
중요
OpenXR에서 손 메시를 추적된 기하 도형으로 가져오려면 Set Use Hand Mesh with Enabled Tracking Geometry 를 호출해야 합니다.
해당 모드를 사용하도록 설정하려면 Set Use Hand Mesh with Enabled Tracking Geometry 를 호출해야 합니다.
참고
두 모드를 동시에 사용하도록 설정할 수 없습니다. 하나를 사용하도록 설정하면 다른 하나는 자동으로 비활성화됩니다.
손 메시 데이터 액세스
손 메시 데이터에 액세스하려면 다음을 수행해야 합니다.
ARSessionConfig 자산을 선택하고, AR 설정 -> 세계 매핑 설정을 확장하고, 추적된 기하 도형에서 메시 데이터 생성 을 검사.
기본 메시 매개 변수는 다음과 같습니다.
폐색에 메시 데이터 사용
메시 데이터에 대한 충돌 생성
메시 데이터에 대한 탐색 메시 생성
Wireframe에서 메시 데이터 렌더링 – 생성된 메시를 보여 주는 디버그 매개 변수
이러한 매개 변수 값은 공간 매핑 메시 및 손 메시 기본값으로 사용됩니다. 언제든지 청사진 또는 모든 메시의 코드에서 변경할 수 있습니다.
C++ API 참조
를 사용하여 EEARObjectClassification
추적 가능한 모든 개체에서 손 메시 값을 찾습니다.
enum class EARObjectClassification : uint8
{
// Other types
HandMesh,
};
다음 대리자는 시스템이 손 메시를 포함하여 추적 가능한 개체를 검색할 때 호출됩니다.
class FARSupportInterface
{
public:
// Other params
DECLARE_AR_SI_DELEGATE_FUNCS(OnTrackableAdded)
DECLARE_AR_SI_DELEGATE_FUNCS(OnTrackableUpdated)
DECLARE_AR_SI_DELEGATE_FUNCS(OnTrackableRemoved)
};
대리자 처리기가 아래 함수 서명을 따르는지 확인합니다.
void UARHandMeshComponent::OnTrackableAdded(UARTrackedGeometry* Added)
를 통해 메시 데이터에 액세스할 수 있습니다.UARTrackedGeometry::GetUnderlyingMesh
UMRMeshComponent* UARTrackedGeometry::GetUnderlyingMesh()
청사진 API 참조
청사진에서 손 메시를 작업하려면 다음을 수행합니다.
청사진 행위자로 ARTrackableNotify 구성 요소 추가
세부 정보 패널로 이동하여 이벤트 섹션을 확장합니다 .
이벤트 그래프에서 다음 노드를 사용하여 추적된 기하 도형 추가/업데이트/제거 시 덮어씁니다.
OpenXR의 손 메시 시각화
손 메시를 시각화하는 권장 방법은 Microsoft OpenXR 플러그 인 과 함께 Epic의 XRVisualization 플러그 인을 사용하는 것입니다.
그런 다음 청사진 편집기에서 Enabled XRVisualization 을 매개 변수로 사용하여 Microsoft OpenXR 플러그 인 에서 손 메시 사용 설정 함수를 사용해야 합니다.
렌더링 프로세스를 관리하려면 XRVisualization에서 렌더링 동작 컨트롤러 를 사용해야 합니다.
결과:
사용자 지정 셰이더로 손 메시를 그리는 것과 같이 더 복잡한 것이 필요한 경우 메시를 추적된 기하 도형으로 가져와야 합니다.
손 광선
손 포즈를 취하는 것은 개체를 잡거나 버튼을 누르는 것과 같은 긴밀한 상호 작용에 적합합니다. 그러나 사용자와 멀리 떨어져 있는 홀로그램으로 작업해야 하는 경우도 있습니다. 이 작업은 C++ 및 Blueprints 모두에서 포인팅 디바이스로 사용할 수 있는 손 광선으로 수행할 수 있습니다. 손에서 먼 지점까지 광선을 그릴 수 있으며 Unreal 광선 추적의 도움을 받아 손이 닿지 않는 홀로그램을 선택합니다.
중요
모든 함수 결과는 프레임마다 변경되므로 모두 호출할 수 있습니다. 순수하고 불순한 함수 또는 호출 가능한 함수에 대한 자세한 내용은 함수의 청사진 사용자 GUID 를 참조하세요 .
손 광선에 대한 데이터를 얻으려면 이전 섹션의 동작 컨트롤러 데이터 가져오기 함수를 사용해야 합니다. 반환된 구조체에는 손 광선을 만드는 데 사용할 수 있는 두 개의 매개 변수인 Aim Position 및 Aim Rotation 이 포함되어 있습니다. 이러한 매개 변수는 팔꿈치가 지시하는 광선을 형성합니다. 당신은 그들을 데리고 가리키는 홀로그램을 찾아야합니다.
다음은 손 광선이 위젯에 닿는지 여부를 확인하고 사용자 지정 적중 결과를 설정하는 예제입니다.
청사진에서 손 광선을 사용하려면 Windows Mixed Reality HMD 에서 작업을 검색합니다.
C++에서 액세스하려면 호출 코드 파일의 맨 위에 를 포함합니다 WindowsMixedRealityFunctionLibrary.h
.
열거형
또한 청사진에서 사용할 수 있는 EHMDInputControllerButtons 에서 입력 사례에 액세스할 수 있습니다.
C++에서 액세스하려면 열거형 클래스를 EHMDInputControllerButtons
사용합니다.
enum class EHMDInputControllerButtons : uint8
{
Select,
Grasp,
//......
};
다음은 적용 가능한 두 열거형 사례에 대한 분석입니다.
Select - 사용자가 트리거한 Select 이벤트입니다.
HoloLens 2 에어 탭, 응시 및 커밋 또는 음성 입력 이 활성화된 "선택"이라고 말하여 트리거됩니다.
Grasp - 사용자가 트리거한 Grasp 이벤트입니다.
홀로그램에서 사용자의 손가락을 닫아 HoloLens 2 트리거됩니다.
아래 열거형을 통해 EHMDTrackingStatus
C++에서 손 메시의 추적 상태 액세스할 수 있습니다.
enum class EHMDTrackingStatus : uint8
{
NotTracked,
//......
Tracked
};
다음은 적용 가능한 두 열거형 사례에 대한 분석입니다.
NotTracked –- 손이 보이지 않음
추적 – - 손이 완전히 추적됩니다.
구조체
PointerPoseInfo 구조체는 다음 손 데이터에 대한 정보를 제공할 수 있습니다.
원점 – 손의 원점
방향 – 손의 방향
위쪽 – 손의 최대 벡터
방향 – 방향 쿼터니언
추적 상태 – 현재 추적 상태
아래와 같이 Blueprints를 통해 PointerPoseInfo 구조체에 액세스할 수 있습니다.
또는 C++를 사용하여 다음을 수행합니다.
struct FPointerPoseInfo
{
FVector Origin;
FVector Direction;
FVector Up;
FQuat Orientation;
EHMDTrackingStatus TrackingStatus;
};
Functions
아래에 나열된 모든 함수는 모든 프레임에서 호출할 수 있으므로 연속 모니터링이 가능합니다.
포인터 포즈 정보 가져오기 는 현재 프레임의 손 광선 방향에 대한 전체 정보를 반환합니다.
청사진:
C++:
static FPointerPoseInfo UWindowsMixedRealityFunctionLibrary::GetPointerPoseInfo(EControllerHand hand);
현재 프레임에서 손을 잡으면 Is Grasped 가 true를 반환합니다.
청사진:
C++:
static bool UWindowsMixedRealityFunctionLibrary::IsGrasped(EControllerHand hand);
사용자가 현재 프레임에서 선택을 트리거한 경우 Select Pressed 가 true를 반환합니다.
청사진:
C++:
static bool UWindowsMixedRealityFunctionLibrary::IsSelectPressed(EControllerHand hand);
Is Button Clicked는 현재 프레임에서 이벤트 또는 단추가 트리거되면 true를 반환합니다.
청사진:
C++:
static bool UWindowsMixedRealityFunctionLibrary::IsButtonClicked(EControllerHand hand, EHMDInputControllerButtons button);
컨트롤러 추적 상태 가져오기 는 현재 프레임의 추적 상태 반환합니다.
청사진:
C++:
static EHMDTrackingStatus UWindowsMixedRealityFunctionLibrary::GetControllerTrackingStatus(EControllerHand hand);
제스처
HoloLens 2 공간 제스처를 추적하므로 이러한 제스처를 입력으로 캡처할 수 있습니다. 제스처 추적은 구독 모델을 기반으로 합니다. "제스처 구성" 함수를 사용하여 추적하려는 제스처를 디바이스에 알려야 합니다. 제스처에 대한 자세한 내용은 HoloLens 2 기본 사용량 문서입니다.
Windows Mixed Reality
그런 다음, 다음 이벤트를 구독하는 코드를 추가해야 합니다.
OpenXR
OpenXR에서 제스처 이벤트는 입력 파이프라인을 통해 추적됩니다. 손 조작을 사용하여 디바이스는 탭 및 길게 누르기 제스처를 자동으로 인식할 수 있지만 다른 제스처는 인식할 수 없습니다. OpenXRMsftHandInteraction Select 및 Grip 매핑으로 이름이 지정됩니다. 구독을 사용하도록 설정할 필요가 없으며 다음과 같이 프로젝트 설정/엔진/입력에서 이벤트를 선언해야 합니다.
Windows Mixed Reality 공간 입력 에서 Blueprint 함수를 찾고 호출 코드 파일에 를 추가하여 WindowsMixedRealitySpatialInputFunctionLibrary.h
C++ 함수를 찾을 수 있습니다.
열거형
청사진:
C++:
enum class ESpatialInputAxisGestureType : uint8
{
None = 0,
Manipulation = 1,
Navigation = 2,
NavigationRails = 3
};
함수
함수를 사용하여 제스처 캡처를 CaptureGestures
사용하거나 사용하지 않도록 설정할 수 있습니다. 활성화된 제스처가 입력 이벤트를 발생하면 함수는 제스처 캡처가 성공했는지, false
오류가 있는지를 반환 true
합니다.
청사진:
C++:
static bool UWindowsMixedRealitySpatialInputFunctionLibrary::CaptureGestures(
bool Tap = false,
bool Hold = false,
ESpatialInputAxisGestureType AxisGesture = ESpatialInputAxisGestureType::None,
bool NavigationAxisX = true,
bool NavigationAxisY = true,
bool NavigationAxisZ = true);
다음은 Blueprints 및 C++에서 찾을 수 있는
const FKey FSpatialInputKeys::TapGesture(TapGestureName);
const FKey FSpatialInputKeys::DoubleTapGesture(DoubleTapGestureName);
const FKey FSpatialInputKeys::HoldGesture(HoldGestureName);
const FKey FSpatialInputKeys::LeftTapGesture(LeftTapGestureName);
const FKey FSpatialInputKeys::LeftDoubleTapGesture(LeftDoubleTapGestureName);
const FKey FSpatialInputKeys::LeftHoldGesture(LeftHoldGestureName);
const FKey FSpatialInputKeys::RightTapGesture(RightTapGestureName);
const FKey FSpatialInputKeys::RightDoubleTapGesture(RightDoubleTapGestureName);
const FKey FSpatialInputKeys::RightHoldGesture(RightHoldGestureName);
const FKey FSpatialInputKeys::LeftManipulationGesture(LeftManipulationGestureName);
const FKey FSpatialInputKeys::LeftManipulationXGesture(LeftManipulationXGestureName);
const FKey FSpatialInputKeys::LeftManipulationYGesture(LeftManipulationYGestureName);
const FKey FSpatialInputKeys::LeftManipulationZGesture(LeftManipulationZGestureName);
const FKey FSpatialInputKeys::LeftNavigationGesture(LeftNavigationGestureName);
const FKey FSpatialInputKeys::LeftNavigationXGesture(LeftNavigationXGestureName);
const FKey FSpatialInputKeys::LeftNavigationYGesture(LeftNavigationYGestureName);
const FKey FSpatialInputKeys::LeftNavigationZGesture(LeftNavigationZGestureName);
const FKey FSpatialInputKeys::RightManipulationGesture(RightManipulationGestureName);
const FKey FSpatialInputKeys::RightManipulationXGesture(RightManipulationXGestureName);
const FKey FSpatialInputKeys::RightManipulationYGesture(RightManipulationYGestureName);
const FKey FSpatialInputKeys::RightManipulationZGesture(RightManipulationZGestureName);
const FKey FSpatialInputKeys::RightNavigationGesture(RightNavigationGestureName);
const FKey FSpatialInputKeys::RightNavigationXGesture(RightNavigationXGestureName);
const FKey FSpatialInputKeys::RightNavigationYGesture(RightNavigationYGestureName);
const FKey FSpatialInputKeys::RightNavigationZGesture(RightNavigationZGestureName);
다음 개발 검사점
앞에서 설명한 Unreal 개발 과정을 따르고 있다면 현재 MRTK 핵심 구성 요소를 살펴보는 중입니다. 여기에서 다음 구성 요소로 진행할 수 있습니다.
또는 Mixed Reality 플랫폼 기능 및 API로 이동합니다.
언제든지 Unreal 개발 검사점 으로 돌아갈 수 있습니다.