ジェスチャと Unity のアニメーション コント ローラーGestures and motion controllers in Unity

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

Unity は、Windows Mixed Reality、共通の空間の入力データにアクセスする 2 つの主な方法を提供しますInput.GetButton/Input.GetAxis複数の Unity XR Sdk 間で機能する Api とInteractionManager/。GestureRecognizer API の使用可能な空間の入力データの完全なセットを公開する Windows Mixed Reality を特定します。Unity provides two primary ways to access spatial input data for Windows Mixed Reality, the common Input.GetButton/Input.GetAxis APIs that work across multiple Unity XR SDKs, and an InteractionManager/GestureRecognizer API specific to Windows Mixed Reality that exposes the full set of spatial input data available.

Unity ボタン/軸マッピング テーブルUnity button/axis mapping table

次の表に、ボタンと軸の Id には、Windows Mixed Reality モーションのコント ローラーによる用 Unity の入力マネージャーではサポートされて、 Input.GetButton/GetAxis Api、「Windows MR 固有」列は、プロパティにはオフの使用可能なInteractionSourceState型。The button and axis IDs in the table below are supported in Unity's Input Manager for Windows Mixed Reality motion controllers through the Input.GetButton/GetAxis APIs, while the "Windows MR-specific" column refers to properties available off of the InteractionSourceState type. これらの各 Api については、以下のセクションで詳しく説明します。Each of these APIs are described in detail in the sections below.

Windows Mixed Reality をボタン/軸 ID のマッピングには、Oculus ボタン/軸 Id 一般と一致します。The button/axis ID mappings for Windows Mixed Reality generally match the Oculus button/axis IDs.

Windows Mixed Reality をボタン/軸 ID のマッピングは、2 つの方法で OpenVR のマッピングによって異なります。The button/axis ID mappings for Windows Mixed Reality differ from OpenVR's mappings in two ways:

  1. マッピングは、サムスティックおよびタッチパッドの両方のコント ローラーをサポートするために個別のサムスティックからいるタッチパッド Id を使用します。The mapping uses touchpad IDs that are distinct from thumbstick, to support controllers with both thumbsticks and touchpads.
  2. マッピングは、A と X ボタン物理 ABXY ボタンの使用可能なもののままにする Id、メニュー ボタンのオーバー ロードを回避できます。The mapping avoids overloading the A and X button IDs for the Menu buttons, to leave those available for physical ABXY buttons.
入力Input 一般的な Unity ApiCommon Unity APIs
(Input.GetButton/GetAxis)(Input.GetButton/GetAxis)
Windows MR に固有の入力 APIWindows MR-specific Input API
(ダンプします。WSA します。入力)(XR.WSA.Input)
左側にあります。Left hand 右側にあります。Right hand
押された選択のトリガーSelect trigger pressed 9 = 1.0 の軸Axis 9 = 1.0 10 = 1.0 の軸Axis 10 = 1.0 selectPressedselectPressed
トリガーのアナログ値を選択します。Select trigger analog value 軸 9Axis 9 軸 10Axis 10 selectPressedAmountselectPressedAmount
部分的に押された選択のトリガーSelect trigger partially pressed ボタンの 14 (ゲームパッド互換性) Button 14 (gamepad compat) ボタンの 15 (ゲームパッド互換性) Button 15 (gamepad compat) selectPressedAmount > 0.0selectPressedAmount > 0.0
押されたメニュー ボタンMenu button pressed ボタンの 6 \*Button 6\* ボタンの 7 \*Button 7\* menuPressedmenuPressed
グリップ ボタンが押されました。Grip button pressed 軸 11 = 1.0 (アナログ値なし)Axis 11 = 1.0 (no analog values)
ボタン 4 (ゲームパッド互換性) Button 4 (gamepad compat)
軸 12 = 1.0 (アナログ値なし)Axis 12 = 1.0 (no analog values)
ボタン 5 (ゲームパッド互換性) Button 5 (gamepad compat)
文章grasped
スティック X (左:-1.0、適切な。1.0) Thumbstick X (left: -1.0, right: 1.0) 軸 1Axis 1 軸 4Axis 4 thumbstickPosition.xthumbstickPosition.x
スティック Y (top:-1.0、下部にあります。1.0) Thumbstick Y (top: -1.0, bottom: 1.0) 軸 2Axis 2 軸 5Axis 5 thumbstickPosition.ythumbstickPosition.y
押されたスティックThumbstick pressed ボタンの 8Button 8 ボタンの 9Button 9 thumbstickPressedthumbstickPressed
タッチパッド X (左:-1.0、適切な。1.0) Touchpad X (left: -1.0, right: 1.0) 軸 17 \*Axis 17\* 軸 19 \*Axis 19\* touchpadPosition.xtouchpadPosition.x
タッチパッド Y (top:-1.0、下部にあります。1.0) Touchpad Y (top: -1.0, bottom: 1.0) 軸 18 \*Axis 18\* 軸 20 \*Axis 20\* touchpadPosition.ytouchpadPosition.y
タッチ タッチパッドTouchpad touched ボタンの 18 \*Button 18\* ボタンの 19 \*Button 19\* touchpadTouchedtouchpadTouched
押されたタッチパッドTouchpad pressed ボタンの 16 \*Button 16\* ボタンの 17 \*Button 17\* touchpadPressedtouchpadPressed
6 dof グリップ姿勢またはポインター姿勢6DoF grip pose or pointer pose グリップのみ発生します。XR.InputTracking.GetLocalPositionGrip pose only: XR.InputTracking.GetLocalPosition
XR.InputTracking.GetLocalRotationXR.InputTracking.GetLocalRotation
渡すグリップまたはポインターを引数として: sourceState.sourcePose.TryGetPositionPass Grip or Pointer as an argument: sourceState.sourcePose.TryGetPosition
sourceState.sourcePose.TryGetRotationsourceState.sourcePose.TryGetRotation
状態の追跡Tracking state 位置の精度とソース消失のリスクを MR に固有の API を介してのみ使用できます。 Position accuracy and source loss risk only available through MR-specific API sourceState.sourcePose.positionAccuracysourceState.sourcePose.positionAccuracy
sourceState.properties.sourceLossRisksourceState.properties.sourceLossRisk

