概觀
已表達的手部聯合資料是 Unity 輸入系統尚未原生處理的輸入資料之一,由我們的子系統處理。
注意
如果您不熟悉 MRTK3 子系統及其與 MRTK 2.x 服務的差異,請參閱 MRTK3 子系統架構 檔,以深入瞭解我們的原理和設計。
我們的子系統會從數個來源擷取手部聯合資料,並將其匯總成可跨裝置和模擬內容運作的中央 API。 下列子系統是 的 HandsSubsystem
實作:
OpenXRHandsSubsystem
直接從 OpenXR 外掛程式接收手部資料。XRSDKHandsSubsystem
從 Unity 的 XR SDK 抽象層接收手部資料 (,而後者可能是從 OpenXR 或一些其他來源) 來源。SyntheticHandsSubsystem
根據來自系統的輸入動作來合成假手部 (,例如devicePosition
、deviceRotation
等) 。 此子系統提供您在編輯器中使用輸入模擬時看到的聯結。
HandsAggregatorSubsystem
是一種子系統,可將所有手部資料來源結合成中央 API。 它會從所有主動執行的 HandsSubsystems
提取基本架構聯結資料。 的 MRTK 實作 HandsAggregatorSubsystem
是 MRTKHandsAggregatorSubsystem
,支援延遲載入和重複使用每一框架的手部資料。
重要
每當您直接查詢手部聯合資料時,請一律從匯總工具查詢,而不是從任何個別的手部子系統查詢。 如此一來,您的程式碼將適用于任何手動資料來源,包括模擬的資料。
匯總工具與手部子系統會延遲評估傳入的手部資料要求。 在「用戶端」腳本要求之前,不會查詢手部資料。 如果應用程式只要求個別聯合,則手部子系統會延遲評估,並且只會從基礎 API 查詢單一聯合。 此外,如果「用戶端」要求完整手部的聯合資料,相同框架內的後續呼叫將會重複使用相同的資料,以減少在相同框架內查詢許多聯合的成本。 在每個新框架上,快取將會變更並排清,後續的呼叫將會開始重新填入快取。
因此,在分析應用程式時,您可能會在框架中看到第一個聯集查詢比後續查詢花費更多時間。 這是因為與第一個查詢相關聯的分攤成本,以及後續「快取點擊」的相對效能。
捏合特性
匯總工具會根據它從每個特定手部子系統查詢的聯合資料,計算數個關於捏合手勢的度量。 這些度量是在匯總工具子系統組態中設定。
[捏合開啟閾值] 和 [捏合封閉臨界值] 可控制指紋與擷取器之間的絕對世界距離,用來將捏合進度正規化。 當距離等於封閉閾值時,捏合進度會是 1.0,而距離等於開啟閾值時,就會是 0.0。 (這些閾值目前為世界單位,但很快就會正規化為使用者的手部大小。)
手部引發相機 FOV可控制手部檢視中心接近使用者檢視的距離,必須視為有效才能捏合。 手部向外容錯 可控制測量使用者手部旋轉的容錯;它會判斷使用者的手何時正向外。
手部匯總工具範例
// Get a reference to the aggregator.
var aggregator = XRSubsystemHelpers.GetFirstRunningSubsystem<HandsAggregatorSubsystem>();
// Wait until an aggregator is available.
IEnumerator EnableWhenSubsystemAvailable()
{
yield return new WaitUntil(() => XRSubsystemHelpers.GetFirstRunningSubsystem<HandsAggregatorSubsystem>() != null);
GoAhead();
}
// Get a single joint (Index tip, on left hand, for example)
bool jointIsValid = aggregator.TryGetJoint(TrackedHandJoint.IndexTip, XRNode.LeftHand, out HandJointPose jointPose);
// Get an entire hand's worth of joints from the left hand.
bool allJointsAreValid = aggregator.TryGetEntireHand(XRNode.LeftHand, out IReadOnlyList<HandJointPose> joints)
// Check whether the user's left hand is facing away (commonly used to check "aim" intent)
// This is adjustable with the HandFacingAwayTolerance option in the Aggregator configuration.
// "handIsValid" represents whether there was valid hand data in the first place!
bool handIsValid = aggregator.TryGetPalmFacingAway(XRNode.LeftHand, out bool isLeftPalmFacingAway)
// Query pinch characteristics from the left hand.
// pinchAmount is [0,1], normalized to the open/closed thresholds specified in the Aggregator configuration.
// "isReadyToPinch" is adjusted with the HandRaiseCameraFOV and HandFacingAwayTolerance settings in the configuration.
bool handIsValid = aggregator.TryGetPinchProgress(XRNode.LeftHand, out bool isReadyToPinch, out bool isPinching, out float pinchAmount)
手部控制器預製專案
MRTK LeftHand Controller
和 MRTK RightHand Controller
預製專案可讓您在專案中使用手部控制器。 這些預製專案可以同時處理已表達和未表達的手部控制器。 他們具有動作專案,可用於捏合、抓取、遠光和注視捏合動作。 此外,這些預製專案會顯示適當的視覺效果,並使用連結的控制器和互動器元件來處理來自裝置的輸入動作。 這些元件接著會取用 Unity 的輸入動作對應,以宣告輸入系結。 根據預設,預製專案會使用包含在內 MRTK Default Input Actions
含資產中定義的輸入動作對應。
請注意,手部控制器預製專案已包含在 MRTK XR Rig
預製專案中,如需詳細資訊,請參閱 建立新的場景 。 如果已使用 MRTK3 的 XR 鑽研機,則不需要採取進一步的動作來支援手部控制器。
重要
如果修改 MRTK3 XR 鑽研臺上的輸入動作,並使用資產外部 MRTK Default Input Actions
定義的動作,請務必更新 MRT3 的輸入動作管理員,使其指向新的輸入動作資產。 不這麼做可能會導致未定義的行為。
MRTK3 的左側和右手控制器預製專案包含支援手部輸入所需的所有元件。 其中一個元件是 MRTK 的 ArticulatedHandController
,這是 Unity XR 輸入 ActionBasedController
的特殊版本。 此 MRTK3 控制器腳本會使用 MRTK3 的手部匯總工具子系統,以公開各種手部輸入事件。 例如,控制器會公開捏合選取事件。
手部預製專案也有可啟用手部控制器視覺效果的腳本。 此 HandJointVisualizer
元件適用于偵錯,並繪製每個手部接合上的實例網格。 ControllerVisualizer
雖然元件適用于生產案例,但偵測到控制器時,會轉譯對應的控制器模型。 平臺的控制器網格會在可用時使用,否則會使用泛型控制器模型,也就是欄位上 fallbackControllerModel
指定的模型。
非 HoloLens 平臺可以使用 RiggedHandMeshVisualizer
將手視覺化。 如名稱所示,此視覺化檢視會使用鑽研的網格來轉譯高品質的手部模型,不建議用於 HoloLens 等 AR 平臺,因為效能和設計原因。 請注意,此視覺化檢視未在預設的手部控制器預製專案上設定。
注意
針對 HoloLens 等擴增實境平臺,我們建議您不要使用任何手部視覺效果。 使用者的實際手與稍微延遲的全像攝影視覺效果之間的衝突可能會比值得多。 不過,對於不透明平臺,這是絕佳的解決方案。
預設的手部控制器預製專案也會裝載一組互動器元件。 其中包括 PokeInteractor
、MRTKRayInteractor
、GrabInteractor
和 GrabInteractor
。 如需這些互動專案的詳細資訊,請造訪 Interactor Architecture - MRTK3。
最後,控制器預製專案也包含偵測器元件、 IInteractionModeDetector
NearInteractionModeDetector
和 InteractionDetector
。 這些元件會通知應用程式的互動模式管理員應該啟用哪些互動專案。 如需 MRTK3 偵測器的詳細資訊,請造訪 互動模式管理員 - MRTK3。
姿勢來源
所有 MRTK3 的手部互動都需要控制器姿勢 (或手部姿勢) 。 手部姿勢的類型可能會因互動者而異。 例如,有些使用 Unity 輸入動作來取得位置和旋轉,而其他則使用手指姿勢,而有些則使用手掌姿勢。 每個互動者的手部姿勢來源都是由實作 MRTK3 介面的 IPoseSource
類別所定義。 此介面會宣告下列各項:
TryGetPose
. 這個方法會嘗試在世界空間中取得手部姿勢。 例如,傳回的姿勢可能會對應至從 MRTK3 手部匯總器子系統取得的手部聯合姿勢。 如果擷取姿勢成功,這個方法會傳回 。 此方法的一些實作,例如從手部聯合資料擷取姿勢,如果資料無法使用,可能會失敗。
互動程式的型別是透過 Unity 偵測器 IPoseSource
指定,而且可以是下列其中一種類型:
FallbackCompositePoseSource
. 由已排序的姿勢來源清單計算的姿勢來源。 傳回成功傳回姿勢的第一個姿勢來源結果。HandBasedPoseSource
. 抽象類別,可協助定義以可存取 MRTK3 手部匯總器子系統的特定手部存取權為基礎的姿勢來源。HandJointPoseSource
. 引發的來源,可擴充HandBasedPoseSource
及追蹤特定手部上的特定手部聯合。InputActionPoseSource
. 從指定的 Unity 輸入動作取得由追蹤位置和旋轉所組成的姿勢來源。 您可以在 Unity 資產上MRTK Default Input Actions
找到預設輸入動作。PinchPoseSource
. 從 MRTK3 的手部匯總器子系統擴充HandBasedPoseSource
並取得特定手部的捏合姿勢來源。PolyfillHandRayPoseSource
. 表示手部光線的HandBasedPoseSource
姿勢來源。 此手部光線是透過衍生自 MRTK3 手部匯總器子系統的手部和捏合器位置來建構。
手部互動的姿勢來源類型已在 MRTK3 的預設控制器預製專案上指定。 不建議修改預製專案的預設姿勢來源設定。