Kullanıcı baş takibi için izin verdikten sonra uygulamanız, Jetpack XR için ARCore aracılığıyla baş duruşu bilgilerini alabilir. Baş pozisyonu bilgileri, uygulamanızın daha sezgisel deneyimler oluşturmasına yardımcı olabilir. Örneğin, kullanıcının görüş alanını takip eden bir pencere oluşturabilirsiniz.
Jetpack XR için ARCore oturumu oluşturma
Jetpack XR için ARCore oturumu aracılığıyla baş pozisyonu bilgilerini alma.
Session
elde etmek için Oturumun yaşam döngüsünü anlama başlıklı makaleyi inceleyin.
Oturumu yapılandırma
Kafa hareketi izleme özelliği, XR oturumlarında varsayılan olarak etkin değildir. Kafa takibini etkinleştirmek için oturumu yapılandırın ve HeadTrackingMode.LAST_KNOWN
modunu ayarlayın:
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. */) }
Baş pozisyonu verilerini alma
Baş duruşu verileri, RenderViewpoint
aracılığıyla kullanıma sunulur.
RenderViewpoint
, bir cihazın belirli bir bakış açısı için pozu ve görüş alanını tanımlar. Cihazın özelliklerine bağlı olarak cihazda sol, sağ veya mono bakış açıları olabilir.
Mono bakış açısı için veri elde etmek üzere:
val mono = RenderViewpoint.mono(session) ?: return mono.state.collect { state -> val fov = state.fieldOfView val viewpointPose = state.pose }
Baş takibinin kullanım alanları
Uygulamanızın baş takibini kullanabileceği bir yöntem, kullanıcıların bakmasını veya hareket etmesini gerektiren uygulamalarda öğeleri kullanıcının görüş alanında tutmaktır.
Kullanıcının görüş alanında, hareket hastalığına neden olabileceğinden sabitlenmiş öğeler kullanmayın. Bunun yerine, kullanıcının başını kısa bir süre takip eden öğe hareketini kullanın:
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 } } }