注意

このボタン/軸 Id は、ゲームパッド、Oculus タッチと OpenVR で使用されるマッピングの競合による OpenVR に Unity を使用する Id によって異なります。These button/axis IDs differ from the IDs that Unity uses for OpenVR due to collisions in the mappings used by gamepads, Oculus Touch and OpenVR.

グリップの姿勢ポインティング ポーズとの比較Grip pose vs. pointing pose

Windows Mixed Reality は、さまざまなフォーム ファクターでモーションのコント ローラーをサポートしている、各コント ローラーの設計と、ユーザーの手の形の位置とそのアプリの方向を「転送」自然の間の関係の違いポイントを表示するときに使用する必要があります、コント ローラー。Windows Mixed Reality supports motion controllers in a variety of form factors, with each controller's design differing in its relationship between the user's hand position and the natural "forward" direction that apps should use for pointing when rendering the controller.

これらのコント ローラーをより適切に表すには、2 種類の各相互作用ソースを調査することができますが発生、グリップ姿勢ポインター姿勢します。To better represent these controllers, there are two kinds of poses you can investigate for each interaction source, the grip pose and the pointer pose. グリップ ポーズとポインター姿勢の両方の座標はグローバルの Unity ワールド座標内のすべての Unity Api で表されます。Both the grip pose and pointer pose coordinates are expressed by all Unity APIs in global Unity world coordinates.

グリップの姿勢Grip pose

グリップ姿勢HoloLens、によって検出された手の形の palm またはアニメーション コント ローラーを保持している片手で行うことのいずれかの場所を表します。The grip pose represents the location of either the palm of a hand detected by a HoloLens, or the palm holding a motion controller.

レンダリングに使用最適グリップ姿勢でイマーシブ ヘッドセット、ユーザーの手またはオブジェクトは、ユーザーの手の形で保持されている剣ガンなど、します。On immersive headsets, the grip pose is best used to render the user's hand or an object held in the user's hand, such as a sword or gun. グリップの姿勢は、として、アニメーション コント ローラーを視覚化するときにも使用、レンダリング可能なモデル運動の Windows で、コント ローラーは、送信元と回転の中心としてグリップ姿勢を使用して指定します。The grip pose is also used when visualizing a motion controller, as the renderable model provided by Windows for a motion controller uses the grip pose as its origin and center of rotation.

グリップ姿勢が具体的には次のように定義されています。The grip pose is defined specifically as follows:

  • 位置を握って:Palm 重心当然ながら、コント ローラーを保持しているときに、左または右中央にグリップ内の位置を調整します。The grip position: The palm centroid when holding the controller naturally, adjusted left or right to center the position within the grip. Windows Mixed Reality アニメーション コント ローラーで、この位置は把握ボタンで一般に揃えて配置します。On the Windows Mixed Reality motion controller, this position generally aligns with the Grasp button.
  • 向きの適切な軸を握って:5 本の指フラットな姿勢を形成する完全に開くと、射線は、palm に通常 (順方向から左 palm、適切な palm から旧バージョンとの)The grip orientation's Right axis: When you completely open your hand to form a flat 5-finger pose, the ray that is normal to your palm (forward from left palm, backward from right palm)
  • 向きの順方向軸を握って:部分的に (場合と同様、コント ローラーを保持している) の手の閉じるときに、"forward"チューブを通じて非 thumb 指によって形成されるポイントの半径。The grip orientation's Forward axis: When you close your hand partially (as if holding the controller), the ray that points "forward" through the tube formed by your non-thumb fingers.
  • 軸の向きを握って:右と前方参照の定義が含まれるアップ軸。The grip orientation's Up axis: The Up axis implied by the Right and Forward definitions.

グリップの姿勢をベンダー間入力のいずれかの Unity の API を通じてアクセスできます (XR します。InputTrackingします。GetLocalPosition/Rotation) または Windows MR 固有 API (sourceState.sourcePose.TryGetPosition/Rotation、データを要求して発生し得る、グリップノード)。You can access the grip pose through either Unity's cross-vendor input API (XR.InputTracking.GetLocalPosition/Rotation) or through the Windows MR-specific API (sourceState.sourcePose.TryGetPosition/Rotation, requesting pose data for the Grip node).

ポインターの姿勢Pointer pose

ポインター姿勢フォワード指し示すコント ローラーの先端を表します。The pointer pose represents the tip of the controller pointing forward.

システム指定のポインターの姿勢はしたら、最適な raycast に使用コント ローラー モデル自体のレンダリングします。The system-provided pointer pose is best used to raycast when you are rendering the controller model itself. 仮想の銃など、コント ローラーの代わりにその他の仮想オブジェクトをレンダリングする場合は光線ガンのアプリで定義されたモデルの軸に沿って移動するなど、その仮想オブジェクトの最も自然なレイでポイントする必要があります。If you are rendering some other virtual object in place of the controller, such as a virtual gun, you should point with a ray that is most natural for that virtual object, such as a ray that travels along the barrel of the app-defined gun model. 仮想オブジェクトと物理のコント ローラーではないユーザーが表示できるため、仮想オブジェクトでポイントがあります、アプリを使用してこれらのより自然です。Because users can see the virtual object and not the physical controller, pointing with the virtual object will likely be more natural for those using your app.

