手および DirectX でモーション コント ローラーHands and motion controllers in DirectX

Windows Mixed Reality の両方を渡すとモーションのコント ローラーで見つかった空間入力 Api を通じて入力を処理、 Windows.UI.Input.Spatial名前空間。In Windows Mixed Reality, both hand and motion controller input is handled through the spatial input APIs, found in the Windows.UI.Input.Spatial namespace. などの一般的なアクションを簡単に処理できます選択ハンドとアニメーション コント ローラーの両方で同じ方法を押します。This enables you to easily handle common actions like Select presses the same way across both hands and motion controllers.

概要Getting started

Windows Mixed Reality で入力するアクセスの空間、するには、SpatialInteractionManager インターフェイスを起動します。To access spatial input in Windows Mixed Reality, start with the SpatialInteractionManager interface. このインターフェイスを呼び出すことによってアクセスできるSpatialInteractionManager::GetForCurrentView、通常は、アプリの起動中のある時点からです。You can access this interface by calling SpatialInteractionManager::GetForCurrentView, typically sometime during app startup.

using namespace winrt::Windows::UI::Input::Spatial;

SpatialInteractionManager interactionManager = SpatialInteractionManager::GetForCurrentView();

SpatialInteractionManager のジョブはへのアクセスを提供するSpatialInteractionSources入力のソースを表します。The SpatialInteractionManager's job is to provide access to SpatialInteractionSources, which represent a source of input. SpatialInteractionSources の 3 つの種類は、システムで使用できます。There are three kinds of SpatialInteractionSources available in the system.

  • ハンド検出されたユーザーの手の形を表します。Hand represents a user's detected hand. 手動のソースは、HoloLens の基本的なジェスチャから追跡 HoloLens 2 をすべて連結したものの手に至るまで、デバイスに基づいてさまざまな機能を提供します。Hand sources offer different features based on the device, ranging from basic gestures on HoloLens to fully articulated hand tracking on HoloLens 2.
  • コント ローラーペアになっているアニメーション コント ローラーを表します。Controller represents a paired motion controller. アニメーション コント ローラーには、さまざまな機能を提供できます。Motion controllers can offer a variety of capabilities. 例:トリガー、メニュー ボタン、ボタンの把握、タッチパッドおよびサムスティックを選択します。For example: Select triggers, Menu buttons, Grasp buttons, touchpads and thumbsticks.
  • 音声システム検出キーワードを言うと、ユーザーの音声を表します。Voice represents the user's voice speaking system-detected keywords. たとえば、このソースは選択キーを押して挿入し、"Select"、ユーザーの質問されるたびにリリースします。For example, this source will inject a Select press and release whenever the user says "Select".

フレームごとのデータ ソースがによって表されるため、 SpatialInteractionSourceStateインターフェイス。Per-frame data for a source is represented by the SpatialInteractionSourceState interface. アプリケーションで、イベント ドリブンまたはポーリング ベースのモデルを使用するかどうかに応じて、このデータにアクセスする 2 つのさまざまな方法はあります。There are two different ways to access this data, depending on whether you want to use an event-driven or polling-based model in your application.

イベント ドリブンの入力Event-driven input

SpatialInteractionManager では、アプリがリッスンできるイベント数を提供します。The SpatialInteractionManager provides a number of events that your app can listen for. 例をいくつか含めるSourcePressedSourceReleasedSourceUpdatedします。A few examples include SourcePressed, SourceReleased and SourceUpdated.

たとえば、次のコードは、MyApp::OnSourcePressed を呼び出して SourcePressed イベントをイベント ハンドラーをフックします。For example, the following code hooks up an event handler called MyApp::OnSourcePressed to the SourcePressed event. これにより、相互作用のソースの任意の種類の押下を検出するために、アプリができます。This allows your app to detect presses on any type of interaction source.

using namespace winrt::Windows::UI::Input::Spatial;

auto interactionManager = SpatialInteractionManager::GetForCurrentView();
interactionManager.SourcePressed({ this, &MyApp::OnSourcePressed });

押されたこのイベントは、押下の発生時に対応する SpatialInteractionSourceState と共に、非同期的に、アプリに送信されます。This pressed event is sent to your app asynchronously, along with the corresponding SpatialInteractionSourceState at the time the press happened. アプリやゲーム エンジンはすぐに、いくつか処理を実行することがあります。 またはルーチンを処理する、入力イベント データをキューに登録することがあります。Your app or game engine may want to perform some processing right away or you may want to queue up the event data in your input processing routine. [選択] ボタンが押されたかどうかを確認する方法を示しています、SourcePressed イベントのイベント ハンドラー関数を次に示します。Here is an event handler function for the SourcePressed event, which shows how to check whether the select button was pressed.

