美文网首页
versionPor 手部关节 相关

versionPor 手部关节 相关

作者: 何颀 | 来源:发表于2024-11-03 18:09 被阅读0次

handTrackingProvider

HandTrackingProvider 是一个用于处理手部跟踪的类,继承自 DataProvider。它提供了一系列方法和属性来获取和管理手部锚点(anchors)和跟踪状态。
属性详解
属性与方法
latestAnchors: (leftHand: HandAnchor?, rightHand: HandAnchor?)
描述:这是一个只读属性,返回一个元组,包含最新的左手和右手锚点。如果手部跟踪提供者未在运行,返回的锚点将为 nil。在应用程序编译为 visionOS 1.0 SDK 时,如果自上次访问该属性以来手锚点未更新,返回的锚点也将为 nil。

state: DataProviderState
描述:这是一个只读属性,表示手部跟踪提供者的当前状态。状态可以用来判断手部跟踪的健康状况,例如是否正在跟踪,是否有错误等。

init()
描述:这是类的初始化方法,用于创建 HandTrackingProvider 的实例。

isSupported: Bool
描述:这是一个静态属性,返回一个布尔值,指示当前设备是否支持手部跟踪提供者。这可以在应用程序启动时进行检查,以决定是否启用手部跟踪功能。

requiredAuthorizations: [ARKitSession.AuthorizationType]
描述:这是一个静态属性,返回一个数组,表示手部跟踪提供者所需的授权类型。例如,可能需要摄像头访问权限等。

anchorUpdates: AnchorUpdateSequence<HandAnchor>
描述:这是一个只读属性,返回一个异步序列,包含所有锚点的更新。这允许开发者以响应的方式处理手部跟踪锚点的变化。

handAnchors(at timestamp: TimeInterval) -> (leftHand: HandAnchor?, rightHand: HandAnchor?)
描述:这是一个方法,用于根据给定的时间戳查询手锚点。此方法并不是线程安全的,因此在多线程调用时,开发者必须自行提供同步机制。参数 timestamp 是目标时间戳,类型为秒。返回值为一个包含左手和右手锚点的元组,如果手部跟踪提供者未运行,锚点将为 nil。此方法在 visionOS 2.0 中可用。

description: String
描述:这是一个只读属性,提供了 HandTrackingProvider 的文本表示,通常用于调试或日志记录,以便开发者能够理解手部跟踪提供者的状态。

手部数据更新

 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 {//没有追踪数据返回
                                    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)")
                }
            }
        }
    }

总结
HandTrackingProvider 类是手部跟踪的核心组件,提供了多种方法和属性来管理手的状态、获取锚点以及处理更新。它的设计使得开发者能够轻松地在增强现实应用中实现手部交互和手势识别。通过这个类,开发者可以实时获取手的跟踪信息,并在需要时处理和更新这些信息,从而增强用户体验。

HandAnchor

属性详解
id: UUID
类型:UUID
描述:这是 HandAnchor 的唯一标识符。每个 HandAnchor 实例都有一个独特的 ID,用于区分不同的手部锚点。这在需要跟踪多个锚点时特别重要。

originFromAnchorTransform: simd_float4x4
类型:simd_float4x4
描述:该属性表示从手腕到原点坐标系的变换矩阵。它提供了手的位置和方向信息,可以用来将手部位置转换到应用的世界坐标系中。

handSkeleton: HandSkeleton?
类型:HandSkeleton?
描述:这是一个可选属性,表示手的骨骼结构。HandSkeleton 通常包含手指、掌心等的骨骼信息,帮助进行更精细的手势识别和动画。若当前未追踪到手部,可能返回 nil。

chirality: HandAnchor.Chirality
类型:HandAnchor.Chirality
描述:该属性表示手的侧别(左手或右手)。它是 HandAnchor 内部定义的一个枚举,包含 left 和 right,帮助区分左手和右手的锚点。

isTracked: Bool
类型:Bool
描述:此属性指示该手部锚点是否正在被追踪。如果为 true,表示系统当前能够有效地追踪到该手部锚点;如果为 false,则可能由于遮挡、光照不足等原因,锚点未能被有效追踪。

description: String
类型:String
描述:该属性提供了该锚点的文本描述,通常用于调试或日志输出。可以方便开发者了解当前锚点的状态和信息。

枚举类型: Chirality
HandAnchor.Chirality 是一个枚举类型,用于区分左手和右手,其内容包括:
case right: 表示右手。
case left: 表示左手。

description:提供对该枚举的文本描述。

HandSkeleton

neutralPose: HandSkeleton
描述:这是一个静态属性,返回一个处于中立姿势(neutral pose)的手部骨骼。中立姿势通常指手部自然放松的状态,没有施加任何外力或手势。这种姿势用于初始化或比较其他手势。

joint(_ named: HandSkeleton.JointName) -> HandSkeleton.Joint
描述:这是一个实例方法,用于获取指定名称的关节。参数 named 是一个 JointName 枚举值,表示要查询的关节名称(例如,wrist、thumbKnuckle 等)。该方法返回相应的 HandSkeleton.Joint 对象,表示该关节的具体信息。

description: String
描述:这个属性提供了 HandSkeleton 的文本表示,通常用于调试或日志记录,以便开发者能够理解手部骨骼的状态。

allJoints: [HandSkeleton.Joint]
描述:这个属性返回一个包含所有关节的数组,类型为 [HandSkeleton.Joint]。它允许开发者遍历手部的所有关节,便于进行操作和处理。

以下为拓展extension HandSkeleton

Joint 结构体
Joint 结构体表示手部骨骼中的一个关节,它包含多个属性来描述该关节的特征和状态。具体属性如下:

parentJoint: HandSkeleton.Joint?

描述:表示该关节的父关节。如果当前关节是根关节,则它没有父关节,返回 nil。这使得关节可以形成树形结构,从根关节逐级向下连接。
name: HandSkeleton.JointName

描述:关节的名称,使用 JointName 枚举来表示,如 wrist、thumbKnuckle 等。这种命名方式使得对手部结构的表示更加清晰。
parentFromJointTransform: simd_float4x4

描述:表示从该关节到其父关节的变换矩阵。对于根关节,其变换矩阵是一个单位矩阵,表明它的位置是参考原点的。
anchorFromJointTransform: simd_float4x4

描述:表示从该关节到手部锚点的变换矩阵。这有助于将关节的位置转换到手部的世界坐标系中,以便进行进一步的计算或渲染。
isTracked: Bool

描述:指示该关节是否正在被追踪。如果为 true,表示该关节的状态在当前被成功跟踪;如果为 false,可能由于遮挡或其他原因导致无法跟踪。
description: String

描述:提供该关节的文本描述,通常用于调试或日志输出,以便开发者理解当前关节的状态。
JointName 枚举
JointName 枚举列出了手部骨骼中所有的关节名称,包括但不限于手腕、手指等。这些名称对于识别手部的不同关节非常重要。其具体内容包括:

wrist: 手腕关节。
thumbKnuckle: 大拇指的指关节。
indexFingerKnuckle: 食指的指关节。
middleFingerKnuckle: 中指的指关节。
ringFingerKnuckle: 无名指的指关节。
littleFingerKnuckle: 小指的指关节。
forearmWrist: 前臂的手腕关节。
forearmArm: 前臂的关节。

相关文章

网友评论

      本文标题:versionPor 手部关节 相关

      本文链接:https://www.haomeiwen.com/subject/raendjtx.html