現時点では、ポインターの姿勢は Windows MR 固有の API を介してのみで使用できるsourceState.sourcePose.TryGetPosition/Rotationで渡しInteractionSourceNode.Pointerとして、引数。Currently, the pointer pose is available in Unity only through the Windows MR-specific API, sourceState.sourcePose.TryGetPosition/Rotation, passing in InteractionSourceNode.Pointer as the argument.

コント ローラーの状態の追跡Controller tracking state

ヘッドセットなど、Windows Mixed Reality モーションのコント ローラーの外部の追跡のセンサーのセットアップは必要ありません。Like the headsets, the Windows Mixed Reality motion controller requires no setup of external tracking sensors. 代わりに、コント ローラーは、ヘッドセット自体のセンサーによって追跡されます。Instead, the controllers are tracked by sensors in the headset itself.

場合は、ユーザーは、ヘッドセットのビューのフィールドからコント ローラーを移動、ほとんどの場合 Windows 引き続きコント ローラーの位置を推測し、アプリに提供されます。If the user moves the controllers out of the headset's field of view, in most cases Windows will continue to infer controller positions and provide them to the app. ときに、コント ローラーの位置を正確度のおおよその位置にドロップは、十分な時間のビジュアルの追跡、コント ローラーを失いました。When the controller has lost visual tracking for long enough, the controller's positions will drop to approximate-accuracy positions.

この時点では、システムは、本文ロックをコント ローラーをユーザーに、その内部方位センサーを使用して、コント ローラーの場合は true。 向きを引き続き公開中に移動する場合に、ユーザーの位置を追跡します。At this point, the system will body-lock the controller to the user, tracking the user's position as they move around, while still exposing the controller's true orientation using its internal orientation sensors. ポイントし、UI 要素をアクティブ化するコント ローラーを使用する多くのアプリが、ユーザーのルーティング グループおおよその精度で通常どおり操作できます。Many apps that use controllers to point at and activate UI elements can operate normally while in approximate accuracy without the user noticing.

これを理解する最善の方法は、自分で試すです。The best way to get a feel for this is to try it yourself. さまざまな追跡の状態の間でアニメーション コント ローラーで動作する没入型のコンテンツの例では、このビデオをご覧ください。Check out this video with examples of immersive content that works with motion controllers across various tracking states:


明示的に状態の追跡についての考え方Reasoning about tracking state explicitly

位置に応じて異なる状態の追跡を処理するアプリがさらに可能性がありなど、コント ローラーの状態のプロパティを検査SourceLossRiskPositionAccuracy:Apps that wish to treat positions differently based on tracking state may go further and inspect properties on the controller's state, such as SourceLossRisk and PositionAccuracy:

状態の追跡Tracking state SourceLossRiskSourceLossRisk PositionAccuracyPositionAccuracy TryGetPositionTryGetPosition
高精度 High accuracy < 1.0< 1.0 High truetrue
高精度 (損失の危険) High accuracy (at risk of losing) == 1.0== 1.0 High truetrue
おおよその精度 Approximate accuracy == 1.0== 1.0 ApproximateApproximate truetrue
位置 No position == 1.0== 1.0 ApproximateApproximate falsefalse

これらのアニメーション コント ローラー追跡状態の定義は次のとおりです。These motion controller tracking states are defined as follows:

  • 高精度は: ヘッドセットのビューのフィールド内のモーション コント ローラーは、中には、高精度の位置、ビジュアルの追跡に基づく一般に提供します。High accuracy: While the motion controller is within the headset's field of view, it will generally provide high-accuracy positions, based on visual tracking. 注移動コント ローラーを一時的にビューのフィールドのままにヘッドセット センサーから一時的に隠されている (などによって、ユーザーの一方) を返すコント ローラーの慣性による追跡に基づく、短時間、高精度ポーズは引き続き自体。Note that a moving controller that momentarily leaves the field of view or is momentarily obscured from the headset sensors (e.g. by the user's other hand) will continue to return high-accuracy poses for a short time, based on inertial tracking of the controller itself.
  • (データが失われる危険性) が高精度は: ユーザーは、過去のヘッドセットの視野の edge モーション コント ローラーを移動したとき、ヘッドセットすぐにできなくコント ローラーの位置を視覚的に追跡するためにします。High accuracy (at risk of losing): When the user moves the motion controller past the edge of the headset's field of view, the headset will soon be unable to visually track the controller's position. アプリが、コント ローラーが達したらこの FOV 境界を見ることによって、 SourceLossRisk 1.0 に到達します。The app knows when the controller has reached this FOV boundary by seeing the SourceLossRisk reach 1.0. その時点では、アプリは、コント ローラーのジェスチャを非常に高品質なポーズの流れを必要とするを一時停止する選択できます。At that point, the app may choose to pause controller gestures that require a steady stream of very high-quality poses.
  • 近似精度は: ときに、コント ローラーの位置を正確度のおおよその位置にドロップは、十分な時間のビジュアルの追跡、コント ローラーを失いました。Approximate accuracy: When the controller has lost visual tracking for long enough, the controller's positions will drop to approximate-accuracy positions. この時点では、システムは、本文ロックをコント ローラーをユーザーに、その内部方位センサーを使用して、コント ローラーの場合は true。 向きを引き続き公開中に移動する場合に、ユーザーの位置を追跡します。At this point, the system will body-lock the controller to the user, tracking the user's position as they move around, while still exposing the controller's true orientation using its internal orientation sensors. ポイントし、UI 要素をアクティブ化するコント ローラーを使用する多くのアプリは、ユーザーのルーティング グループおおよその精度で通常 while として動作できます。Many apps that use controllers to point at and activate UI elements can operate as normal while in approximate accuracy without the user noticing. やや入力要件がアプリからこのドロップを理解することもできます精度Approximate精度を調べることによって、 PositionAccuracyプロパティのこの期間中に画面外のターゲットについて、ユーザー寛大な hitbox を提供する例です。Apps with heavier input requirements may choose to sense this drop from High accuracy to Approximate accuracy by inspecting the PositionAccuracy property, for example to give the user a more generous hitbox on off-screen targets during this time.
  • 位置: コント ローラーは、おおよその精度で長時間動作、中に場合があります、システムを知っていることも、本文ロック位置が意味のある現時点で。No position: While the controller can operate at approximate accuracy for a long time, sometimes the system knows that even a body-locked position is not meaningful at the moment. など、コント ローラーだけを有効にする可能性がありますことはありませんされてまたは計測される視覚的に、ユーザーが、他のユーザーによってピックアップされるコント ローラーを設定します。For example, a controller that was just turned on may have never been observed visually, or a user may put down a controller that's then picked up by someone else. これらのタイミングで、システムが提供しないアプリに任意の位置とTryGetPositionは false を返します。At those times, the system will not provide any position to the app, and TryGetPosition will return false.

