【visionOS/ARKit】ساده ترین کد نمونه برای ردیابی دست【latestAnchors ver】

Summarize this content to 400 words in Persian Lang
اساس API ردیابی دست ARKit در visionOS به دست آوردن داده هایی مانند مختصات و چرخش هر مفصل دست است.
در اینجا یک کد نمونه از API ردیابی دستی ARKit در visionOS است که تنها با 73 خط کد کار می کند.
دانش عمومی
ابتدا ویدیوی این جلسه را تماشا کنید. این یک نمای کلی خوب از ARKit و ردیابی دست در visionOS ارائه می دهد.
با ARKit برای محاسبات فضایی – WWDC23 – ویدیوها – برنامه نویس اپل آشنا شوید
ردیابی دست از ساعت 15:05 توضیح داده شده است.
دو API
دو API برای دریافت داده های مشترک وجود دارد. هر دو را می توان از نمونه HandTrackingProvider در دسترس قرار داد.
anchorUpdates: آخرین مقادیر را از طریق AsyncSequence دریافت می کند.
latestAnchors: حاوی آخرین مقادیر است.
در این مورد، من آن را با anchorUpdates پیاده سازی کردم.
ارتباط دادن: نسخه AsyncSequence
بررسی اجمالی کد نمونه
ردیابی دست با راه اندازی برنامه شروع می شود.
اجسام کروی ساده را در تمام مفاصل هر دو دست قرار می دهد.
موقعیت هر شی را برای مطابقت با آخرین موقعیت مشترک به روز می کند.
اطمینان حاصل می کند که اشیاء با دست پنهان نمی شوند.
کد منبع کامل
import SwiftUI
import RealityKit
import ARKit
@main
struct MyApp: App {
var body: some SwiftUI.Scene {
ImmersiveSpace {
RealityView { content in
for chirality in [HandAnchor.Chirality.left, .right] {
for jointName in HandSkeleton.JointName.allCases {
let jointEntity = ModelEntity(mesh: .generateSphere(radius: 0.006),
materials: [SimpleMaterial()])
jointEntity.components.set(JointComponent(chirality: chirality,
jointName: jointName))
content.add(jointEntity)
}
}
}
}
.upperLimbVisibility(.hidden)
}
init() {
JointComponent.registerComponent()
JointSystem.registerSystem()
}
}
struct JointComponent: Component {
let chirality: HandAnchor.Chirality
let jointName: HandSkeleton.JointName
}
struct JointSystem: System {
private let session = ARKitSession()
private let provider = HandTrackingProvider()
init(scene: RealityKit.Scene) {
setUpSession()
}
private func setUpSession() {
Task {
try! await session.run([provider])
}
}
func update(context: SceneUpdateContext) {
let entities = context.entities(matching: .init(where: .has(JointComponent.self)),
updatingSystemWhen: .rendering)
let (leftHandAnchor, rightHandAnchor) = provider.latestAnchors
for handAnchor in [leftHandAnchor, rightHandAnchor] {
guard let handAnchor else { continue }
for entity in entities {
let component = entity.components[JointComponent.self]!
guard component.chirality == handAnchor.chirality,
let joint = handAnchor.handSkeleton?.joint(component.jointName) else {
continue
}
entity.setTransformMatrix(handAnchor.originFromAnchorTransform * joint.anchorFromJointTransform,
relativeTo: nil)
}
}
}
}
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
برای استفاده این کد را کپی و پیست کنید.
مراحل اضافی
هر متنی را برای “NSHandsTrackingUsageDescription” در Info.plist تنظیم کنید.
در Info.plist “Preferred Default Scene Session Role” را روی “Immersive Space” تنظیم کنید.
نظرات
توضیحات در ویدیوی جلسه و دانش اولیه SwiftUI و RealityKit حذف شده است.
آخرین مجریان؟
https://developer.apple.com/documentation/arkit/handtrackingprovider/4189752-latestanchors
جدیدترین لنگرهای دست برای هر دست.دسترسی به این تاپل مقادیر آن را مصرف می کند و آنها را تا به روز رسانی انکر بعدی روی صفر تنظیم می کند.
ECS
struct JointComponent: Component {
let chirality: HandAnchor.Chirality
let jointName: HandSkeleton.JointName
}
struct JointSystem: System {
…
func update(context: SceneUpdateContext) {
let entities = context.entities(matching: .init(where: .has(JointComponent.self)),
updatingSystemWhen: .rendering)
let (leftHandAnchor, rightHandAnchor) = provider.latestAnchors
…
}
}
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
من نظرسنجی را با استفاده از الگوی ECS (Entity Component System) پیادهسازی کردم، یک پیادهسازی رایج در RealityKit.
تنظیم مجوزهای دسترسی
برای درخواست مجوز دسترسی، باید هر متنی را برای «NSHandsTrackingUsageDescription» در Info.plist تنظیم کنید.
این کلید در منوی کشویی ظاهر نمی شود، بنابراین مستقیماً آن را وارد کنید.
انسداد دست
در حالی که یک صحنه ImmersiveSpace ارائه می شود، دید ترجیحی اندام های فوقانی کاربر را تنظیم می کند.این سیستم میتواند اندامهای فوقانی کاربر را در طول تجربههای کاملاً غوطهور نشان دهد، اما شما همچنین میتوانید آنها را پنهان کنید، بهعنوان مثال، بهجای نمایش دستهای مجازی.https://developer.apple.com/documentation/swiftui/scene/upperlimbvisibility(_:)
.upperLimbVisibility(.hidden)
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
برنامه را در فضای کامل اجرا کنید
@main
struct MyApp: App {
…
var body: some SwiftUI.Scene {
ImmersiveSpace {
…
}
…
}
}
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
هنگامی که یک پروژه برنامه جدید visionOS در Xcode ایجاد می کنید، کدی را برای راه اندازی در یک پنجره تولید می کند. برای سادگی، آن را در فضای کامل پرتاب کردم.
در Info.plist “Preferred Default Scene Session Role” را روی “Immersive Space” تنظیم کنید. اگر این تنظیمات را انجام ندهید، برنامه بلافاصله پس از راه اندازی از کار می افتد.
توجه: یک دستگاه فیزیکی مورد نیاز است
برای آزمایش ARKit Hand Tracking API به یک دستگاه فیزیکی نیاز دارید. در شبیه ساز اصلا کار نمی کند.
گام بعدی
وضعیت مجوز فعلی را بررسی کنید: session.queryAuthorization (برای:)
درخواست صریح مجوز: session.requestAuthorization(برای:)
وضعیت لنگرها را بررسی کنید: AnchorUpdate.Event
بررسی کنید که آیا هر لنگر یا مفصل ردیابی می شود: TrackableAnchor.isTracked
وضعیت جلسه را رعایت کنید: ARKitSession.Events
بررسی کنید که آیا محیط زمان اجرا فعلی از آن پشتیبانی می کند یا خیر: HandTrackingProvider.isSupported
پیوندها
با ARKit برای محاسبات فضایی – WWDC23 – ویدیوها – برنامه نویس اپل آشنا شوید
ARKit در visionOS | مستندات توسعه دهنده اپل
upperLimbVisibility(_:) | مستندات توسعه دهنده اپل
HandsRuler در اپ استور
FlipByBlink/HandsRuler: برنامه را با ردیابی دستی برای Apple Vision Pro اندازهگیری کنید
اساس API ردیابی دست ARKit در visionOS به دست آوردن داده هایی مانند مختصات و چرخش هر مفصل دست است.
در اینجا یک کد نمونه از API ردیابی دستی ARKit در visionOS است که تنها با 73 خط کد کار می کند.
دانش عمومی
ابتدا ویدیوی این جلسه را تماشا کنید. این یک نمای کلی خوب از ARKit و ردیابی دست در visionOS ارائه می دهد.
با ARKit برای محاسبات فضایی – WWDC23 – ویدیوها – برنامه نویس اپل آشنا شوید
ردیابی دست از ساعت 15:05 توضیح داده شده است.
دو API
دو API برای دریافت داده های مشترک وجود دارد. هر دو را می توان از نمونه HandTrackingProvider در دسترس قرار داد.
- anchorUpdates: آخرین مقادیر را از طریق AsyncSequence دریافت می کند.
- latestAnchors: حاوی آخرین مقادیر است.
در این مورد، من آن را با anchorUpdates پیاده سازی کردم.
ارتباط دادن: نسخه AsyncSequence
بررسی اجمالی کد نمونه
- ردیابی دست با راه اندازی برنامه شروع می شود.
- اجسام کروی ساده را در تمام مفاصل هر دو دست قرار می دهد.
- موقعیت هر شی را برای مطابقت با آخرین موقعیت مشترک به روز می کند.
- اطمینان حاصل می کند که اشیاء با دست پنهان نمی شوند.
کد منبع کامل
import SwiftUI
import RealityKit
import ARKit
@main
struct MyApp: App {
var body: some SwiftUI.Scene {
ImmersiveSpace {
RealityView { content in
for chirality in [HandAnchor.Chirality.left, .right] {
for jointName in HandSkeleton.JointName.allCases {
let jointEntity = ModelEntity(mesh: .generateSphere(radius: 0.006),
materials: [SimpleMaterial()])
jointEntity.components.set(JointComponent(chirality: chirality,
jointName: jointName))
content.add(jointEntity)
}
}
}
}
.upperLimbVisibility(.hidden)
}
init() {
JointComponent.registerComponent()
JointSystem.registerSystem()
}
}
struct JointComponent: Component {
let chirality: HandAnchor.Chirality
let jointName: HandSkeleton.JointName
}
struct JointSystem: System {
private let session = ARKitSession()
private let provider = HandTrackingProvider()
init(scene: RealityKit.Scene) {
setUpSession()
}
private func setUpSession() {
Task {
try! await session.run([provider])
}
}
func update(context: SceneUpdateContext) {
let entities = context.entities(matching: .init(where: .has(JointComponent.self)),
updatingSystemWhen: .rendering)
let (leftHandAnchor, rightHandAnchor) = provider.latestAnchors
for handAnchor in [leftHandAnchor, rightHandAnchor] {
guard let handAnchor else { continue }
for entity in entities {
let component = entity.components[JointComponent.self]!
guard component.chirality == handAnchor.chirality,
let joint = handAnchor.handSkeleton?.joint(component.jointName) else {
continue
}
entity.setTransformMatrix(handAnchor.originFromAnchorTransform * joint.anchorFromJointTransform,
relativeTo: nil)
}
}
}
}
برای استفاده این کد را کپی و پیست کنید.
مراحل اضافی
- هر متنی را برای “NSHandsTrackingUsageDescription” در Info.plist تنظیم کنید.
- در Info.plist “Preferred Default Scene Session Role” را روی “Immersive Space” تنظیم کنید.
نظرات
توضیحات در ویدیوی جلسه و دانش اولیه SwiftUI و RealityKit حذف شده است.
آخرین مجریان؟
https://developer.apple.com/documentation/arkit/handtrackingprovider/4189752-latestanchors
جدیدترین لنگرهای دست برای هر دست.
دسترسی به این تاپل مقادیر آن را مصرف می کند و آنها را تا به روز رسانی انکر بعدی روی صفر تنظیم می کند.
ECS
struct JointComponent: Component {
let chirality: HandAnchor.Chirality
let jointName: HandSkeleton.JointName
}
struct JointSystem: System {
...
func update(context: SceneUpdateContext) {
let entities = context.entities(matching: .init(where: .has(JointComponent.self)),
updatingSystemWhen: .rendering)
let (leftHandAnchor, rightHandAnchor) = provider.latestAnchors
...
}
}
من نظرسنجی را با استفاده از الگوی ECS (Entity Component System) پیادهسازی کردم، یک پیادهسازی رایج در RealityKit.
تنظیم مجوزهای دسترسی
برای درخواست مجوز دسترسی، باید هر متنی را برای «NSHandsTrackingUsageDescription» در Info.plist تنظیم کنید.
این کلید در منوی کشویی ظاهر نمی شود، بنابراین مستقیماً آن را وارد کنید.
انسداد دست
در حالی که یک صحنه ImmersiveSpace ارائه می شود، دید ترجیحی اندام های فوقانی کاربر را تنظیم می کند.
این سیستم میتواند اندامهای فوقانی کاربر را در طول تجربههای کاملاً غوطهور نشان دهد، اما شما همچنین میتوانید آنها را پنهان کنید، بهعنوان مثال، بهجای نمایش دستهای مجازی.
https://developer.apple.com/documentation/swiftui/scene/upperlimbvisibility(_:)
.upperLimbVisibility(.hidden)
برنامه را در فضای کامل اجرا کنید
@main
struct MyApp: App {
...
var body: some SwiftUI.Scene {
ImmersiveSpace {
...
}
...
}
}
هنگامی که یک پروژه برنامه جدید visionOS در Xcode ایجاد می کنید، کدی را برای راه اندازی در یک پنجره تولید می کند. برای سادگی، آن را در فضای کامل پرتاب کردم.
در Info.plist “Preferred Default Scene Session Role” را روی “Immersive Space” تنظیم کنید. اگر این تنظیمات را انجام ندهید، برنامه بلافاصله پس از راه اندازی از کار می افتد.
توجه: یک دستگاه فیزیکی مورد نیاز است
برای آزمایش ARKit Hand Tracking API به یک دستگاه فیزیکی نیاز دارید. در شبیه ساز اصلا کار نمی کند.
گام بعدی
- وضعیت مجوز فعلی را بررسی کنید: session.queryAuthorization (برای:)
- درخواست صریح مجوز: session.requestAuthorization(برای:)
- وضعیت لنگرها را بررسی کنید: AnchorUpdate.Event
- بررسی کنید که آیا هر لنگر یا مفصل ردیابی می شود: TrackableAnchor.isTracked
- وضعیت جلسه را رعایت کنید: ARKitSession.Events
- بررسی کنید که آیا محیط زمان اجرا فعلی از آن پشتیبانی می کند یا خیر: HandTrackingProvider.isSupported
پیوندها
با ARKit برای محاسبات فضایی – WWDC23 – ویدیوها – برنامه نویس اپل آشنا شوید
ARKit در visionOS | مستندات توسعه دهنده اپل
upperLimbVisibility(_:) | مستندات توسعه دهنده اپل
HandsRuler در اپ استور
FlipByBlink/HandsRuler: برنامه را با ردیابی دستی برای Apple Vision Pro اندازهگیری کنید