using namespace winrt::Windows::UI::Input::Spatial;

void MyApp::OnSourcePressed(SpatialInteractionManager const& sender, SpatialInteractionSourceEventArgs const& args)
{
    if (args.PressKind() == SpatialInteractionPressKind::Select)
    {
        // Select button was pressed, update app state
    }
}

デバイスのプライマリ アクションに対応する 'Select' を押してのみ、上記のコードをチェックします。The above code only checks for the 'Select' press, which corresponds to the primary action on the device. 例には、HoloLens で、AirTap またはアニメーション コント ローラーに対してプルをトリガーが含まれます。Examples include doing an AirTap on HoloLens or pulling the trigger on a motion controller. 'Select' の押下では、対象とするホログラムをアクティブ化するユーザーの意図を表します。'Select' presses represent the user's intention to activate the hologram they are targeting. SourcePressed イベントが多数のさまざまなボタンとジェスチャの発生し、そのような場合をテストする SpatialInteractionSource の他のプロパティを検査することができます。The SourcePressed event will fire for a number of different buttons and gestures, and you can inspect other properties on the SpatialInteractionSource to test for those cases.

ポーリング ベースの入力Polling-based input

すべてのフレームの入力の現在の状態をポーリングするのに SpatialInteractionManager を使用することもできます。You can also use SpatialInteractionManager to poll for the current state of input every frame. これを行うには、単に呼び出すGetDetectedSourcesAtTimestampすべてのフレーム。To do this, simply call GetDetectedSourcesAtTimestamp every frame. この関数は、1 つを含む配列を返しますSpatialInteractionSourceStateすべてアクティブSpatialInteractionSourceします。This function returns an array containing one SpatialInteractionSourceState for every active SpatialInteractionSource. つまり各モーションのアクティブなコント ローラーの各追跡対象の手および音声の 'select' コマンドが最近に載せた場合です。This means one for each active motion controller, one for each tracked hand, and one for speech if a 'select' command was recently uttered. アプリケーションにドライブの入力には、各 SpatialInteractionSourceState のプロパティを検査できます。You can then inspect the properties on each SpatialInteractionSourceState to drive input into your application.

ポーリング メソッドを使用して、'select' アクションを確認する方法の例を次に示します。Here is an example of how to check for the 'select' action using the polling method. なお、予測変数を表します、 HolographicFramePredictionオブジェクトから取得できますが、 HolographicFrameNote that the prediction variable represents a HolographicFramePrediction object, which can be obtained from the HolographicFrame.

using namespace winrt::Windows::UI::Input::Spatial;

auto interactionManager = SpatialInteractionManager::GetForCurrentView();
auto sourceStates = m_spatialInteractionManager.GetDetectedSourcesAtTimestamp(prediction.Timestamp());

for (auto& sourceState : sourceStates)
{
    if (sourceState.IsSelectPressed())
    {
        // Select button is down, update app state
    }
}

各 SpatialInteractionSource が、ID は、新しいソースを特定し、既存のソースのフレーム間を関連付けるために使用することができます。Each SpatialInteractionSource has an ID, which you can use to identify new sources and correlate existing sources from frame to frame. コント ローラーの Id をセッションの期間にわたって静的なままのままにし、FOV を入力するたびに手には、新しい ID が割り当てられます。Hands are assigned a new ID every time they leave and enter the FOV, but controller IDs remain static for the duration of the session. SpatialInteractionManager 上など、イベントを使用できるSourceDetectedSourceLostを手入力するか、デバイスのままにした場合、反応のビュー、またはアニメーション コント ローラーがオン/オフになっているかはペアになっていると対になっていません。You can use the events on SpatialInteractionManager such as SourceDetected and SourceLost, to react when hands enter or leave the device's view, or when motion controllers are turned on/off or are paired/unpaired.

履歴のポーズと予測Predicted vs. historical poses

