जब उपयोगकर्ता हेड ट्रैकिंग की अनुमति देता है, तब आपका ऐप्लिकेशन ARCore for Jetpack XR की मदद से, हेड पोज़ की जानकारी पा सकता है. सिर की पोज़िशन की जानकारी से, आपका ऐप्लिकेशन ज़्यादा बेहतर अनुभव दे सकता है. जैसे, उपयोगकर्ता के देखने के फ़ील्ड के हिसाब से विंडो को फ़ॉलो करना.
Jetpack XR के लिए ARCore सेशन बनाना
Jetpack XR Runtime 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 } } }