Unity ARCore开发:如何检测对跟踪图像的点击/触摸操作?
如何检测屏幕点击是否落在ARCore跟踪图像范围内?
嘿,针对你遇到的ARCore跟踪图像点击检测问题,我来给你梳理下可行的解决思路和具体实现方案!你的方向其实是对的——通过屏幕点击射线结合跟踪图像的平面信息来判断点击位置是否在图像范围内,ARCore本身没有直接提供这个内置功能,但实现起来并不复杂,下面一步步来拆解:
核心逻辑
我们需要把屏幕上的2D点击坐标,转换为3D世界空间中的射线,然后判断这条射线是否与正在跟踪的图像平面相交,并且交点是否落在图像的实际尺寸范围内。
具体实现步骤
1. 发射屏幕点击射线
利用AR场景中的主相机,将屏幕点击位置转换为世界空间射线,这一步你已经掌握了屏幕点击检测,只需要加上Camera.ScreenPointToRay()即可。
2. 筛选活跃的跟踪图像
通过ARTrackedImageManager获取所有处于TrackingState.Tracking状态的ARTrackedImage——只有正在被跟踪的图像才有有效的位置、朝向和尺寸信息,未跟踪的可以直接跳过。
3. 判断交点是否在图像范围内
每个跟踪图像都有自己的transform(中心位置+朝向)和size(现实世界中的宽高)。我们可以:
- 基于图像的朝向和位置构建一个平面
- 计算射线与这个平面的交点
- 将交点转换到图像的局部坐标系,判断是否在图像的宽高范围内(局部坐标系下,图像的范围是
[-size.x/2, size.x/2]和[-size.y/2, size.y/2])
完整代码示例(Unity + ARCore)
下面是可以直接复用的脚本框架,你可以整合到自己的项目中:
using UnityEngine; using UnityEngine.XR.ARFoundation; using UnityEngine.XR.ARSubsystems; public class TrackedImageClickHandler : MonoBehaviour { [SerializeField] private ARTrackedImageManager _trackedImageManager; [SerializeField] private Camera _arCamera; void Update() { // 检测屏幕触摸(这里用鼠标点击做示例,触摸可以替换为Input.touches) if (Input.GetMouseButtonDown(0)) { Ray clickRay = _arCamera.ScreenPointToRay(Input.mousePosition); // 遍历所有正在跟踪的图像 foreach (var trackedImage in _trackedImageManager.trackables) { if (trackedImage.trackingState != TrackingState.Tracking) continue; // 构建跟踪图像所在的平面 Plane imagePlane = new Plane(trackedImage.transform.forward, trackedImage.transform.position); // 计算射线与平面的交点 if (imagePlane.Raycast(clickRay, out float distance)) { Vector3 worldIntersectionPoint = clickRay.GetPoint(distance); // 转换到图像的局部坐标系 Vector3 localPoint = trackedImage.transform.InverseTransformPoint(worldIntersectionPoint); // 获取图像的半宽半高 float halfWidth = trackedImage.size.x / 2f; float halfHeight = trackedImage.size.y / 2f; // 判断是否在图像范围内 if (Mathf.Abs(localPoint.x) <= halfWidth && Mathf.Abs(localPoint.y) <= halfHeight) { Debug.Log($"成功点击跟踪图像:{trackedImage.referenceImage.name}"); // 这里添加你的自定义操作 TriggerImageAction(trackedImage); break; // 找到目标后跳出循环,避免重复触发 } } } } } /// <summary> /// 自定义的图像点击触发操作 /// </summary> private void TriggerImageAction(ARTrackedImage trackedImage) { // 示例:播放动画、生成3D物体、弹出UI等 Debug.Log($"触发{trackedImage.referenceImage.name}的专属操作!"); } }
注意事项
- 在Inspector面板中,记得给
_trackedImageManager赋值你的AR跟踪图像管理器,给_arCamera赋值场景中的AR主相机(带AR Camera组件的那个)。 ARTrackedImage.size返回的是图像在现实世界中的实际尺寸,所以这个判断是精准的,不会出现偏差。- 如果有多个图像同时被跟踪,代码会优先检测射线最先相交的图像,你可以根据需求调整遍历顺序或者处理多图像点击的情况。
补充说明
ARCore确实没有内置直接检测点击跟踪图像的API,但通过上面的射线投射+局部坐标判断的方式,完全可以稳定实现需求,而且性能开销极低,适合大多数AR场景。
内容的提问来源于stack exchange,提问作者Nimyron
相关产品推荐
相关产品推荐