一般的な Unity Api (Input.GetButton/GetAxis)Common Unity APIs (Input.GetButton/GetAxis)

*名前空間:***UnityEngine, UnityEngine.XRNamespace: UnityEngine, UnityEngine.XR
:Input, XR.InputTrackingTypes: Input, XR.InputTracking

Unity は、現在の [全般] を使用してInput.GetButton/Input.GetAxisの入力を公開する Api Oculus SDKOpenVR SDKと Windows Mixed Reality を含む手およびモーションのコント ローラー。Unity currently uses its general Input.GetButton/Input.GetAxis APIs to expose input for the Oculus SDK, the OpenVR SDK and Windows Mixed Reality, including hands and motion controllers. 場合は、アプリでは、これらの Api を使用して、入力、Windows Mixed Reality を含め、複数の XR Sdk 間で簡単にアニメーション コント ローラーをサポートできます。If your app uses these APIs for input, it can easily support motion controllers across multiple XR SDKs, including Windows Mixed Reality.

論理のボタンの押下状態の取得Getting a logical button's pressed state

一般的な Unity 入力 Api を使用する通常から始めますボタンと軸での論理名を接続、 Unity 入力マネージャー、ボタンまたは軸の Id をそれぞれの名前にバインドします。To use the general Unity input APIs, you'll typically start by wiring up buttons and axes to logical names in the Unity Input Manager, binding a button or axis IDs to each name. そのボタン/軸の論理名を参照するコードを記述できます。You can then write code that refers to that logical button/axis name.

たとえば、送信アクションを左側のモーション コント ローラーのトリガー ボタンをマップするに移動編集 > プロジェクトの設定 > 入力Unity 内で送信セクション 軸のプロパティ を展開します。For example, to map the left motion controller's trigger button to the Submit action, go to Edit > Project Settings > Input within Unity, and expand the properties of the Submit section under Axes. 変更、正ボタンまたはAlt 正ボタンプロパティを読み取るジョイスティック ボタン 14、次のように。Change the Postive Button or Alt Positive Button property to read joystick button 14, like this:

Unity の InputManagerUnity's InputManager
Unity InputManagerUnity InputManager

送信アクションを使用して、スクリプトをチェックし、 Input.GetButton:Your script can then check for the Submit action using Input.GetButton:

if (Input.GetButton("Submit"))
{
  // ...
}

変更することより論理的ボタンを追加することができます、サイズのプロパティの します。You can add more logical buttons by changing the Size property under Axes.

直接物理ボタンの押下状態の取得Getting a physical button's pressed state directly

アクセスすることもボタン手動で、その完全修飾名を使用してInput.GetKey:You can also access buttons manually by their fully-qualified name, using Input.GetKey:

if (Input.GetKey("joystick button 8"))
{
  // ...
}

手動またはモーション コント ローラーの姿勢を取得します。Getting a hand or motion controller's pose

位置と、コント ローラーの回転にアクセスすることができますを使用してXR します。InputTracking:You can access the position and rotation of the controller, using XR.InputTracking:

Vector3 leftPosition = InputTracking.GetLocalPosition(XRNode.LeftHand);
Quaternion leftRotation = InputTracking.GetLocalRotation(XRNode.LeftHand);

注 (ユーザーは、コント ローラーを保持) コント ローラーのグリップの姿勢を表すは剣またはユーザーの手の形、またはコント ローラー自体のモデルでガンをレンダリングするために便利です。Note that this represents the controller's grip pose (where the user holds the controller), which is useful for rendering a sword or gun in the user's hand, or a model of the controller itself.

このグリップ ポーズと (コント ローラーのヒントを指している) ポインター姿勢間のリレーションシップは、コント ローラー間で異なる場合がありますに注意してください。Note that the relationship between this grip pose and the pointer pose (where the tip of the controller is pointing) may differ across controllers. この時点で、コント ローラーのポインターの姿勢にアクセスする MR 固有の入力では、以下のセクションで説明されている API を通じて実現できる、のみできます。At this moment, accessing the controller's pointer pose is only possible through the MR-specific input API, described in the sections below.

