پس از اینکه کاربر اجازه ردیابی سر را داد ، برنامه شما میتواند اطلاعات مربوط به موقعیت سر را از طریق ARCore برای Jetpack XR بازیابی کند. اطلاعات موقعیت سر میتواند به برنامه شما کمک کند تا تجربیات شهودیتری مانند پنجرهای که میدان دید کاربر را دنبال میکند، ایجاد کند.
یک جلسه ARCore برای Jetpack XR ایجاد کنید
اطلاعات مربوط به حالت سر را از طریق یک جلسه ARCore برای Jetpack XR دریافت کنید. برای دریافت یک Session
، به بخش «درک چرخه عمر یک جلسه » مراجعه کنید.
پیکربندی جلسه
ردیابی سر به طور پیشفرض در جلسات XR فعال نیست. برای فعال کردن ردیابی سر، جلسه را پیکربندی کنید و حالت HeadTrackingMode.LAST_KNOWN
را تنظیم کنید:
val newConfig = session.config.copy( headTracking = Config.HeadTrackingMode.LAST_KNOWN, ) when (val result = session.configure(newConfig)) { is SessionConfigureSuccess -> TODO(/* Success! */) is SessionConfigureConfigurationNotSupported -> TODO(/* Some combinations of configurations are not valid. Handle this failure case. */) else -> TODO(/* The session could not be configured. See SessionConfigureResult for possible causes. */) }
بازیابی دادههای حالت سر
دادههای حالت سر از طریق یک RenderViewpoint
نمایش داده میشوند. یک RenderViewpoint
حالت و میدان دید را برای یک نقطه دید مشخص از یک دستگاه توصیف میکند. یک دستگاه میتواند بسته به قابلیتهای دستگاه، دارای نقطه دید چپ، راست یا تکبعدی باشد.
برای به دست آوردن دادهها برای دیدگاه تکبعدی:
val mono = RenderViewpoint.mono(session) ?: return mono.state.collect { state -> val fov = state.fieldOfView val viewpointPose = state.pose }
کاربردهای ردیابی سر
یکی از راههایی که برنامه شما میتواند از ردیابی سر استفاده کند، نگه داشتن موجودیتها در میدان دید کاربر است، برای برنامههایی که نیاز دارند کاربران شما نگاه کنند یا حرکت کنند.
از استفاده از اشیاء قفلشده روی سر در میدان دید کاربر خودداری کنید زیرا این امر میتواند باعث تهوع ناشی از حرکت شود. در عوض، از اشیاء متحرکی استفاده کنید که پس از مدت کوتاهی سر کاربر را دنبال میکنند:
val viewpointPose = RenderViewpoint.left(session)!!.state lifecycleScope.launch { while (true) { delay(2000) val start = panel.getPose() val startTime = session.state.value.timeMark val pose = session.scene.perceptionSpace.transformPoseTo( viewpointPose.value.pose, session.scene.activitySpace ) val target = Pose(pose.translation + pose.forward * 1f, pose.rotation) while (true) { val ratio = (session.state.value.timeMark - startTime).inWholeMilliseconds / 500f panel.setPose(Pose.lerp(start, target, ratio)) if (ratio > 1f) break } } }