如何在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
相关产品推荐
相关产品推荐

