ARFoundation入门——AR射线检测(Android)

开发环境及一些说明

Unity:2021.1.14flc1
导入Package:
AR Foundation:4.1.7
ARCore XR Plugin:4.1.7
(在进行配置前需要先将Unity中的Android环境配置好)

对ARFoundation的使用学习可以参考unity官网的文档:
http://docs.unity3d.com/Packages/com.unity.xr.arfoundation@4.1/manual/index.html本文只个例演示射线检测,还有其他方法可以使用。也可以到ARCore的官网:https://developers.google.cn/ar对这部分SDK的功能和环境配置有个更好的了解。

两个网站的中文翻译我觉得都挺令人头疼的,看不懂的部分地方建议可以用英文文档理解一下。

AR射线检测管理器ARRaycastManager

使用此组件对可跟踪对象(即物理环境中检测到的特征对象)进行光线投射。
在安卓环境下ARRaycastManager主要用于单光线投射
在这里插入图片描述

ARRaycastManager.Raycast(Ray, List, TrackableType)

对可跟踪对象(即检测到的特征,如平面)投射光线。
如果光线投射命中trackableTypes中的可跟踪项,则为True。

public bool Raycast(Ray ray, List<ARRaycastHit> hitResults, TrackableType trackableTypes =
 TrackableType.PlaneWithinPolygon | TrackableType.PlaneWithinBounds |
  TrackableType.PlaneWithinInfinity | TrackableType.PlaneEstimated |
   TrackableType.Planes | TrackableType.FeaturePoint | TrackableType.Image |
    TrackableType.Face | TrackableType.All)

Enum TrackableType

表示XR中可跟踪类型的标志。“可跟踪”是指设备能够跟踪的物理环境中物件的类型,例如曲面。
可以将多个类型按位或组合在一起,例如,TrackableType.PlaneWithinPolygon | TrackableType.FeaturePoint
通常在射线检测中与XRRaycastHit结合使用。其取值可以参考下面的表格,摘自unity官方文档
TrackableType取值

脚本编写

public class RaycastHitTest_1 : MonoBehaviour
{
    public GameObject defaultPrefab;
    private ARRaycastManager raycastManager;
    private List<ARRaycastHit> hits = new List<ARRaycastHit>();
    // Start is called before the first frame update
    void Start()
    {
        raycastManager = GetComponent<ARRaycastManager>();
    }

    // Update is called once per frame
    void Update()
    {
        if(Input.touchCount == 0)
        {
            return;
        }
        //如果触屏次数为0,则不进行操作
        Vector2 touchPosition = Input.GetTouch(0).position;
        //射线检测命中trackableTypes中的可跟踪项,则为True
        if (raycastManager.Raycast(touchPosition, hits, TrackableType.PlaneWithinPolygon))
        {
            Pose hitPose = hits[0].pose;//获取该帧第一次命中的pose
            Vector3 gamePosition= new Vector3(hitPose.position.x, hitPose.position.y+0.1f, hitPose.position.z);
            GameObject box = Instantiate(defaultPrefab, gamePosition, defaultPrefab.transform.rotation);
        }
    }
}

注意在unity界面中的ARRaycastManager控件中将你所要生成的GameObject拖入到Default Prefab中,或者用代码来实现这部分的设置。

运行结果

点击平面内产生的效果
在这里插入图片描述
如果在实际使用这份代码的话会发现每次点击很容易生成一个以上的GameObject,这里是相关的解决办法:
Unity开发(Android):控制设备单次触碰单次响应

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值