Jetpack XR için ARCore ile baş konumunu uygulamanıza dahil etme

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
        }
    }
}