Unity でのジェスチャGestures in Unity

Unityでの操作を実行するには、2つの主要な方法があります。 HoloLens ではハンドジェスチャと、HoloLens ではアニメーションコントローラーを使用します。There are two key ways to take action on your gaze in Unity, hand gestures and motion controllers in HoloLens and Immersive HMD. Unity の同じ Api を使用して、空間入力の両方のソースのデータにアクセスします。You access the data for both sources of spatial input through the same APIs in Unity.

Unity には、Windows Mixed Reality の空間入力データにアクセスする主な方法が2つあります。Unity provides two primary ways to access spatial input data for Windows Mixed Reality. Common input. GetButton/GetAxis api は複数の Unity XR sdk に対して機能しますが、Windows Mixed Reality に固有の Interactionmanager/GestureRecognizer api は、空間入力データの完全なセットを公開します。The common Input.GetButton/Input.GetAxis APIs work across multiple Unity XR SDKs, while the InteractionManager/GestureRecognizer API specific to Windows Mixed Reality exposes the full set of spatial input data.

高レベル複合ジェスチャ Api (GestureRecognizer)High-level composite gesture APIs (GestureRecognizer)

名前空間: UNITYENGINE. XRNamespace: UnityEngine.XR.WSA.Input
: GestureRecognizerGestureSettingsinteractionsourcekindTypes: GestureRecognizer, GestureSettings, InteractionSourceKind

アプリでは、空間入力ソース、タップ、ホールド、操作、およびナビゲーションジェスチャに対する高レベルの複合ジェスチャを認識することもできます。Your app can also recognize higher-level composite gestures for spatial input sources, Tap, Hold, Manipulation, and Navigation gestures. GestureRecognizer を使用して、ハンドコントローラーとモーションコントローラーの両方でこれらの複合ジェスチャを認識できます。You can recognize these composite gestures across both hands and motion controllers using the GestureRecognizer.

GestureRecognizer の各ジェスチャイベントは、イベントの発生時に、入力とターゲットのヘッドレイを提供します。Each Gesture event on the GestureRecognizer provides the SourceKind for the input as well as the targeting head ray at the time of the event. 一部のイベントは、コンテキスト固有の追加情報を提供します。Some events provide additional context-specific information.

ジェスチャ認識エンジンを使用してジェスチャをキャプチャするには、いくつかの手順を実行する必要があります。There are only a few steps required to capture gestures using a Gesture Recognizer:

  1. 新しいジェスチャ認識エンジンを作成するCreate a new Gesture Recognizer
  2. 監視するジェスチャを指定するSpecify which gestures to watch for
  3. これらのジェスチャのイベントをサブスクライブするSubscribe to events for those gestures
  4. ジェスチャのキャプチャを開始するStart capturing gestures

新しいジェスチャ認識エンジンを作成するCreate a new Gesture Recognizer

GestureRecognizer を使用するには、 GestureRecognizer を作成しておく必要があります。To use the GestureRecognizer, you must have created a GestureRecognizer:

GestureRecognizer recognizer = new GestureRecognizer();

監視するジェスチャを指定するSpecify which gestures to watch for

Set認識 Izableジェスチャー () を使用して、興味のあるジェスチャを指定します。Specify which gestures you're interested in via SetRecognizableGestures():

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

これらのジェスチャのイベントをサブスクライブするSubscribe to events for those gestures

関心のあるジェスチャのイベントをサブスクライブします。Subscribe to events for the gestures you're interested in.

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

注意

ナビゲーションと操作のジェスチャは、 GestureRecognizer のインスタンスで相互に排他的です。Navigation and Manipulation gestures are mutually exclusive on an instance of a GestureRecognizer.

ジェスチャのキャプチャを開始するStart capturing gestures

