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