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

如何用ARSceneView渲染View?代码可运行但无显示求助

ARSceneView锚点上无法渲染文字/图片ViewNode

我用SceneView和ARSceneView开发AR体验,需要在锚点上渲染文字和图片。参考官方加载模型的示例代码写了对应逻辑,代码能编译运行,但锚点上完全看不到内容;换成加载模型的代码时,模型能正常显示。普通非AR版SceneView有更易用的ViewNode构造方法,可以直接传View参数,我怀疑是不是漏了类似用法,或者ViewAttachmentManager的ownerView用错了。

试过几种调整:简化写法、去掉onLoaded回调、直接用主sceneView的ViewAttachmentManager,但问题都没解决。

初始代码:

fun addAnchorNode(anchor: Anchor) {
    sceneView.addChildNode(
        AnchorNode(sceneView.engine, anchor)
            .apply {
                isEditable = true
                lifecycleScope.launch {
                    val view =  LayoutInflater.from(this@MainActivity).inflate(R.layout.marker, null)
                    val attachmentManager =
                        ViewAttachmentManager(this@MainActivity, sceneView)
                    attachmentManager.addView(view)
                    addChildNode(ViewNode(sceneView.engine, sceneView.modelLoader, attachmentManager))

                }
                anchorNode = this
            }
    )
}

补充尝试的代码:

val attachmentManager =
    ViewAttachmentManager(this@MainActivity, sceneView)
val node = ViewNode(sceneView.engine, sceneView.modelLoader, attachmentManager)
node.loadView(this@MainActivity, R.layout.marker, onLoaded = { instance, view ->
    attachmentManager.addView(view)
})

解决方法

1. 绑定正确的生命周期

你当前代码里的ViewAttachmentManager缺少生命周期绑定,导致View无法被正确挂载渲染。创建时要传入当前组件的LifecycleOwner,确保它和Activity/SceneView的生命周期同步。

2. 明确View尺寸

ViewNode默认没有固定尺寸,可能导致内容因尺寸为0而不可见。要么在布局文件R.layout.marker中指定固定宽高,要么在加载后手动设置View的布局参数。

3. 修正后的完整代码

fun addAnchorNode(anchor: Anchor) {
    val anchorNode = AnchorNode(sceneView.engine, anchor).apply {
        isEditable = true
        sceneView.addChildNode(this)
    }

    // 传入LifecycleOwner绑定生命周期
    val attachmentManager = ViewAttachmentManager(this@MainActivity, sceneView, this@MainActivity.lifecycle)
    val viewNode = ViewNode(sceneView.engine, sceneView.modelLoader, attachmentManager)

    viewNode.loadView(this@MainActivity, R.layout.marker) { _, view ->
        // 设置View尺寸(按需调整)
        view.layoutParams = ViewGroup.LayoutParams(
            300, // 宽度,单位px
            200  // 高度,单位px
        )
        attachmentManager.addView(view)
        anchorNode.addChildNode(viewNode)
    }

    anchorNode = anchorNode
}

4. 额外排查点

  • 检查R.layout.marker的布局:确保文字颜色和背景对比明显,图片资源有效,没有设置visibility="gone"或透明属性
  • 调整ViewNode的缩放:默认尺寸在AR场景中可能过大或过小,可通过viewNode.localScale = Vector3(0.01f, 0.01f, 0.01f)调整
  • 验证锚点位置:先添加一个简单的3D模型节点到锚点上,确认锚点确实在相机视野内的正确位置

内容的提问来源于stack exchange,提问作者Gabe Sechan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 21:37:43