handTrackingProvider
HandTrackingProvider 是一個(gè)用于處理手部跟蹤的類,繼承自 DataProvider。它提供了一系列方法和屬性來獲取和管理手部錨點(diǎn)(anchors)和跟蹤狀態(tài)朦蕴。
屬性詳解
屬性與方法
latestAnchors: (leftHand: HandAnchor?, rightHand: HandAnchor?)
描述:這是一個(gè)只讀屬性,返回一個(gè)元組款咖,包含最新的左手和右手錨點(diǎn)交掏。如果手部跟蹤提供者未在運(yùn)行,返回的錨點(diǎn)將為 nil。在應(yīng)用程序編譯為 visionOS 1.0 SDK 時(shí)谍夭,如果自上次訪問該屬性以來手錨點(diǎn)未更新,返回的錨點(diǎn)也將為 nil鲸鹦。
state: DataProviderState
描述:這是一個(gè)只讀屬性慧库,表示手部跟蹤提供者的當(dāng)前狀態(tài)跷跪。狀態(tài)可以用來判斷手部跟蹤的健康狀況馋嗜,例如是否正在跟蹤,是否有錯(cuò)誤等吵瞻。
init()
描述:這是類的初始化方法葛菇,用于創(chuàng)建 HandTrackingProvider 的實(shí)例。
isSupported: Bool
描述:這是一個(gè)靜態(tài)屬性橡羞,返回一個(gè)布爾值眯停,指示當(dāng)前設(shè)備是否支持手部跟蹤提供者。這可以在應(yīng)用程序啟動時(shí)進(jìn)行檢查卿泽,以決定是否啟用手部跟蹤功能莺债。
requiredAuthorizations: [ARKitSession.AuthorizationType]
描述:這是一個(gè)靜態(tài)屬性,返回一個(gè)數(shù)組签夭,表示手部跟蹤提供者所需的授權(quán)類型齐邦。例如,可能需要攝像頭訪問權(quán)限等第租。
anchorUpdates: AnchorUpdateSequence<HandAnchor>
描述:這是一個(gè)只讀屬性措拇,返回一個(gè)異步序列,包含所有錨點(diǎn)的更新慎宾。這允許開發(fā)者以響應(yīng)的方式處理手部跟蹤錨點(diǎn)的變化丐吓。
handAnchors(at timestamp: TimeInterval) -> (leftHand: HandAnchor?, rightHand: HandAnchor?)
描述:這是一個(gè)方法,用于根據(jù)給定的時(shí)間戳查詢手錨點(diǎn)趟据。此方法并不是線程安全的券犁,因此在多線程調(diào)用時(shí),開發(fā)者必須自行提供同步機(jī)制汹碱。參數(shù) timestamp 是目標(biāo)時(shí)間戳族操,類型為秒。返回值為一個(gè)包含左手和右手錨點(diǎn)的元組,如果手部跟蹤提供者未運(yùn)行色难,錨點(diǎn)將為 nil泼舱。此方法在 visionOS 2.0 中可用。
description: String
描述:這是一個(gè)只讀屬性枷莉,提供了 HandTrackingProvider 的文本表示娇昙,通常用于調(diào)試或日志記錄,以便開發(fā)者能夠理解手部跟蹤提供者的狀態(tài)笤妙。
手部數(shù)據(jù)更新
func handTracking() {
if HandTrackingProvider.isSupported {
Task {
do {
try await session.run([handTrackingProvider])
for await update in handTrackingProvider.anchorUpdates {
DispatchQueue.main.async { // Ensure updates are on the main thread
switch update.event {
case .updated://有更新
let anchor = update.anchor//從更新中獲取anchor
if !anchor.isTracked {//沒有追蹤數(shù)據(jù)返回
return // Use 'return' instead of 'continue' outside loops
}
if anchor.chirality == .left {//判斷左右手
self.latestHandTracking.left = anchor
} else if anchor.chirality == .right {
self.latestHandTracking.right = anchor
}
default:
break
}
}
}
} catch {
print("Error starting hand tracking: \(error)")
}
}
}
}
總結(jié)
HandTrackingProvider 類是手部跟蹤的核心組件冒掌,提供了多種方法和屬性來管理手的狀態(tài)、獲取錨點(diǎn)以及處理更新蹲盘。它的設(shè)計(jì)使得開發(fā)者能夠輕松地在增強(qiáng)現(xiàn)實(shí)應(yīng)用中實(shí)現(xiàn)手部交互和手勢識別股毫。通過這個(gè)類,開發(fā)者可以實(shí)時(shí)獲取手的跟蹤信息召衔,并在需要時(shí)處理和更新這些信息铃诬,從而增強(qiáng)用戶體驗(yàn)。
HandAnchor
屬性詳解
id: UUID
類型:UUID
描述:這是 HandAnchor 的唯一標(biāo)識符苍凛。每個(gè) HandAnchor 實(shí)例都有一個(gè)獨(dú)特的 ID趣席,用于區(qū)分不同的手部錨點(diǎn)。這在需要跟蹤多個(gè)錨點(diǎn)時(shí)特別重要醇蝴。
originFromAnchorTransform: simd_float4x4
類型:simd_float4x4
描述:該屬性表示從手腕到原點(diǎn)坐標(biāo)系的變換矩陣宣肚。它提供了手的位置和方向信息,可以用來將手部位置轉(zhuǎn)換到應(yīng)用的世界坐標(biāo)系中悠栓。
handSkeleton: HandSkeleton?
類型:HandSkeleton?
描述:這是一個(gè)可選屬性霉涨,表示手的骨骼結(jié)構(gòu)。HandSkeleton 通常包含手指惭适、掌心等的骨骼信息笙瑟,幫助進(jìn)行更精細(xì)的手勢識別和動畫。若當(dāng)前未追蹤到手部腥沽,可能返回 nil逮走。
chirality: HandAnchor.Chirality
類型:HandAnchor.Chirality
描述:該屬性表示手的側(cè)別(左手或右手)。它是 HandAnchor 內(nèi)部定義的一個(gè)枚舉今阳,包含 left 和 right师溅,幫助區(qū)分左手和右手的錨點(diǎn)。
isTracked: Bool
類型:Bool
描述:此屬性指示該手部錨點(diǎn)是否正在被追蹤盾舌。如果為 true墓臭,表示系統(tǒng)當(dāng)前能夠有效地追蹤到該手部錨點(diǎn);如果為 false妖谴,則可能由于遮擋窿锉、光照不足等原因酌摇,錨點(diǎn)未能被有效追蹤。
description: String
類型:String
描述:該屬性提供了該錨點(diǎn)的文本描述嗡载,通常用于調(diào)試或日志輸出窑多。可以方便開發(fā)者了解當(dāng)前錨點(diǎn)的狀態(tài)和信息洼滚。
枚舉類型: Chirality
HandAnchor.Chirality 是一個(gè)枚舉類型埂息,用于區(qū)分左手和右手,其內(nèi)容包括:
case right: 表示右手遥巴。
case left: 表示左手千康。
description:提供對該枚舉的文本描述。
HandSkeleton
neutralPose: HandSkeleton
描述:這是一個(gè)靜態(tài)屬性铲掐,返回一個(gè)處于中立姿勢(neutral pose)的手部骨骼拾弃。中立姿勢通常指手部自然放松的狀態(tài),沒有施加任何外力或手勢摆霉。這種姿勢用于初始化或比較其他手勢豪椿。
joint(_ named: HandSkeleton.JointName) -> HandSkeleton.Joint
描述:這是一個(gè)實(shí)例方法,用于獲取指定名稱的關(guān)節(jié)斯入。參數(shù) named 是一個(gè) JointName 枚舉值砂碉,表示要查詢的關(guān)節(jié)名稱(例如蛀蜜,wrist刻两、thumbKnuckle 等)。該方法返回相應(yīng)的 HandSkeleton.Joint 對象滴某,表示該關(guān)節(jié)的具體信息磅摹。
description: String
描述:這個(gè)屬性提供了 HandSkeleton 的文本表示,通常用于調(diào)試或日志記錄霎奢,以便開發(fā)者能夠理解手部骨骼的狀態(tài)户誓。
allJoints: [HandSkeleton.Joint]
描述:這個(gè)屬性返回一個(gè)包含所有關(guān)節(jié)的數(shù)組,類型為 [HandSkeleton.Joint]幕侠。它允許開發(fā)者遍歷手部的所有關(guān)節(jié)帝美,便于進(jìn)行操作和處理。
以下為拓展extension HandSkeleton
Joint 結(jié)構(gòu)體
Joint 結(jié)構(gòu)體表示手部骨骼中的一個(gè)關(guān)節(jié)晤硕,它包含多個(gè)屬性來描述該關(guān)節(jié)的特征和狀態(tài)悼潭。具體屬性如下:
parentJoint: HandSkeleton.Joint?
描述:表示該關(guān)節(jié)的父關(guān)節(jié)。如果當(dāng)前關(guān)節(jié)是根關(guān)節(jié)舞箍,則它沒有父關(guān)節(jié)舰褪,返回 nil。這使得關(guān)節(jié)可以形成樹形結(jié)構(gòu)疏橄,從根關(guān)節(jié)逐級向下連接占拍。
name: HandSkeleton.JointName
描述:關(guān)節(jié)的名稱,使用 JointName 枚舉來表示,如 wrist晃酒、thumbKnuckle 等表牢。這種命名方式使得對手部結(jié)構(gòu)的表示更加清晰。
parentFromJointTransform: simd_float4x4
描述:表示從該關(guān)節(jié)到其父關(guān)節(jié)的變換矩陣贝次。對于根關(guān)節(jié)初茶,其變換矩陣是一個(gè)單位矩陣,表明它的位置是參考原點(diǎn)的浊闪。
anchorFromJointTransform: simd_float4x4
描述:表示從該關(guān)節(jié)到手部錨點(diǎn)的變換矩陣恼布。這有助于將關(guān)節(jié)的位置轉(zhuǎn)換到手部的世界坐標(biāo)系中,以便進(jìn)行進(jìn)一步的計(jì)算或渲染搁宾。
isTracked: Bool
描述:指示該關(guān)節(jié)是否正在被追蹤折汞。如果為 true,表示該關(guān)節(jié)的狀態(tài)在當(dāng)前被成功跟蹤盖腿;如果為 false爽待,可能由于遮擋或其他原因?qū)е聼o法跟蹤。
description: String
描述:提供該關(guān)節(jié)的文本描述翩腐,通常用于調(diào)試或日志輸出鸟款,以便開發(fā)者理解當(dāng)前關(guān)節(jié)的狀態(tài)。
JointName 枚舉
JointName 枚舉列出了手部骨骼中所有的關(guān)節(jié)名稱茂卦,包括但不限于手腕何什、手指等。這些名稱對于識別手部的不同關(guān)節(jié)非常重要等龙。其具體內(nèi)容包括:
wrist: 手腕關(guān)節(jié)处渣。
thumbKnuckle: 大拇指的指關(guān)節(jié)。
indexFingerKnuckle: 食指的指關(guān)節(jié)蛛砰。
middleFingerKnuckle: 中指的指關(guān)節(jié)罐栈。
ringFingerKnuckle: 無名指的指關(guān)節(jié)。
littleFingerKnuckle: 小指的指關(guān)節(jié)泥畅。
forearmWrist: 前臂的手腕關(guān)節(jié)荠诬。
forearmArm: 前臂的關(guān)節(jié)。