You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ARFragment中加载GLB模型?Sceneform加载失败求助

Sceneform加载raw目录GLB模型不显示的解决方案

核心问题:资源URI格式错误

直接用Uri.parse("model.glb")无法定位到raw目录下的资源,Android对raw资源的访问有特定规则,要么用资源ID直接加载,要么拼接正确格式的URI。

修正方案1:用资源ID加载(推荐)

ModelRenderable.builder支持直接传入资源ID,无需手动处理URI,更稳定:

// 调用时传入raw目录下的模型资源ID
placeObjectOnScene(arFragment!!, anchor, R.raw.model)

@RequiresApi(Build.VERSION_CODES.N)
private fun placeObjectOnScene(fragment: ArFragment, anchor: Anchor, modelResId: Int) {
    ModelRenderable.builder()
        .setSource(fragment.context, modelResId)
        .build()
        .thenAccept { renderable ->
            addModelToScene(fragment, anchor, renderable)
        }
        .exceptionally { throwable ->
            Log.e("ModelLoad", "加载失败", throwable)
            Toast.makeText(fragment.context, "错误: ${throwable.message}", Toast.LENGTH_LONG).show()
            null
        }
}

修正方案2:拼接正确的raw资源URI

如果坚持用URI方式,需要按固定格式拼接:

// 生成正确的raw资源URI
val modelUri = Uri.parse("android.resource://${requireContext().packageName}/raw/model")
placeObjectOnScene(arFragment!!, anchor, modelUri)

// 原函数无需修改,但必须保证URI格式正确

额外排查点

  • 验证addModelToScene实现:确保正确创建AnchorNode并添加到场景,示例实现:
    private fun addModelToScene(fragment: ArFragment, anchor: Anchor, renderable: ModelRenderable) {
        val anchorNode = AnchorNode(anchor)
        anchorNode.renderable = renderable
        // 可选:调整模型缩放比例,避免过大或过小
        anchorNode.localScale = Vector3(0.3f, 0.3f, 0.3f)
        fragment.arSceneView.scene.addChild(anchorNode)
    }
    
  • 检查模型兼容性:确认GLB模型符合glTF 2.0标准,可使用glTF Validator工具验证模型是否存在格式错误
  • 查看详细错误日志:在exceptionally块中添加Log打印,获取具体错误信息(比如资源找不到、模型解析失败等)
  • 确认AR环境状态:确保设备支持ARCore,CAMERA权限已授予,ARFragment的会话正常启动

内容的提问来源于stack exchange,提问作者Vasco Silva

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 11:15:37