Windows 固有の Api (XR します。WSA します。入力)Windows-specific APIs (XR.WSA.Input)

*名前空間:***UnityEngine.XR.WSA.InputNamespace: UnityEngine.XR.WSA.Input
:InteractionManagerInteractionSourceStateInteractionSourceInteractionSourcePropertiesInteractionSourceKindInteractionSourceLocationTypes: InteractionManager, InteractionSourceState, InteractionSource, InteractionSourceProperties, InteractionSourceKind, InteractionSourceLocation

Windows に固有の空間入力 Api を使用して選択できます (HoloLens) 用の Windows Mixed Reality 手入力およびモーションのコント ローラーの詳細情報を取得する、 UnityEngine.XR.WSA.Input名前空間。To get at more detailed information about Windows Mixed Reality hand input (for HoloLens) and motion controllers, you can choose to use the Windows-specific spatial input APIs under the UnityEngine.XR.WSA.Input namespace. 位置の精度などの追加情報やハンドと離れているコント ローラーに指示することができます、ソースの種類にアクセスできます。This lets you access additional information, such as position accuracy or the source kind, letting you tell hands and controllers apart.

手およびモーションのコント ローラーの状態のポーリングPolling for the state of hands and motion controllers

各相互作用ソース (手動またはモーションのコント ローラー) を使用するため、このフレームの状態をポーリングすることができます、 GetCurrentReadingメソッド。You can poll for this frame's state for each interaction source (hand or motion controller) using the GetCurrentReading method.

var interactionSourceStates = InteractionManager.GetCurrentReading();
foreach (var interactionSourceState in interactionSourceStates) {
    // ...
}

InteractionSourceState取得したバックアップは現在時点での相互作用ソースを表します。Each InteractionSourceState you get back represents an interaction source at the current moment in time. InteractionSourceStateなどの情報を公開します。The InteractionSourceState exposes info such as:

  • これは、種類押すの(選択/メニュー/理解/タッチパッド/スティック) が発生しています。Which kinds of presses are occurring (Select/Menu/Grasp/Touchpad/Thumbstick)

    if (interactionSourceState.selectPressed) {
         // ...
    }
    
  • アニメーション コント ローラー、このようなタッチパッド スティックの XY 座標やタッチされた状態に固有の他のデータOther data specific to motion controllers, such the touchpad and/or thumbstick's XY coordinates and touched state

    if (interactionSourceState.touchpadTouched && interactionSourceState.touchpadPosition.x > 0.5) {
         // ...
    }
    
  • かどうか、ソースは、手動またはモーション コント ローラーを把握する InteractionSourceKindThe InteractionSourceKind to know if the source is a hand or a motion controller

    if (interactionSourceState.source.kind == InteractionSourceKind.Hand) {
         // ...
    }
    

順方向予測レンダリング ポーズのポーリングPolling for forward-predicted rendering poses

  • ハンドとコント ローラーからの相互作用のソース データのポーリングをするときに取得することはこのフレームの光子は、ユーザーの目に到達時間でしばらくの間、順方向予測ポーズにします。When polling for interaction source data from hands and controllers, the poses you get are forward-predicted poses for the moment in time when this frame's photons will reach the user's eyes. これらの前方予測ポーズに適してレンダリングコント ローラーまたは、保持されているオブジェクトの各フレーム。These forward-predicted poses are best used for rendering the controller or a held object each frame. 指定したキーを押してを対象とするまたはコント ローラーでリリースする場合は、履歴イベントを以下に示す Api を使用する場合、最も正確ながあります。If you are targeting a given press or release with the controller, that will be most accurate if you use the historical event APIs described below.

    var sourcePose = interactionSourceState.sourcePose;
    Vector3 sourceGripPosition;
    Quaternion sourceGripRotation;
    if ((sourcePose.TryGetPosition(out sourceGripPosition, InteractionSourceNode.Grip)) &&
         (sourcePose.TryGetRotation(out sourceGripRotation, InteractionSourceNode.Grip))) {
         // ...
    }
    
  • この現在のフレームの前方予測ヘッド姿勢を取得することもできます。You can also get the forward-predicted head pose for this current frame. ソース姿勢で、この場合に便利ですがレンダリングカーソルを指定したキーを押してやリリースを対象とする履歴イベントを以下に示す Api を使用する場合は、最も正確はできます。As with the source pose, this is useful for rendering a cursor, although targeting a given press or release will be most accurate if you use the historical event APIs described below.

    var headPose = interactionSourceState.headPose;
    var headRay = new Ray(headPose.position, headPose.forward);
    RaycastHit raycastHit;
    if (Physics.Raycast(headPose.position, headPose.forward, out raycastHit, 10)) {
         var cursorPos = raycastHit.point;
         // ...
    }
    

相互作用のソース イベントの処理Handling interaction source events

履歴姿勢の正確なデータが発生したときに、入力イベントを処理するためには、ポーリングではなく相互作用ソース イベントを処理することができます。To handle input events as they happen with their accurate historical pose data, you can handle interaction source events instead of polling.

