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
Uygulamanızın oluşturabileceği bir Jetpack XR Çalışma Zamanı Session aracılığıyla baş pozisyonu bilgilerini alın.
Oturumu yapılandırma
Kafa hareketi izleme, 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 cihazın sol, sağ veya mono bakış açıları olabilir.
Tek 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 } } }