GetDetectedSourcesAtTimestamp がタイムスタンプ パラメーターを持つことに注意してください。Note that GetDetectedSourcesAtTimestamp has a timestamp parameter. これにより、要求の状態を引き起こすのか、予測されたデータまたは入力の他のソースと空間的相互作用を関連付ける履歴、こと。This enables you to request state and pose data that is either predicted or historical, letting you correlate spatial interactions with other sources of input. たとえば、現在のフレームに手の形の位置を表示するときに渡すことができますによって提供される予測のタイムスタンプで、 HolographicFrameします。For example, when rendering the hand's position in the current frame, you can pass in the predicted timestamp provided by the HolographicFrame. これにより、認識される待機時間を最小限に抑え、レンダリングされたフレームの出力に近づけるに手の形の位置を前方予測するシステムです。This enables the system to forward-predict the hand position to closely align with the rendered frame output, minimizing perceived latency.

ただし、このような予測の姿勢では、相互作用のソースと対象とするための理想的なポインティング射線は生成されません。However, such a predicted pose does not produce an ideal pointing ray for targeting with an interaction source. たとえば、アニメーション コント ローラーのボタンが押されたときに、オペレーティング システムに Bluetooth を通じてバブルアップするには、そのイベントの最大 20 ミリ秒かかることができます。For example, when a motion controller button is pressed, it can take up to 20ms for that event to bubble up through Bluetooth to the operating system. 同様に、ユーザーが手のジェスチャを実行した後一定の時間はシステムに、ジェスチャと、アプリを検出し、それをポーリングする前に渡すことがあります。Similarly, after a user performs a hand gesture, some amount of time may pass before the system detects the gesture and your app then polls for it. 状態変更のアプリのポーリング時間では、head と hand ポーズは相互作用が実際には、過去に発生したターゲットに使用されます。By the time your app polls for a state change, the head and hand poses used to target that interaction actually happened in the past. GetDetectedSourcesAtTimestamp に現在 HolographicFrame のタイムスタンプを渡すことによって、対象とする場合、姿勢代わりにフォワード予測対象となるターゲット光線にフレームを表示する時に 20 ミリ秒以上を今後なることがあります。If you target by passing your current HolographicFrame's timestamp to GetDetectedSourcesAtTimestamp, the pose will instead be forward predicted to the targeting ray at the time the frame will be displayed, which could be more than 20ms in the future. 今後この姿勢が適しています。レンダリング、相互作用ソースでは、時間の問題がそれによりを対象とする、対話ユーザーの対象とすると、過去に発生します。This future pose is good for rendering the interaction source, but compounds our time problem for targeting the interaction, as the user's targeting occurred in the past.

さいわい、 SourcePressedSourceReleasedSourceUpdatedイベントは、履歴を提供状態に関連付けられています。各入力イベント。Fortunately, the SourcePressed, SourceReleased and SourceUpdated events provide the historical State associated with each input event. 履歴ヘッドと hand ポーズがを通じて使用可能な直接が含まれますTryGetPointerPose、履歴と共にタイムスタンプこのイベントと関連付けるために他の Api に渡すことができます。This directly includes the historical head and hand poses available through TryGetPointerPose, along with a historical Timestamp that you can pass to other APIs to correlate with this event.

レンダリングおよび手とコント ローラーと各フレームを対象とする場合は、次のベスト プラクティスにつながります。That leads to the following best practices when rendering and targeting with hands and controllers each frame:

  • /コント ローラーの手の形のレンダリングフレームごとに、アプリがポーリング前方予測現在のフレームの photon 時に各操作のソースの問題します。For hand/controller rendering each frame, your app should poll for the forward-predicted pose of each interaction source at the current frame’s photon time. 呼び出すことによって相互作用のすべてのソースのポーリングGetDetectedSourcesAtTimestampによって提供される予測のタイムスタンプを渡して、各フレームHolographicFrame::CurrentPredictionします。You can poll for all interaction sources by calling GetDetectedSourcesAtTimestamp each frame, passing in the predicted timestamp provided by HolographicFrame::CurrentPrediction.
  • 手/コント ローラーを対象とする押されたリリース時にキーを押してまたはリリースでは、アプリが処理する必要がありますイベント、レイキャストがに基づいて、履歴ヘッドまたは手ポーズそのイベント。For hand/controller targeting upon a press or release, your app should handle pressed/released events, raycasting based on the historical head or hand pose for that event. 処理することによってこのターゲットの射線を取得、 SourcePressedまたはSourceReleasedイベント、取得、状態イベントの引数、およびそのを呼び出してからプロパティTryGetPointerPoseメソッド。You get this targeting ray by handling the SourcePressed or SourceReleased event, getting the State property from the event arguments, and then calling its TryGetPointerPose method.

デバイス間の入力プロパティCross-device input properties

