با استفاده از ARCore برای Jetpack XR، موقعیت سر را در برنامه خود بگنجانید

پس از اینکه کاربر اجازه ردیابی سر را داد ، برنامه شما می‌تواند اطلاعات مربوط به موقعیت سر را از طریق 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
        }
    }
}