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

如何在Android Studio中获取ARCore渲染3D物体的点击事件?

嘿,这个需求我做AR项目的时候刚好实现过,其实核心就是利用ARCore的命中检测机制来识别用户点击是否命中了3D物体,然后触发对话框就行。下面分两种常用场景给你讲具体实现:

一、用Sceneform SDK实现(推荐,更简单)

如果你项目里用的是Google官方的Sceneform(现在叫ARCore Extensions),那实现起来非常直观,因为Sceneform的Node类本身支持点击监听:

1. 给3D模型节点设置点击监听器

当你加载并创建好3D模型的Node之后,直接给它绑定OnTapListener就行:

// 假设你已经通过Sceneform加载好了3D模型,得到了modelNode
val modelNode = Node()
modelNode.setParent(arFragment.arSceneView.scene)
// 这里省略模型位置、缩放等设置代码...

// 绑定点击监听
modelNode.setOnTapListener { _, _ ->
    // 点击到模型了,弹出对话框
    showModelClickedDialog()
}

2. 实现弹出对话框的方法

这就是普通的Android对话框,直接用AlertDialog就行:

private fun showModelClickedDialog() {
    AlertDialog.Builder(this)
        .setTitle("模型被点击啦")
        .setMessage("你成功触发了3D物体的点击事件!")
        .setPositiveButton("确认") { dialog, _ ->
            dialog.dismiss()
        }
        .setNegativeButton("取消", null)
        .show()
}

注意事项

  • 如果你的模型有透明区域,想忽略这些区域的点击,可以给Node设置自定义碰撞形状,比如用模型的网格碰撞体替代默认的边界盒:
    modelNode.collisionShape = ShapeFactory.createMeshShape(modelRenderable.mesh)
    
  • 多个模型的话,给每个Node单独设置监听器就行,还可以在监听回调里区分不同模型,弹出对应内容的对话框。
二、原生ARCore实现(无Sceneform)

如果是直接用ARCore原生API(比如自己用OpenGL渲染3D物体),就得手动处理触摸事件和命中测试:

1. 重写Activity的触摸事件

在触摸抬起时,发起ARCore的命中测试,遍历结果判断是否命中目标物体:

private Session arSession;
private Anchor targetAnchor; // 你创建的3D物体关联的Anchor

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_UP) {
        // 发起命中测试
        List<HitResult> hitResults = arSession.hitTest(event);
        for (HitResult result : hitResults) {
            // 判断是否命中我们的目标物体(通过Anchor关联)
            Trackable trackable = result.getTrackable();
            if (trackable instanceof Anchor && result.getAnchor().equals(targetAnchor)) {
                // 触发对话框
                showDialog();
                return true;
            }
        }
    }
    return super.onTouchEvent(event);
}

2. 实现对话框方法

和Sceneform场景一样,用AlertDialog即可:

private void showDialog() {
    new AlertDialog.Builder(this)
        .setTitle("物体被点击")
        .setMessage("成功识别到3D物体的点击操作!")
        .setPositiveButton("确定", (dialog, which) -> dialog.dismiss())
        .show();
}

注意事项

  • 原生方式下,你需要确保渲染的3D物体和Anchor正确关联,否则命中测试无法识别到。
  • 如果是复杂模型,可能需要自己处理碰撞检测逻辑,比如对比射线与模型网格的交点。

内容的提问来源于stack exchange,提问作者Janak Phuyal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:10:40