SpatialInteractionSource API は、コント ローラーと追跡機能の広範なシステムの手をサポートします。The SpatialInteractionSource API supports controllers and hand tracking systems with a wide range of capabilities. これらの機能の数は、デバイスの種類の間で共通です。A number of these capabilities are common between device types. たとえば、手追跡とアニメーション コント ローラーの両方は、'select' アクションと 3D の位置を提供します。For example, hand tracking and motion controllers both provide a 'select' action and a 3D position. 可能な限り、API は、これらの一般的な機能を SpatialInteractionSource で同じプロパティにマップします。Wherever possible, the API maps these common capabilities to the same properties on the SpatialInteractionSource. これによりより簡単にさまざまな入力の種類をサポートするためにアプリケーションができます。This enables applications to more easily support a wide range of input types. 次の表に、サポートされているプロパティおよび入力の型の間で比較します。The following table describes the properties that are supported, and how they compare across input types.

プロパティProperty 説明Description HoloLens GesturesHoloLens Gestures アニメーション コント ローラーMotion Controllers 関節手Articulated Hands
SpatialInteractionSource::処理SpatialInteractionSource::Handedness 右側または左側にある/コント ローラー。Right or left hand / controller. サポートされないNot Supported サポート対象Supported サポート対象Supported
SpatialInteractionSourceState::IsSelectPressedSpatialInteractionSourceState::IsSelectPressed 主ボタンの現在の状態。Current state of the primary button. エア タップAir Tap トリガーTrigger 厳密でないエア タップ (垂直ピンチ)Relaxed Air Tap (upright pinch)
SpatialInteractionSourceState::IsGraspedSpatialInteractionSourceState::IsGrasped グラブ ボタンの現在の状態。Current state of the grab button. サポートされないNot Supported ボタンを取得します。Grab button ピンチまたは解決済みの手Pinch or Closed Hand
SpatialInteractionSourceState::IsMenuPressedSpatialInteractionSourceState::IsMenuPressed メニュー ボタンの現在の状態。Current state of the menu button. サポートされないNot Supported メニュー ボタンMenu Button サポートされないNot Supported
SpatialInteractionSourceLocation::位置SpatialInteractionSourceLocation::Position コント ローラーの手動またはグリップ位置の位置を XYZ します。XYZ location of the hand or grip position on the controller. Palm 場所Palm location グリップの姿勢位置Grip pose position Palm 場所Palm location
SpatialInteractionSourceLocation::向きSpatialInteractionSourceLocation::Orientation コント ローラーの手動またはグリップ姿勢の方向を表す四元数。Quaternion representing the orientation of the hand or grip pose on the controller. サポートされないNot Supported グリップの姿勢向きGrip pose orientation Palm 向きPalm orientation
SpatialPointerInteractionSourcePose::位置SpatialPointerInteractionSourcePose::Position ポインティング射線の原点。Origin of the pointing ray. サポートされないNot Supported サポート対象Supported サポート対象Supported
SpatialPointerInteractionSourcePose::ForwardDirectionSpatialPointerInteractionSourcePose::ForwardDirection ポインティング射線の方向です。Direction of the pointing ray. サポートされないNot Supported サポート対象Supported サポート対象Supported

上記のプロパティの一部は、すべてのデバイスで使用できませんし、API がこれをテストするための手段を提供します。Some of the above properties are not available on all devices, and the API provides a means to test for this. たとえば、検査することができます、 SpatialInteractionSource::IsGraspSupportedプロパティ ソースが理解アクションを提供するかどうかを判断します。For example, you can inspect the SpatialInteractionSource::IsGraspSupported property to determine whether the source provides a grasp action.

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

Windows Mixed Reality は、さまざまなフォーム ファクターでモーションのコント ローラーをサポートします。Windows Mixed Reality supports motion controllers in a variety of form factors. 追跡システム関節手の形もサポートしています。It also supports articulated hand tracking systems. これらすべてのシステムは、手の形の位置とアプリがユーザーの手でポイントまたは rendreing オブジェクトを使用する自然な「前」方向の別のリレーションシップを持ちます。All of these systems have different relationships between the hand position and the natural "forward" direction that apps should use for pointing or rendreing objects in the user's hand. このすべてをサポートするには、両方手の形の追跡、およびモーションのコント ローラーに指定された 3D ポーズの 2 つの種類があります。To support all of this, there are two types of 3D poses provided for both hand tracking and motion controllers. 最初は、ユーザーの手の形の位置を表すグリップ ポーズです。The first is grip pose, which represents the user's hand position. 2 つ目の姿勢で、ユーザーの手の形またはコント ローラーから送信されたポインティング光線を表しますが指しています。The second is pointing pose, which represents a pointing ray originating from the user's hand or controller. したがって、表示する場合ユーザーの手またはオブジェクトは、ユーザーの手の形で保持されている剣またはガン、グリップ姿勢を使用するなど、します。So, if you want to render the user's hand or an object held in the user's hand, such as a sword or gun, use the grip pose. コント ローラーまたは例では、ユーザーが手の形から raycast したい場合UI でポイント、ポインティングの姿勢を使用します。If you want to raycast from the controller or hand, for example when the user is pointing at UI , use the pointing pose.

