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

Geçerli XR cihazlar
Bu kılavuz, bu tür XR cihazlar için deneyimler oluşturmanıza yardımcı olur.
XR Kulaklıklar
Kablolu XR Gözlükler

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