谷歌分享:用Android XR、Geospatial API和Gemini构建XR导览应用

PICO 4 Ultra

查看引用/信息源请点击:映维网Nweon

用Android XR、Geospatial API和Gemini构建XR导览应用

映维网Nweon 2026年06月18日谷歌在今年I/O大会宣布了对空间体验的更新:Geospatial API现已在ARCore for Jetpack XR中提供预览版。通过将VPS视觉定位系统引入Android XR,Android XR能够在支持区域以亚米级精度和精确方向将数字内容锚定到物理世界。

现在为了探索Geospatial API能带来什么,团队构建了一个演示:XR Geospatial Tour。

谷歌分享:用Android XR、Geospatial API和Gemini构建XR导览应用

想象一下,你走进一座新城市,戴上XR眼镜(比如即将推出的XREAL Project Aura),然后立刻拥有一位知识渊博的本地向导带你参观。你无需低头查看2D地图,取而代之的是3D模型温和地指引你的路径,一个智能语音会告诉你眼前的历史地标。团队结合了Geospatial API、使用Firebase AI Logic的Gemini API、Google Maps Grounding和Jetpack XR SDK,打造了一个解放双手的沉浸式步行导览体验。

下面我们来逐步了解实现细节,并展示团队是如何将相关API串联起来,构建一个世界级空间体验。

使用ARCore Geospatial API(VPS)精确定位用户

通过结合GPS的强大功能和VPS的精度,增强你在XR上的导航体验。VPS所带来的精度和精确方向使得3D航点能够与物理世界对齐。

这正是Android XR端的Geospatial API能帮助你构建定制体验的原因。通过使用先进的计算机视觉,VPS试图提供比GPS更精确的GeospatialPose(包括纬度、经度和朝向)。

以下是我们如何通过将设备方向映射到地理坐标来获取用户的地理空间位姿:

// Retrieve the current geospatial pose from the ARCore session
val result = geospatial.createGeospatialPoseFromPose(arDevice.state.value.devicePose)
if (result is CreateGeospatialPoseFromPoseSuccess) {
    val pose = result.pose
    Log.d("VPS", "Accurate Location: ${pose.latitude}, ${pose.longitude}")
}

由于整个体验依赖于这种精度,他们监控horizontalAccuracy和orientationYawAccuracy,直到达到阈值。如果用户在室内或未识别区域,会提示他们“走到户外公共空间并环顾四周”。

使用Gemini API和Google Maps Grounding制定行程

一旦获得位置,就使用通过Firebase AI Logic集成的Gemini API,提示Gemini模型充当本地导游。将用户坐标传递给模型,并让其输出包含附近步行游览路线的结构化JSON响应:

val configForTools = ToolConfig(
    functionCallingConfig = null,
    retrievalConfig = retrievalConfig {
        latLng = FirebaseLatLng(pose.latitude, pose.longitude)
        languageCode = "en"
    }
)
val responseJsonSchema = Schema.obj(
    mapOf(
        "locationIntro" to Schema.string(),
        "tours" to Schema.array(
            Schema.obj(
                mapOf(
                    "title" to Schema.string(),
                    "description" to Schema.string(),
                    "stops" to Schema.array(
                        Schema.obj(
                            mapOf(
                                "name" to Schema.string(),
                                "detailedName" to Schema.string(),
                                "description" to Schema.string()
                            )
                        )
                    )
                )
            )
        )
    )
)
val model = Firebase.ai(backend = GenerativeBackend.googleAI()).generativeModel(
    modelName = "gemini-3.5-flash",
    tools = listOf(Tool.googleMaps()),
    generationConfig = generationConfig {
        responseMimeType = "application/json"
        responseSchema = responseJsonSchema
    }
)
val result = model.generateContent("The user is at latitude ${pose.latitude} and longitude ${pose.longitude}. Generate exactly 3 diverse tours near this location (e.g., historical, food, nature). All tour ideas should be walking distance only.")