相互作用のソースのイベントを処理するには。To handle interaction source events:

  • 登録、 InteractionManager入力イベント。Register for a InteractionManager input event. 興味のある操作イベントの種類ごとには、サブスクライブする必要があります。For each type of interaction event that you are interested in, you need to subscribe to it.

    InteractionManager.InteractionSourcePressed += InteractionManager_InteractionSourcePressed;
    
  • イベントを処理します。Handle the event. 相互作用のイベントにサブスクライブしていると該当する場合に、コールバックが返されます。Once you have subscribed to an interaction event, you will get the callback when appropriate. SourcePressed例では、これになります、ソースが検出された後、リリースまたは紛失前にします。In the SourcePressed example, this will be after the source was detected and before it is released or lost.

    void InteractionManager_InteractionSourceDetected(InteractionSourceDetectedEventArgs args)
         var interactionSourceState = args.state;
    
         // args.state has information about:
            // targeting head ray at the time when the event was triggered
            // whether the source is pressed or not
            // properties like position, velocity, source loss risk
            // source id (which hand id for example) and source kind like hand, voice, controller or other
    }
    

イベントの処理を停止する方法How to stop handling an event

イベントに興味のある不要になったか、イベントにサブスクライブしているオブジェクトを破棄するときに、イベントの処理を停止する必要があります。You need to stop handling an event when you are no longer interested in the event or you are destroying the object that has subscribed to the event. イベントの処理を停止するには、購読を解除するイベントです。To stop handling the event, you unsubscribe from the event.

InteractionManager.InteractionSourcePressed -= InteractionManager_InteractionSourcePressed;

相互作用のソース イベントの一覧List of interaction source events

ソース イベントの使用可能な操作は次のとおりです。The available interaction source events are:

  • InteractionSourceDetected (ソースがアクティブになります)InteractionSourceDetected (source becomes active)
  • InteractionSourceLost (非アクティブになります)InteractionSourceLost (becomes inactive)
  • InteractionSourcePressed (タップ、ボタンの押下、または"Select"発音)InteractionSourcePressed (tap, button press, or "Select" uttered)
  • InteractionSourceReleased (タップして、ボタンが解放された、または"Select"発音の最後の終了)InteractionSourceReleased (end of a tap, button released, or end of "Select" uttered)
  • InteractionSourceUpdated (移動またはいくつかの状態を変更するそれ以外の場合)InteractionSourceUpdated (moves or otherwise changes some state)

イベント キーを押してまたはリリースを最も正確に一致する履歴の対象とすることをEvents for historical targeting poses that most accurately match a press or release

前に説明したポーリング Api では、順方向予測ポーズ アプリを提供します。The polling APIs described earlier give your app forward-predicted poses. これらの予測が発生は、コント ローラーまたは仮想のハンドヘルド オブジェクトのレンダリングに最適ですが、将来ポーズが対象とする、2 つの主な理由のために最適でないです。While those predicted poses are best for rendering the controller or a virtual handheld object, future poses are not optimal for targeting, for two key reasons:

  • ユーザーは、コント ローラー上のボタンを押すと、ありますワイヤレスの待機時間の約 20 ミリ秒遅らせます Bluetooth 経由で、システムは、キーを押してを受信する前に。When the user presses a button on a controller, there can be about 20ms of wireless latency over Bluetooth before the system receives the press.
  • 次を使用する場合前方予測の姿勢では、ある前方の予測のもう 1 つの 10-20 ミリ秒に適用される現在のフレームの光子は、ユーザーの目に到達する時間を対象します。Then, if you are using a forward-predicted pose, there would be another 10-20ms of forward prediction applied to target the time when the current frame's photons will reach the user's eyes.

つまり、ポーリングは、ソースの姿勢をまたはヘッドからユーザーの head と手実際にが、キーを押してまたはリリースが発生したときに 30 40 転送が発生します。This means that polling gives you a source pose or head pose that is 30-40ms forward from where the user's head and hands actually were back when the press or release happened. HoloLens 手入力する場合、ワイヤレス通信の遅延はありませんは、キーを押してを検出するような処理の遅延です。For HoloLens hand input, while there's no wireless transmission delay, there is a similar processing delay to detect the press.

手動またはコント ローラーのキーを押してのユーザーの本来の目的に基づいてターゲット正確には、履歴ソース姿勢またはからヘッドの姿勢を使用する必要がありますInteractionSourcePressedまたはInteractionSourceReleased入力イベント。To accurately target based on the user's original intent for a hand or controller press, you should use the historical source pose or head pose from that InteractionSourcePressed or InteractionSourceReleased input event.

対象に、キーを押してまたはユーザーの頭またはそのコント ローラーからデータを履歴姿勢でリリースできます。You can target a press or release with historical pose data from the user's head or their controller:

  • ジェスチャまたはコント ローラーを押したときの時点でヘッド姿勢が発生したために使用できるを対象とする、ユーザーが何を確認するgazingで。The head pose at the moment in time when a gesture or controller press occurred, which can be used for targeting to determine what the user was gazing at:

    void InteractionManager_InteractionSourcePressed(InteractionSourcePressedEventArgs args) {
         var interactionSourceState = args.state;
         var headPose = interactionSourceState.headPose;
         RaycastHit raycastHit;
         if (Physics.Raycast(headPose.position, headPose.forward, out raycastHit, 10)) {
             var targetObject = raycastHit.collider.gameObject;
             // ...
         }
    }
    
  • アニメーション コント ローラーを押したときの時点でソース姿勢が発生したために使用できるを対象とするをどのようなユーザー指定のコント ローラーを決定します。The source pose at the moment in time when a motion controller press occurred, which can be used for targeting to determine what the user was pointing the controller at. これをキーを押してが発生したコント ローラーの状態となります。This will be the state of the controller that experienced the press. コント ローラー自体をレンダリングする場合は、グリップ姿勢で、ユーザーが検討事項のコント ローラーを表示する自然なヒントからターゲット光線を撮影するではなく、ポインターの姿勢を要求できます。If you are rendering the controller itself, you can request the pointer pose rather than the grip pose, to shoot the targeting ray from what the user will consider the natural tip of that rendered controller:

    void InteractionManager_InteractionSourcePressed(InteractionSourcePressedEventArgs args)
    {
         var interactionSourceState = args.state;
         var sourcePose = interactionSourceState.sourcePose;
         Vector3 sourceGripPosition;
         Quaternion sourceGripRotation;
         if ((sourcePose.TryGetPosition(out sourceGripPosition, InteractionSourceNode.Pointer)) &&
             (sourcePose.TryGetRotation(out sourceGripRotation, InteractionSourceNode.Pointer))) {
             RaycastHit raycastHit;
             if (Physics.Raycast(sourceGripPosition, sourceGripRotation * Vector3.forward, out raycastHit, 10)) {
                 var targetObject = raycastHit.collider.gameObject;
                 // ...
             }
         }
    }
    