アクセスできる、グリップ姿勢を通じてSpatialInteractionSourceState::Properties::TryGetLocation(...).次のように定義されます。You can access the grip pose through SpatialInteractionSourceState::Properties::TryGetLocation(...). It is defined 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.
  • 向きの適切な軸を握って: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.

アクセスできる、ポインター姿勢を通じてSpatialInteractionSourceState::Properties::TryGetLocation (...):: SourcePointerPoseまたはSpatialInteractionSourceState:。TryGetPointerPose (...):: TryGetInteractionSourcePoseします。You can access the pointer pose through SpatialInteractionSourceState::Properties::TryGetLocation(...)::SourcePointerPose or SpatialInteractionSourceState::TryGetPointerPose(...)::TryGetInteractionSourcePose.

コント ローラーに固有の入力プロパティController-specific input properties

SpatialInteractionSource では、コント ローラーの追加機能を備えたコント ローラー プロパティがあります。For controllers, the SpatialInteractionSource has a Controller property with additional capabilities.

  • HasThumbstick: True の場合、コント ローラーは、スティックが。HasThumbstick: If true, the controller has a thumbstick. 検査、 ControllerPropertiesスティックを取得する SpatialInteractionSourceState のプロパティ x と y 値 (ThumbstickX および ThumbstickY)、ほかの押された状態 (IsThumbstickPressed)。Inspect the ControllerProperties property of the SpatialInteractionSourceState to acquire the thumbstick x and y values (ThumbstickX and ThumbstickY), as well as its pressed state (IsThumbstickPressed).
  • HasTouchpad: True の場合、コント ローラーがタッチパッドにします。HasTouchpad: If true, the controller has a touchpad. タッチパッドの取得を SpatialInteractionSourceState の ControllerProperties プロパティを検査する x および y 値 (TouchpadX および TouchpadY) と、ユーザーが (IsTouchpadTouched) パッドをタッチし、(ダウン タッチパッドを押して、場合を把握するにはIsTouchpadPressed)。Inspect the ControllerProperties property of the SpatialInteractionSourceState to acquire the touchpad x and y values (TouchpadX and TouchpadY), and to know if the user is touching the pad (IsTouchpadTouched) and if they are pressing the touchpad down (IsTouchpadPressed).
  • SimpleHapticsController: コント ローラーの SimpleHapticsController API では、コント ローラーの haptics 機能を検査でき、ハプティクス フィードバックを制御することもできます。SimpleHapticsController: The SimpleHapticsController API for the controller allows you to inspect the haptics capabilities of the controller, and it also allows you to control haptic feedback.

タッチパッドとスティックの範囲が (下から上、および左から右へ) を両方の軸の 1 に-1 であることに注意してください。Note that the range for touchpad and thumbstick is -1 to 1 for both axes (from bottom to top, and from left to right). SpatialInteractionSourceState::SelectPressedValue プロパティを使用してアクセスは、アナログのトリガーの範囲には、0 ~ 1 の範囲が含まれています。The range for the analog trigger, which is accessed using the SpatialInteractionSourceState::SelectPressedValue property, has a range of 0 to 1. 値を true に等しくなる IsSelectPressed と 1 つ関連付けますその他の値を false に等しくなる IsSelectPressed で相互に関連付けます。A value of 1 correlates with IsSelectPressed being equal to true; any other value correlates with IsSelectPressed being equal to false.

追跡関節手Articulated hand tracking

Windows Mixed Reality API では、追跡、たとえば HoloLens 2 で連結したものを完全にサポートを提供します。The Windows Mixed Reality API provides full support for articulated hand tracking, for example on HoloLens 2. 追跡関節手の形は、アプリケーションで直接操作し、入力モデルをポイントし、コミットを実装するために使用できます。Articulated hand tracking can be used to implement direct manipulation and point-and-commit input models in your applications. 完全カスタムのインタラクティビティの作成に使用できます。It can also be used to author fully custom interactions.

