다음을 통해 공유


Unity의 제스처

HoloLens 및 몰입형 HMD에서 Unity의 응시, 손 제스처모션 컨트롤러에서 작업을 수행하는 두 가지 주요 방법이 있습니다. Unity에서 동일한 API를 통해 두 공간 입력 원본의 데이터에 액세스합니다.

Unity는 Windows Mixed Reality의 공간 입력 데이터에 액세스하는 두 가지 기본 방법을 제공합니다. 일반적인 Input.GetButton/Input.GetAxis API 는 여러 Unity XR SDK에서 작동하지만 Windows Mixed Reality와 관련된 InteractionManager/GestureRecognizer API는 전체 공간 입력 데이터 집합을 노출합니다.

상위 수준 복합 제스처 API(GestureRecognizer)

네임스페이스: UnityEngine.XR.WSA.Input
형식: GestureRecognizer, GestureSettings, InteractionSourceKind

또한 앱은 공간 입력 원본, 탭, 유지, 조작 및 탐색 제스처에 대해 더 높은 수준의 복합 제스처를 인식할 수 있습니다. GestureRecognizer를 사용하여 두 손모션 컨트롤러에서 이러한 복합 제스처를 인식할 수 있습니다.

GestureRecognizer의 각 제스처 이벤트는 이벤트 당시의 대상 헤드 레이뿐만 아니라 입력에 대한 SourceKind를 제공합니다. 일부 이벤트는 추가 컨텍스트 관련 정보를 제공합니다.

제스처 인식기를 사용하여 제스처를 캡처하는 데 필요한 단계는 몇 가지뿐입니다.

  1. 새 제스처 인식기 만들기
  2. 감시할 제스처 지정
  3. 해당 제스처에 대한 이벤트 구독
  4. 제스처 캡처 시작

새 제스처 인식기 만들기

GestureRecognizer사용하려면 GestureRecognizer만들어야 합니다.

GestureRecognizer recognizer = new GestureRecognizer();

감시할 제스처 지정

SetRecognizableGestures()를 통해 관심 있는 제스처를 지정합니다.

recognizer.SetRecognizableGestures(GestureSettings.Tap | GestureSettings.Hold);

해당 제스처에 대한 이벤트 구독

관심 있는 제스처에 대한 이벤트를 구독합니다.

void Start()
{
    recognizer.Tapped += GestureRecognizer_Tapped;
    recognizer.HoldStarted += GestureRecognizer_HoldStarted;
    recognizer.HoldCompleted += GestureRecognizer_HoldCompleted;
    recognizer.HoldCanceled += GestureRecognizer_HoldCanceled;
}

참고 항목

탐색 및 조작 제스처는 GestureRecognizer 인스턴스에서 상호 배타적입니다.

제스처 캡처 시작

기본적으로 GestureRecognizer는 StartCapturingGestures()가 호출될 때까지 입력을 모니터링하지 않습니다. StopCapturingGestures()가 처리된 프레임 이전에 입력이 수행된 경우 StopCapturingGestures()가 호출된 후 제스처 이벤트가 생성될 수 있습니다. GestureRecognizer제스처가 실제로 발생한 이전 프레임 동안 설정되었는지 여부를 기억하므로 이 프레임의 응시 대상에 따라 제스처 모니터링을 시작하고 중지할 수 있습니다.

recognizer.StartCapturingGestures();

제스처 캡처 중지

제스처 인식을 중지하려면 다음을 수행합니다.

recognizer.StopCapturingGestures();

제스처 인식기 제거

GestureRecognizer 개체를 삭제하기 전에 구독된 이벤트의 구독을 취소해야 합니다.

void OnDestroy()
{
    recognizer.Tapped -= GestureRecognizer_Tapped;
    recognizer.HoldStarted -= GestureRecognizer_HoldStarted;
    recognizer.HoldCompleted -= GestureRecognizer_HoldCompleted;
    recognizer.HoldCanceled -= GestureRecognizer_HoldCanceled;
}

Unity에서 모션 컨트롤러 모델 렌더링

모션 컨트롤러 모델 및 텔레포트
모션 컨트롤러 모델 및 텔레포트

사용자가 보유하고 있는 실제 컨트롤러와 일치하는 모션 컨트롤러를 앱에서 렌더링하고 다양한 단추를 누를 때 명확하게 표현하려면 Mixed Reality 도구 키트에서 MotionController 프리팹사용할 수 있습니다. 이 프리팹은 시스템의 설치된 모션 컨트롤러 드라이버에서 런타임에 올바른 glTF 모델을 동적으로 로드합니다. 이러한 모델을 편집기에서 수동으로 가져오는 대신 동적으로 로드하는 것이 중요하므로 앱은 사용자가 가질 수 있는 현재 및 미래의 컨트롤러에 대해 물리적으로 정확한 3D 모델을 표시합니다.

  1. 시작 지침에 따라 Mixed Reality Toolkit을 다운로드하고 Unity 프로젝트에 추가합니다.
  2. 시작 단계의 일부로 카메라를 MixedRealityCameraParent 프리팹으로 교체한 경우 사용하는 것이 좋습니다. 해당 프리팹에는 모션 컨트롤러 렌더링이 포함됩니다. 그렇지 않으면 프로젝트 창에서 장면에 Assets/HoloToolkit/Input/Prefabs/MotionControllers.prefab을 추가합니다. 사용자가 장면 내에서 텔레포트할 때 카메라를 이동하는 데 사용하는 부모 개체의 자식으로 해당 프리팹을 추가하여 컨트롤러가 사용자와 함께 제공됩니다. 앱에 텔레포트가 포함되지 않는 경우 장면의 루트에 프리팹을 추가하기만 하면 됩니다.