既定では、 GestureRecognizer は、 Startcapturinggestures () が呼び出されるまで、入力を監視しません。By default, a GestureRecognizer doesn't monitor input until StartCapturingGestures() is called. Stopcapturinggestures () が 処理されたフレーム の前に入力が実行された場合、 Stopcapturinggestures () が呼び出された後にジェスチャイベントが生成される可能性があります。It's possible that a gesture event may be generated after StopCapturingGestures() is called if input was performed before the frame where StopCapturingGestures() was processed. GestureRecognizer は、ジェスチャが実際に発生した前のフレームでオンまたはオフになっていたかどうかを記憶します。そのため、このフレームのターゲット設定に基づいてジェスチャの監視を開始および停止するのは安全です。The GestureRecognizer will remember whether it was on or off during the previous frame in which the gesture actually occurred, and so it's reliable to start and stop gesture monitoring based on this frame's gaze targeting.

recognizer.StartCapturingGestures();

ジェスチャのキャプチャを停止しますStop capturing gestures

ジェスチャ認識を停止するには:To stop gesture recognition:

recognizer.StopCapturingGestures();

ジェスチャ認識エンジンの削除Removing a gesture recognizer

GestureRecognizer オブジェクトを破棄する前に、サブスクライブされたイベントのサブスクリプションを解除してください。Remember to unsubscribe from subscribed events before destroying a GestureRecognizer object.

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

Unity でのモーションコントローラーモデルのレンダリングRendering the motion controller model in Unity

モーションコントローラーモデルとテレMotion Controller model and teleportation
モーションコントローラーモデルとテレMotion controller model and teleportation

ユーザーが保持している物理コントローラーに一致するモーションコントローラーをアプリでレンダリングし、さまざまなボタンが押されていることを明確にするために、 Mixed Reality Toolkitmotioncontroller prefab を使用できます。To render motion controllers in your app that match the physical controllers your users are holding and articulate as various buttons are pressed, you can use the MotionController prefab in the Mixed Reality Toolkit. この prefab は、システムのインストールされている motion controller ドライバーから、実行時に正しい glTF モデルを動的に読み込みます。This prefab dynamically loads the correct glTF model at runtime from the system's installed motion controller driver. これらのモデルは、エディターで手動でインポートするのではなく、動的に読み込むことが重要です。これにより、ユーザーが現在使用しているコントローラーと将来のコントローラーに対して、アプリケーションで物理的に正確な3D モデルが表示されるようになります。It's important to load these models dynamically rather than importing them manually in the editor, so that your app will show physically accurate 3D models for any current and future controllers your users may have.

  1. はじめにの手順に従って、Mixed Reality Toolkit をダウンロードし、Unity プロジェクトに追加します。Follow the Getting Started instructions to download the Mixed Reality Toolkit and add it to your Unity project.
  2. はじめにの手順の一部としてカメラを MixedRealityCameraParent prefab に置き換えると、お勧めします。If you replaced your camera with the MixedRealityCameraParent prefab as part of the Getting Started steps, you're good to go! この事前 fab には、モーションコントローラーレンダリングが含まれています。That prefab includes motion controller rendering. それ以外の場合は、 Assets/HoloToolkit/Input/Prefabs/MotionControllers を [プロジェクト] ウィンドウからシーンに追加します。Otherwise, add Assets/HoloToolkit/Input/Prefabs/MotionControllers.prefab into your scene from the Project pane. この prefab は、シーン内のユーザーが携帯電話に接続しているときに、カメラを移動するために使用する親オブジェクトの子として追加します。これにより、コントローラーはユーザーと共に表示されます。You'll want to add that prefab as a child of whatever parent object you use to move the camera around when the user teleports within your scene, so that the controllers come along with the user. アプリに電話移植が含まれていない場合は、シーンのルートに prefab を追加するだけです。If your app doesn't involve teleporting, just add the prefab at the root of your scene.

オブジェクトのスローThrowing objects