手の形のスケルトンHand skeleton

追跡関節手の形では、により、さまざまな種類の相互作用の 25 の共通スケルトンを提供します。Articulated hand tracking provides a 25 joint skeleton that enables many different types of interactions. スケルトンでは、インデックス/中間/リング/ほとんど本の指の 5 つの結合、つまみについては 4 つの結合および共同 1 手首を提供します。The skeleton provides 5 joints for the index/middle/ring/little fingers, 4 joints for the thumb, and 1 wrist joint. 手首ジョイントは、階層の基本として機能します。The wrist joint serves as the base of the hierarchy. 次の図は、スケルトンのレイアウトを示しています。The following picture illustrates the layout of the skeleton.

手の形のスケルトン

ほとんどの場合、それが表すボーンに基づいて各ジョイントがという名前です。In most cases, each joint is named based on the bone that it represents. すべての共同で 2 つのボーンがあるので、その位置に子ボーンに基づいて各ジョイント名前付け規則を使用します。Since there are two bones at every joint, we use a convention of naming each joint based on the child bone at that location. 子ボーンは、ボーン手首からかけ離れたものとして定義されます。The child bone is defined as the bone further from the wrist. たとえば、「インデックス位」共同が含まれています、インデックスの位ボーンの開始位置とそのボーンの方向。For example, the "Index Proximal" joint contains the beginning position of the index proximal bone, and the orientation of that bone. ボーンの終了位置は含まれません。It does not contain the ending position of the bone. 必要がある場合はから取得して、[次へ]、階層、「インデックス中間」共同で結合。If you need that, you'd get it from the next joint in the hierarchy, the "Index Intermediate" joint.

25 の階層的な結合だけでなく、システムは、palm ジョイントを提供します。In addition to the 25 hierarchical joints, the system provides a palm joint. 片手で行うことはない通常の一部と見なさ骨組みです。The palm is not typically considered part of the skeletal structure. 手の全体的な位置と向きを取得する便利な手段としてのみ提供されます。It is provided only as a convenient way to get the hand's overall position and orientation.

次の情報は、共同の各提供されます。The following information is provided for each joint:

名前Name 説明Description
位置Position ジョイントは、要求されたすべての座標システムで使用できるの 3D の位置。3D position of the joint, available in any requested coordinate system.
方向Orientation すべてで利用可能、ボーンの 3D の方向は、座標系を要求します。3D orientation of the bone, available in any requested coordinate system.
半径Radius 共同の位置にあるスキンの画面までの距離。Distance to surface of the skin at the joint position. 直接の対話、または本の指の幅に依存する視覚エフェクトをチューニングするために便利です。Useful for tuning direct interactions or visualizations that rely on finger width.
正確性Accuracy この共同の情報について、システムの感覚を取ってにヒントを提供します。Provides a hint on how confident the system feels about this joint's information.

関数を使用手の形のスケルトン データにアクセスすることができます、 SpatialInteractionSourceStateします。You can access the hand skeleton data through a function on the SpatialInteractionSourceState. 関数を呼び出すTryGetHandPoseと呼ばれるオブジェクトを返すとHandPoseします。The function is called TryGetHandPose, and it returns an object called HandPose. ソースが思い起こさせます手をサポートしていない場合、この関数は null を返します。If the source does not support articulated hands, then this function will return null. 呼び出して共同の現在のデータを取得するには、HandPose したら、 TryGetJoint、関心がジョイントの名前に置き換えます。Once you have a HandPose, you can get current joint data by calling TryGetJoint, with the name of the joint you are interested in. として、データが返されます、 JointPose構造体。The data is returned as a JointPose structure. 次のコードでは、人差し指先端の位置を取得します。The following code gets the position of the index finger tip. 変数currentStateのインスタンスを表しますSpatialInteractionSourceStateします。The variable currentState represents an instance of SpatialInteractionSourceState.

using namespace winrt::Windows::Perception::People;
using namespace winrt::Windows::Foundation::Numerics;

auto handPose = currentState.TryGetHandPose();
if (handPose)
{
    JointPose joint;
    if (handPose.TryGetJoint(desiredCoordinateSystem, HandJointKind::IndexTip, joint))
    {
        float3 indexTipPosition = joint.Position;

        // Do something with the index tip position
    }
}

手の形メッシュHand mesh