イベント ハンドラーの例Event handlers example

using UnityEngine.XR.WSA.Input;

void Start()
{
    InteractionManager.InteractionSourceDetected += InteractionManager_InteractionSourceDetected;
    InteractionManager.InteractionSourceLost += InteractionManager_InteractionSourceLost;
    InteractionManager.InteractionSourcePressed += InteractionManager_InteractionSourcePressed;
    InteractionManager.InteractionSourceReleased += InteractionManager_InteractionSourceReleased;
    InteractionManager.InteractionSourceUpdated += InteractionManager_InteractionSourceUpdated;
}

void OnDestroy()
{
    InteractionManager.InteractionSourceDetected -= InteractionManager_InteractionSourceDetected;
    InteractionManager.InteractionSourceLost -= InteractionManager_InteractionSourceLost;
    InteractionManager.InteractionSourcePressed -= InteractionManager_InteractionSourcePressed;
    InteractionManager.InteractionSourceReleased -= InteractionManager_InteractionSourceReleased;
    InteractionManager.InteractionSourceUpdated -= InteractionManager_InteractionSourceUpdated;
}

void InteractionManager_InteractionSourceDetected(InteractionSourceDetectedEventArgs args)
{
    // Source was detected
    // args.state has the current state of the source including id, position, kind, etc.
}

void InteractionManager_InteractionSourceLost(InteractionSourceLostEventArgs state)
{
    // Source was lost. This will be after a SourceDetected event and no other events for this
    // source id will occur until it is Detected again
    // args.state has the current state of the source including id, position, kind, etc.
}

void InteractionManager_InteractionSourcePressed(InteractionSourcePressedEventArgs state)
{
    // Source was pressed. This will be after the source was detected and before it is 
    // released or lost
    // args.state has the current state of the source including id, position, kind, etc.
}

void InteractionManager_InteractionSourceReleased(InteractionSourceReleasedEventArgs state)
{
    // Source was released. The source would have been detected and pressed before this point. 
    // This event will not fire if the source is lost
    // args.state has the current state of the source including id, position, kind, etc.
}

void InteractionManager_InteractionSourceUpdated(InteractionSourceUpdatedEventArgs state)
{
    // Source was updated. The source would have been detected before this point
    // args.state has the current state of the source including id, position, kind, etc.
}

高度な複合 gesture Api (GestureRecognizer)High-level composite gesture APIs (GestureRecognizer)

*名前空間:***UnityEngine.XR.WSA.InputNamespace: 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 上の各ジェスチャ イベントは、イベントの時刻に、入力としてターゲット ヘッド レイ、SourceKind を提供します。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

使用して興味があるジェスチャを指定SetRecognizableGestures():Specify which gestures you are interested in via SetRecognizableGestures():

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

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

興味のあるジェスチャのイベントをサブスクライブします。Subscribe to events for the gestures you are 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 does not monitor input until StartCapturingGestures() is called. 後に、ジェスチャ イベントを生成することことができますStopCapturingGestures() 入力は、フレーム前に実行されている場合に呼び出されますが、 StopCapturingGestures() が処理されました。It is possible that a gesture event may be generated after StopCapturingGestures() is called if input was performed before the frame where StopCapturingGestures() was processed. GestureRecognizerと覚えておいてくださいかどうかに、ジェスチャは実際に発生した、previou フレームの間にオンまたはオフをだとためが開始する信頼性の高いを対象とするこのフレームの視線の先に基づくジェスチャの監視を停止します。The GestureRecognizer will remember whether it was on or off during the previou frame in which the gesture actually occurred, and so it is 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

アニメーション コント ローラー モデルと teleportationMotion Controller model and teleportation
アニメーション コント ローラー モデルと teleportationMotion controller model and teleportation

物理コント ローラーを保持するいると、ユーザーおよびのさまざまなボタンが押されているように明確に一致するアプリでのモーション コントローラを表示するために使用することができます、 MotionController プレハブで、 Mixed Reality ツールキット.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. このプレハブは、システムのインストールされているアニメーション コント ローラー ドライバーから動的に実行時に正しい 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. に従って、 Getting Started 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! そのプレハブには、アニメーション コント ローラーの表示が含まれます。That prefab includes motion controller rendering. それ以外の場合、追加Assets/HoloToolkit/Input/Prefabs/MotionControllers.prefabプロジェクト ウィンドウからシーンにします。Otherwise, add Assets/HoloToolkit/Input/Prefabs/MotionControllers.prefab into your scene from the Project pane. 親オブジェクトの子としてプレハブを使用することときに中心にカメラを移動する追加たい、シーン内でユーザー teleports コント ローラーがユーザーと共に取得できるようにします。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. アプリが teleporting を伴わない場合、シーンのルートにある、プレハブを追加します。If your app does not involve teleporting, just add the prefab at the root of your scene.