仮想現実のオブジェクトをスローすることは、最初に考えられるよりも難しい問題です。Throwing objects in virtual reality is a harder problem than it may at first seem. ほとんどの物理的な相互作用と同様に、ゲームでのスローは予期しない方法で動作しますが、immersion はすぐに明らかになり、壊れることがあります。As with most physically based interactions, when throwing in game acts in an unexpected way, it's immediately obvious and breaks immersion. 私たちは、物理的に正しいスロー動作を表す方法について、少し時間をかけてきました。また、お客様と共有するプラットフォームの更新によって有効になるガイドラインがいくつかあります。We've spent some time thinking deeply about how to represent a physically correct throwing behavior, and have come up with a few guidelines, enabled through updates to our platform, that we would like to share with you.

スローを実装する方法の例については、 こちらを参照してください。You can find an example of how we recommend to implement throwing here. このサンプルは、次の4つのガイドラインに従います。This sample follows these four guidelines:

  • 位置ではなく、コントローラーの ベロシティ を使用 します。Use the controller’s velocity instead of position. Windows の11月の更新プログラムでは、 ' ' 概算 ' ' 位置追跡状態での動作の変更が導入されました。In the November update to Windows, we introduced a change in behavior when in the ''Approximate'' positional tracking state. この状態になると、高い精度を維持している限り、コントローラーに関する速度に関する情報が引き続き報告されます。When in this state, velocity information about the controller will continue to be reported for as long as we believe its high accuracy, which is often longer than position remains high accuracy.

  • コントローラーの 角速度 を組み込み ます。Incorporate the angular velocity of the controller. このロジックはすべて、上記の throwing.cs リンクされ GetThrownObjectVelAngVel たパッケージ内の静的メソッドのファイルに含まれています。This logic is all contained in the throwing.cs file in the GetThrownObjectVelAngVel static method, within the package linked above:

    1. 角速度が節約であるため、スローされたオブジェクトは、スローの時点と同じ角度速度を維持する必要があります。 objectAngularVelocity = throwingControllerAngularVelocity;As angular velocity is conserved, the thrown object must maintain the same angular velocity as it had at the moment of the throw: objectAngularVelocity = throwingControllerAngularVelocity;

    2. スローされたオブジェクトの質量の中心がグリップの原因ではない可能性があるため、ユーザーの参照フレーム内のコントローラーの速度とは、ベロシティが異なる可能性があります。As the center of mass of the thrown object is likely not at the origin of the grip pose, it likely has a different velocity than that of the controller in the frame of reference of the user. この方法で発生したオブジェクトのベロシティの部分は、コントローラーの原点を中心としてスローされたオブジェクトの質量の中心となる瞬間流速度です。The portion of the object’s velocity contributed in this way is the instantaneous tangential velocity of the center of mass of the thrown object around the controller origin. この接線速度は、コントローラーの原点と、スローされたオブジェクトの質量の中心との距離を表すベクトルを使用して、コントローラーの角速度のクロス積です。This tangential velocity is the cross product of the angular velocity of the controller with the vector representing the distance between the controller origin and the center of mass of the thrown object.

      Vector3 radialVec = thrownObjectCenterOfMass - throwingControllerPos;
      Vector3 tangentialVelocity = Vector3.Cross(throwingControllerAngularVelocity, radialVec);
      
    3. スローされたオブジェクトの合計速度は、コントローラーのベロシティとこの接線速度の合計です。 objectVelocity = throwingControllerVelocity + tangentialVelocity;The total velocity of the thrown object is the sum of velocity of the controller and this tangential velocity: objectVelocity = throwingControllerVelocity + tangentialVelocity;

  • 速度を適用する 時間 に細心の注意を 払ってください。Pay close attention to the time at which we apply the velocity. ボタンを押すと、そのイベントが Bluetooth 経由でオペレーティングシステムに対してバブルアップされるまでに最大20ミリ秒かかることがあります。When a button is pressed, it can take up to 20 ms for that event to bubble up through Bluetooth to the operating system. これは、コントローラーの状態の変化をポーリングしたときに、押された状態または押されていない状態の変化をポーリングした場合に、そのコントローラーの状態が変更される前に発生します。This means that if you poll for a controller state change from pressed to not pressed or the other way around, the controller pose information you get with it will actually be ahead of this change in state. さらに、ポーリング API によって提示されるコントローラーは、フレームが表示されるときに発生する可能性があることを反映するためにフォワード予測が行われます。これは、今後20ミリ秒を超える可能性があります。Further, the controller pose presented by our polling API is forward predicted to reflect a likely pose at the time the frame will be displayed which could be more than 20 ms in the future. これは、保持されているオブジェクトを レンダリング する場合に適していますが、ユーザーがスローを解放した瞬間の軌道を計算するときに、オブジェクトを ターゲット にするための時間の問題が複雑になります。This is good for rendering held objects, but compounds our time problem for targeting the object as we calculate the trajectory for the moment the user released the throw. 幸いにも、11月の更新プログラムでは、 Interactionsourcepressed れた、 InteractionSourceReleased などの Unity イベントが送信されたときに、ボタンが押されたとき、または解放されたときに、状態に履歴情報が含まれています。Fortunately, with the November update, when a Unity event like InteractionSourcePressed or InteractionSourceReleased is sent, the state includes the historical pose data from back when the button was pressed or released. スロー中に正確なコントローラーレンダリングとコントローラーターゲットを取得するには、必要に応じて、ポーリングとイベントを正しく使用する必要があります。To get the most accurate controller rendering and controller targeting during throws, you must correctly use polling and eventing, as appropriate:

    • コントローラーが各フレームを レンダリング する場合、アプリは、現在のフレームの photon 時間に合わせて、コントローラーの オブジェクト を前方予測コントローラーに配置する必要があります。For controller rendering each frame, your app should position the controller's GameObject at the forward-predicted controller pose for the current frame’s photon time. このデータは、XR のような Unity ポーリング Api から取得し ます。InputTracking。 GetLocalPosition または XR。付い.GetCurrentReading を入力し ます。You get this data from Unity polling APIs like XR.InputTracking.GetLocalPosition or XR.WSA.Input.InteractionManager.GetCurrentReading.
    • プレスまたはリリースを対象とする コントローラー の場合、アプリは、そのプレスまたはリリースイベントのコントローラーの履歴に基づいて、軌道を raycast して計算する必要があります。For controller targeting upon a press or release, your app should raycast and calculate trajectories based on the historical controller pose for that press or release event. このデータは、Interactionmanager と同様に Unity イベント Api から取得し ます。 Interactionsource押さ れています。You get this data from Unity eventing APIs, like InteractionManager.InteractionSourcePressed.
  • グリップを使用 します。Use the grip pose. 角速度とベロシティは、ポインターではなく、グリップによって報告されます。Angular velocity and velocity are reported relative to the grip pose, not pointer pose.