개체 throw

가상 현실에서 개체를 throw하는 것은 처음에는 보이는 것보다 더 어려운 문제입니다. 대부분의 물리적 기반 상호 작용과 마찬가지로, 예기치 않은 방식으로 게임을 던질 때, 그것은 즉시 분명하고 몰입을 깨뜨립니다. 우리는 물리적으로 올바른 던지기 동작을 나타내는 방법에 대해 깊이 생각하고 플랫폼 업데이트를 통해 활성화 된 몇 가지 지침을 마련했습니다.

여기서 throw를 구현하는 것이 좋습니다. 이 샘플은 다음 네 가지 지침을 따릅니다.

  • 위치 대신 컨트롤러의 속도를 사용합니다. Windows에 대한 11월 업데이트에서는 '근사값' 위치 추적 상태때 동작이 변경되었습니다. 이 상태에서 컨트롤러에 대한 속도 정보는 높은 정확도를 믿는 한 계속 보고됩니다. 이는 종종 위치보다 긴 높은 정확도로 유지됩니다.

  • 컨트롤러각 속도를 통합합니다. 이 논리는 모두 위의 연결된 패키지 내에서 정적 메서드의 파일에 GetThrownObjectVelAngVel 포함 throwing.cs 됩니다.

    1. 각 속도가 보존되므로 throw된 개체는 throw 시점과 동일한 각도 속도를 유지해야 합니다. objectAngularVelocity = throwingControllerAngularVelocity;

    2. throw된 개체의 질량 중심이 그립 포즈의 원점이 아닐 가능성이 높기 때문에 사용자의 참조 프레임에서 컨트롤러의 속도와는 다른 속도가 될 수 있습니다. 이러한 방식으로 개체의 속도에 기여하는 부분은 컨트롤러 원점 주위에서 throw된 개체의 질량 중심에서 순간적인 탄젠트 속도입니다. 이 탄젠트 속도는 컨트롤러 원점과 throw된 개체의 질량 중심 사이의 거리를 나타내는 벡터를 사용하여 컨트롤러의 각 속도의 교차곱입니다.

      Vector3 radialVec = thrownObjectCenterOfMass - throwingControllerPos;
      Vector3 tangentialVelocity = Vector3.Cross(throwingControllerAngularVelocity, radialVec);
      
    3. throw된 개체의 총 속도는 컨트롤러의 속도와 이 탄젠트 속도의 합계입니다. objectVelocity = throwingControllerVelocity + tangentialVelocity;

  • 속도를 적용하는 시간에 주의하세요. 단추를 누르면 해당 이벤트가 Bluetooth를 통해 운영 체제로 버블업되는 데 최대 20ms가 걸릴 수 있습니다. 즉, 컨트롤러 상태 변경을 누름에서 누르지 않음으로 폴링하거나 다른 방법으로 폴링하는 경우 컨트롤러에서 가져오는 정보를 포즈하면 실제로 이 상태 변경보다 앞서 있을 것입니다. 또한 폴링 API에서 제시하는 컨트롤러 포즈는 앞으로 프레임이 표시될 때 20ms 이상이 될 수 있는 포즈를 반영할 것으로 예측됩니다. 이는 보류된 개체를 렌더링하는좋지만, 사용자가 throw를 해제하는 순간의 궤적을 계산할 때 개체를 대상으로 지정하는 데 시간이 더 많이 소요됩니다. 다행히 11월 업데이트에서 InteractionSourcePressed 또는 InteractionSourceReleased와 같은 Unity 이벤트가 전송되면 단추를 누르거나 놓을 때의 기록 포즈 데이터가 상태에 포함됩니다. throw하는 동안 가장 정확한 컨트롤러 렌더링 및 컨트롤러 대상 지정을 얻으려면 폴링 및 이벤트 지정을 적절하게 사용해야 합니다.

  • 그립 포즈를 사용합니다. 각도 속도 및 속도는 포인터 포즈가 아닌 그립 포즈를 기준으로 보고됩니다.

Throw는 향후 Windows 업데이트로 계속 개선될 것이며 여기에서 자세한 정보를 찾을 수 있습니다.

MRTK의 제스처 및 동작 컨트롤러

입력 관리자에서 제스처 및 모션 컨트롤러에 액세스할 수 있습니다.

안내 따르기

자세한 사용자 지정 예제가 포함된 단계별 자습서는 Mixed Reality Academy에서 사용할 수 있습니다.

MR 입력 213 - 모션 컨트롤러
MR 입력 213 - 모션 컨트롤러

다음 개발 검사점

앞에서 제시한 Unity 개발 과정을 따라가는 경우 MRTK 핵심 구성 요소를 탐색하는 중입니다. 여기에서 다음 구성 요소로 진행할 수 있습니다.

또는 Mixed Reality 플랫폼 기능 및 API로 이동합니다.

언제든지 Unity 개발 검사점으로 돌아갈 수 있습니다.

참고 항목