API の追跡、連結したものを手動で完全に変形可能な三角形の手の形メッシュはできます。The articulated hand tracking API allows for a fully deformable triangle hand mesh. このメッシュでは、手の形のスケルトンとリアルタイムで変形できるし、は高度な物理学の手法と同様に視覚エフェクトに便利です。This mesh can deform in real time along with the hand skeleton, and is useful for visualization as well as advanced physics techniques. 手の形メッシュにアクセスするには、最初に作成する必要があります、 HandMeshObserverオブジェクトを呼び出すことによってTryCreateHandMeshObserverAsync上、 SpatialInteractionSourceします。To access the hand mesh, you need to first create a HandMeshObserver object by calling TryCreateHandMeshObserverAsync on the SpatialInteractionSource. これは、1 回実行する、ソースあたり通常最初に表示するだけ済みます。This only needs to be done once per source, typically the first time you see it. 手の形に視界が入力したときに、HandMeshObserver オブジェクトを作成するには、この関数を呼び出しを意味します。That means you'll call this function to create a HandMeshObserver object whenever a hand enters the FOV. これは非同期関数では、ここでの同時実行の少し対処する必要がありますので注意してください。Note that this is an async function, so you'll have to deal with a bit of concurrency here. 利用可能になった HandMeshObserver オブジェクトを求める、三角形インデックス バッファーを呼び出してGetTriangleIndicesします。Once available, you can ask the HandMeshObserver object for the triangle index buffer by calling GetTriangleIndices. インデックスは、ソースの有効期間だけキャッシュし、1 回取得することができます、フレーム、経由でフレームを変更しないでください。Indices don't change frame over frame, so you can get those once and cache them for the lifetime of the source. インデックスは、時計回りにワインディングの順序で提供されます。Indices are provided in clockwise winding order.

次のコードでは、メッシュのオブザーバーを作成するデタッチ std::thread スピンアップし、メッシュ オブザーバーが使用可能、インデックス バッファーを抽出します。The following code spins up a detached std::thread to create the mesh observer and extracts the index buffer once the mesh observer is available. という名前の変数から開始しcurrentStateのインスタンスであるSpatialInteractionSourceState履歴手の形を表します。It starts from a variable called currentState, which is an instance of SpatialInteractionSourceState representing a tracked hand.

using namespace Windows::Perception::People;

std::thread createObserverThread([this, currentState]()
{
    HandMeshObserver newHandMeshObserver = currentState.Source().TryCreateHandMeshObserverAsync().get();
    if (newHandMeshObserver)
    {
        unsigned indexCount = newHandMeshObserver.TriangleIndexCount();
        vector<unsigned short> indices(indexCount);
        newHandMeshObserver.GetTriangleIndices(indices);

        // Save the indices and handMeshObserver for later use - and use a mutex to synchronize access if needed!
     }
});
createObserverThread.detach();

非同期呼び出しを処理するための 1 つのオプションは、デタッチ スレッドを開始します。Starting a detached thread is just one option for handling async calls. またはを使って新しいco_awaitでサポートされる機能C++/WinRT です。Alternatively, you could use the new co_await functionality supported by C++/WinRT.

HandMeshObserver オブジェクトを作成したら、その対応する SpatialInteractionSource がアクティブになっている期間を保持する必要があります。Once you have a HandMeshObserver object, you should hold onto it for the duration that its corresponding SpatialInteractionSource is active. フレームごと、それを求める最新頂点バッファーを呼び出すことによって、手の形を表すGetVertexStateForPoseを渡して、 HandPose頂点姿勢を表すインスタンス。Then each frame, you can ask it for the latest vertex buffer that represents the hand by calling GetVertexStateForPose and passing in a HandPose instance that represents the pose that you want vertices for. バッファー内の各頂点は、位置と標準があります。Each vertex in the buffer has a position and a normal. 手の形のメッシュの頂点の現在のセットを取得する方法の例を示します。Here's an example of how to get the current set of vertices for a hand mesh. 以前と同様、 currentState変数のインスタンスを表しますSpatialInteractionSourceStateします。Just as before, the currentState variable represents an instance of SpatialInteractionSourceState.

using namespace winrt::Windows::Perception::People;

auto handPose = currentState.TryGetHandPose();
if (handPose)
{
    std::vector<HandMeshVertex> vertices(handMeshObserver.VertexCount());
    auto vertexState = handMeshObserver.GetVertexStateForPose(handPose);
    vertexState.GetVertices(vertices);

    auto meshTransform = vertexState.CoordinateSystem().TryGetTransformTo(desiredCoordinateSystem);
    if (meshTransform != nullptr)
    {
        // Do something with the vertices and mesh transform, along with the indices that you saved earlier
    }
}