今後の Windows 更新プログラムでは、のスローが引き続き改善され、詳細についてはここで確認できます。Throwing will continue to improve with future Windows updates, and you can expect to find more information on it here.

MRTK v2 のジェスチャとモーションコントローラーGesture and Motion Controllers in MRTK v2

入力マネージャーからジェスチャとモーションコントローラーにアクセスできます。You can access gesture and motion controller from the input Manager.

チュートリアルに従うFollow along with tutorials

詳細なカスタマイズ例が記載されたステップバイステップのチュートリアルは、Mixed Reality Academy でご利用いただけます。Step-by-step tutorials, with more detailed customization examples, are available in the Mixed Reality Academy:

MR 入力 213-モーションコントローラーMR Input 213 - Motion controller
MR 入力 213-モーションコントローラーMR Input 213 - Motion controller

次の開発チェックポイントNext Development Checkpoint

Unity の開発に関する体験に従っている場合は、MRTK コアのビルディングブロックを調べています。If you're following the Unity development journey we've laid out, you're in the midst of exploring the MRTK core building blocks. ここから、次の構成要素を続けることができます。From here, you can continue to the next building block:

または、Mixed Reality プラットフォームの機能と API に移動します。Or jump to Mixed Reality platform capabilities and APIs:

いつでも Unity 開発チェックポイントに戻ることができます。You can always go back to the Unity development checkpoints at any time.

関連項目See also