大型语言模型擅长生成丰富的描述,但有时会虚构精确的经纬度坐标。为了解决这个问题,团队使用了Google Maps Grounding来锚定AI。

指引你的声音:Gemini 2.5 TTS

为了让导游感觉真实存在,团队实现了动态配音。

使用gemini-2.5-flash-tts模型,他们可以配置模型生成配置,使其原生返回音频数据而不仅仅是文本。以下是如何请求ResponseModality.AUDIO:

val ttsModel = Firebase.ai(backend = GenerativeBackend.googleAI())
.generativeModel(
    modelName = "gemini-2.5-flash-tts",
    generationConfig = generationConfig {
        // Instruct the model to return Audio
        responseModalities = listOf(ResponseModality.AUDIO)
    }
)
val response = ttsModel.generateContent("Say in a neutral but positive voice:\n$prompt")
// Extract the raw audio bytes from the response
val audioBytes = response.candidates.firstOrNull()?.content?.parts
?.filterIsInstance()
?.firstOrNull { it.mimeType.contains("audio") }?.inlineData

使用Jetpack XR在3D中呈现

最后一步是将这些数据渲染到用户的视场中。Jetpack XR SDK使得从2D Android UI过渡到空间计算变得直观。

团队使用Jetpack Compose for XR构建了空间组件。为了表示游览中的兴趣点,他们构建了一个名为InfoSphere的Composable,它包含一个漂浮在空间中的3D球体GltfModel,并可交互以显示信息。

使用Jetpack XR SDK,可以通过SpatialBox和SceneCoreEntity将3D模型与Compose UI并排放置。团队同时使用了InteractableComponent来响应用户点击。

@Composable
fun InfoSphere(
    content: InfoBubbleContent,
    session: Session,
    sphereModel: GltfModel,
    isSelected: Boolean,
    onClick: () -> Unit
) {
    // SpatialBox lets us arrange 3D components and SpatialPanels together
    SpatialBox(
        SubspaceModifier
        .offset(x = 2.dp, y = 1.dp, z = (-3).dp) // Positioned in 3D space
    ) {
        // Smoothly animate the visibility of our 2D Compose UI Panel
        AnimatedSpatialVisibility(visible = isSelected) {
            SpatialPanel {
                InfoBubble(content) // Regular 2D Compose UI
            }
        }
        // Render our interactive 3D sphere
        SceneCoreEntity(
            factory = {
                GltfModelEntity.create(session, sphereModel).also { entity ->
                    // Make the 3D model respond to user taps
                    entity.addComponent(InteractableComponent.create(session) { inputEvent ->
                            if (inputEvent.action == InputEvent.Action.UP) {
                                onClick()
                            }
                        })
                }
            }
        )
    }
}

通过将用于传统Compose UI表面的AnimatedSpatialVisibility与SceneCoreEntity 3D元素相结合,他们能够将数据无缝地融入物理世界。

今天就探索Android XR的可能性

谷歌表示:“构建XR Geospatial Tour应用让我们看到,对于Android开发者而言,世界级空间体验的入门门槛比以往任何时候都低。随着Geospatial API在Android XR提供预览版,你的应用可以无缝地理解周围的物理世界。通过将Compose for XR的API与VPS的高精度定位数据以及Gemini的生成能力相结合,我们可以创造出既了解用户位置又了解其观看对象的体验。”

为了帮助你亲身体验Android XR,谷歌已经开放Android XR开发者催化剂计划的申请,计划包括XREAL Project Aura。具体请访问这个页面

本文链接https://news.nweon.com/141201
转载须知:转载摘编需注明来源映维网并保留本文链接
素材版权:除额外说明,文章所用图片、视频均来自文章关联个人、企业实体等提供
QQ交流群苹果Vision  |  Meta Quest  |  AR/VR开发者  |  映维粉丝读者
XR Dev Wechat Group/微信群

您可能还喜欢...

资讯