修改SceneForm示例后触摸SceneView无法显示相机相对位置对象的问题
我来帮你梳理几个关键的排查方向,一步步找出问题所在:
先确认
andyRenderable是否成功加载
你代码里直接使用了andyRenderable,但如果这个渲染对象没有正确初始化或加载失败,节点肯定无法显示。你需要检查是否在合适的时机(比如onCreate)完成了渲染对象的异步加载,并且确保加载成功。示例代码应该类似这样:private var andyRenderable: ModelRenderable? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 加载Andy模型 ModelRenderable.builder() .setSource(this, R.raw.andy) .build() .thenAccept { renderable -> andyRenderable = renderable Log.d("SceneForm", "Andy模型加载成功") } .exceptionally { throwable -> Log.e("SceneForm", "模型加载失败: ${throwable.message}") null } }可以通过Log确认加载是否成功,如果加载失败,那
andy.renderable就是null,自然看不到对象。检查触摸事件是否真的被触发
你代码里加了println("Touch!"),先去Logcat里看看有没有这个输出。如果没有,说明触摸事件被ARFragment拦截了——SceneForm通常推荐使用setOnTapArPlaneListener来监听平面点击,而不是直接给arSceneView设置OnTouchListener,因为后者可能被上层的触摸逻辑消费掉。试试替换成平面点击监听:arFragment!!.setOnTapArPlaneListener { hitResult, plane, motionEvent -> println("触摸到平面了!") val andy = Node() andy.setParent(arFragment?.arSceneView?.scene?.camera) andy.localPosition = Vector3(0f, 0f, -1f) // 相机正前方1米 andy.renderable = andyRenderable }验证节点的位置和父节点是否合理
你设置的localPosition = Vector3(1.0f, 1.0f, 1.0f)是相对于相机的右方1米、上方1米、前方1米?这个位置可能在你的视野之外,或者被相机本身挡住了。可以先改成Vector3(0f, 0f, -1f)(相机正前方1米),看看能不能显示。另外,把父节点设为相机的话,节点会跟着相机移动,你触摸后移动相机看看是不是能找到它。确保所有SceneForm操作在主线程执行
如果andyRenderable是异步加载的,要注意设置节点渲染对象的代码必须在主线程运行。如果是在thenAccept回调里操作节点,那没问题,因为thenAccept默认在主线程执行,但如果是其他子线程,就会导致节点无法正确渲染。检查AR会话是否正常运行
确认你的设备支持ARCore,并且已经获取了相机权限,ARFragment的会话已经正常启动。可以通过arFragment?.arSceneView?.session是否为null来判断,如果会话没启动,整个AR场景都无法正常工作,节点自然显示不出来。
内容的提问来源于stack exchange,提问作者soderbjorn