オブジェクトをスローします。Throwing objects

困難な問題は、仮想現実でのオブジェクトをスローし、最初に見えるかもしれません。Throwing objects in virtual reality is a harder problem then it may at first seem. 同様に物理的に最もベースの対話、予期しない方法でゲームの動作でスローするときに、それがすぐにわかる immersion を中断します。As with most physically based interactions, when throwing in game acts in an unexpected way, it is immediately obvious and breaks immersion. 物理的に正しいのスロー動作を表し、当社のプラットフォームをお客様と共有したいに更新を有効になっているいくつかのガイドラインを思い付く方法について深く考える時間がいくつかを費やしてきました。We have 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:

  • コント ローラーを使用して、 velocity位置ではなくします。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 it is 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 then 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 thus 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 20ms 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 vice versa, 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 then 20ms 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 their throw. さいわい、Unity のイベントのような場合は、11 月の更新でInteractionSourcePressedまたはInteractionSourceReleased送信されると、状態には、履歴の姿勢データが含まれていますから戻るときに、ボタン実際には、押された状態またはリリースしました。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 actually pressed or released. 最も正確なコント ローラーの表示とスロー時に対象とするコント ローラーを取得するには、適切なポーリングとをイベントを使用する必要があります正しく。To get the most accurate controller rendering and controller targeting during throws, you must correctly use polling and eventing, as appropriate:

    • コント ローラーのレンダリングフレームごとに、アプリは、コント ローラーを配置する必要がありますGameObject前方予測コント ローラーで、現在のフレームの 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. ポーリング Api などの Unity からこのデータを取得する*XR します。InputTracking.GetLocalPosition* または XR します。WSA します。Input.InteractionManager.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. ように Unity イベント Api からこのデータを取得する InteractionManager.InteractionSourcePressed します。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.

Mixed Reality Toolkit を使用した開発を高速化します。Accelerate development with Mixed Reality Toolkit

InputManager と Unity で MotionController に関する 2 つの例のシーンがあります。There are two example scenes about InputManager and MotionController in Unity. これらのシーンの中から MRTK の InputManager を使用して、アニメーション コント ローラー ボタンからデータ イベントの処理を活用する方法を確認できます。Through these scenes, you can learn how to use MRTK's InputManager and access data handle events from the motion controller buttons.

入力例 MRTK シーンInput example scenes in MRTK
入力例 MRTK シーンInput example scenes in MRTK

自動のシーンのセットアップAutomatic scene setup

インポートするときにMRTK が Unity パッケージをリリースからプロジェクトを複製するか、 GitHub リポジトリUnity で新しいメニュー ' Mixed Reality Toolkit' を検索します。When you import MRTK release Unity packages or clone the project from the GitHub repository, you are going to find a new menu 'Mixed Reality Toolkit' in Unity. [構成] メニューで、' Mixed Reality シーン設定の適用 ' メニューが表示されます。Under 'Configure' menu, you will see the menu 'Apply Mixed Reality Scene Settings'. 既定のカメラを削除し、基本コンポーネントを追加します。 これをクリックすると InputManagerMixedRealityCameraParent、およびDefaultCursorします。When you click it, it removes the default camera and adds foundational components - InputManager, MixedRealityCameraParent, and DefaultCursor.

シーンのセットアップの MRTK メニューMRTK Menu for scene setup
シーンのセットアップの MRTK メニューMRTK Menu for scene setup

MRTK で自動シーンのセットアップAutomatic scene setup in MRTK
MRTK で自動シーンのセットアップAutomatic scene setup in MRTK

MixedRealityCamera プレハブMixedRealityCamera prefab

これらのプロジェクト パネルから手動で追加できます。You can also manually add these from the project panel. プレハブとしてこれらのコンポーネントを見つけることができます。You can find these components as prefabs. 検索する場合にMixedRealityCamera、2 つの異なるカメラ プレハブを表示することができます。When you search MixedRealityCamera, you will be able to see two different camera prefabs. 違いは、 MixedRealityCameraはカメラのみプレハブは、 MixedRealityCameraParent Teleportation、モーションなどイマーシブ ヘッドセットの追加のコンポーネントが含まれていますコント ローラーと、境界。The difference is, MixedRealityCamera is the camera only prefab whereas, MixedRealityCameraParent includes additional components for the immersive headsets such as Teleportation, Motion Controller and, Boundary.

MRTK でカメラのプレハブCamera prefabs in MRTK
MRTK でカメラのプレハブCamera prefabs in MRTK

MixedRealtyCamera HoloLens とイマーシブ ヘッドセットの両方をサポートします。MixedRealtyCamera supports both HoloLens and immersive headset. デバイスの種類を検出し、フラグをクリアし、スカイ ボックスなどのプロパティを最適化します。It detects the device type and optimizes the properties such as clear flags and Skybox. 以下、アニメーション コント ローラー モデルでは、カスタムのカーソルなどをカスタマイズでき、Floor、便利なプロパティの一部を見つけることができます。Below you can find some of the useful properties you can customize such as custom Cursor, Motion Controller models, and Floor.

カーソルと床面、モーションのコント ローラーのプロパティProperties for the Motion controller, Cursor and Floor
カーソルと床面、モーションのコント ローラーのプロパティProperties for the Motion controller, Cursor and Floor

チュートリアルの手順に従う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

関連項目See also