スケルトンの結合とは異なり、手の形のメッシュ API はできません、頂点の座標システムを指定すること。In contrast to skeleton joints, the hand mesh API does not allow you to specify a coordinate system for the vertices. 代わりに、 HandMeshVertexState座標システムで提供されている頂点を指定します。Instead, the HandMeshVertexState specifies the coordinate system that the vertices are provided in. 呼び出してメッシュ変換を取得することができますし、 TryGetTransformToし、目的の座標系を指定します。You can then get a mesh transform by calling TryGetTransformTo and specifying your desired coordinate system. 頂点を操作するたびに、このメッシュ変換を使用する必要があります。You'll need to use this mesh transform whenever you work with the vertices. このアプローチでは、レンダリングのために、メッシュを使用してのみ場合に特に、CPU オーバーヘッドが削減されます。This approach reduces CPU overhead, especially if you are only using the mesh for rendering purposes.

視線し、複合ジェスチャのコミットGaze and Commit composite gestures

HoloLens で特に注視し、コミットの入力モデルを使用するアプリケーションの (最初 gen) 空間の入力 API を提供、省略可能なSpatialGestureRecognizer上に構築された複合のジェスチャを有効にするには使用できる、' select' イベント。For applications using the gaze-and-commit input model, particularly on HoloLens (first gen), the Spatial Input API provides an optional SpatialGestureRecognizer that can be used to to enable composite gestures built on top of the 'select' event. ルーティングの相互作用によって、SpatialInteractionManager からホログラムの SpatialGestureRecognizer に、アプリ イベントを検出できますタップ、保持、操作、およびナビゲーション一様に手、音声、および空間の入力デバイス間での押下を処理する必要はありません。手動で解放します。By routing interactions from the SpatialInteractionManager to a hologram's SpatialGestureRecognizer, apps can detect Tap, Hold, Manipulation, and Navigation events uniformly across hands, voice, and spatial input devices, without having to handle presses and releases manually.

SpatialGestureRecognizer を要求するジェスチャ セットの間の最小限の曖昧のみを実行します。SpatialGestureRecognizer performs only the minimal disambiguation between the set of gestures that you request. たとえば、タップするだけを要求する場合ようおり、タップが引き続き発生を指がユーザーに押し可能性があります。For example, if you request just Tap, the user may hold their finger down as long as they like and a Tap will still occur. 要求した場合は、タップ押しすると、約 1 秒が指を保持しているのでは、ジェスチャは保留リストに昇格し、タップは行われなくとの両方。If you request both Tap and Hold, after about a second of holding down their finger, the gesture will promote to a Hold and a Tap will no longer occur.

SpatialGestureRecognizer を使用する処理 SpatialInteractionManager のInteractionDetectedイベントと公開されている、SpatialPointerPose グラブします。To use SpatialGestureRecognizer, handle the SpatialInteractionManager's InteractionDetected event and grab the SpatialPointerPose exposed there. 積集合を持つ、ホログラムこの姿勢からユーザーのヘッド注視光線を使用し、画面がユーザーの環境では、ユーザーのプログラムと対話するかを判断するためにメッシュします。Use the user's head gaze ray from this pose to intersect with the holograms and surface meshes in the user's surroundings, in order to determine what the user is intending to interact with. その後、ターゲット ホログラムの SpatialGestureRecognizer、イベント引数の中で、SpatialInteraction をルーティングを使用してそのCaptureInteractionメソッド。Then, route the SpatialInteraction in the event arguments to the target hologram's SpatialGestureRecognizer, using its CaptureInteraction method. に従ってその相互作用の解釈が起動、 SpatialGestureSettings - の作成時に、その認識エンジンで設定TrySetGestureSettingsします。This starts interpreting that interaction according to the SpatialGestureSettings set on that recognizer at creation time - or by TrySetGestureSettings.

HoloLens で (gen 最初) の相互作用とジェスチャのユーザーの視線入力ヘッドからターゲットではなくしようとしてレンダリングまたはして手のアイコンの場所に直接対話を派生する必要があります一般にします。On HoloLens (first gen), interactions and gestures should generally derive their targeting from the user's head gaze, rather than trying to render or interact at the hand's location directly. 相互作用が開始されたら、操作やナビゲーションのジェスチャと同様、手の相対的な動きをジェスチャを制御を使用できます。Once an interaction has started, relative motions of the hand may be used to control the gesture, as with the Manipulation or Navigation gesture.

関連項目See also