ARKit之ARFoundation入门

什么是ARFoundation

ARFoundation是Unity于2018年推出的跨平台AR开发工具,致力于建成一个统一、开放的AR平台,ARFoundation并不直接提供AR底层技术,而是通过对底层API的进一步封装,ARFoundation提供独立于平台的API,降低开发者对安卓平台ARCore、iOS平台ARKit等技术的开发时间成本。

因此,使用ARFoundation进行开发的好处在于可以通过ARFoundation同时使用ARCore和ARKit的核心功能,只需开发一次应用,就可以部署到安卓、iOS等不同系统的设备上,让开发变得更加便捷。

ARFoundation 与 ARKit 和 ARCore 的关系

正在上传…重新上传取消

ARFoundation与ARKit和ARCore的关系

ARFoundation 生态

正在上传…重新上传取消

ARFoundation生态

ARFoundation 架构与术语

支持功能ARFoundationARCoreARKit
垂直平面检测

水平平面检测

特征点检测

✔ + 支持特征点姿态

光照估计

✔ + Color Correction

✔ + Color Temperature

射线测试(Hit Testing,对特征点与平面的射线碰撞测试)

图像跟踪

3D物体检测与跟踪

-

环境光探头(Environment Probes)

-

世界地图

-

人脸跟踪(识别、姿态、网格和形状混合)

✔(iphoneX 及更高型号)

云锚点(Cloud Anchors)

-

远程调试(Editor Remoting)

开发中

✔-Instant Preview

✔-ARKit Remote

模拟器(Editor Simulation)

-

-

LWRP支持(支持使用ShaderGraph)

开发中

开发中

摄像机图像API

-

人体动作捕捉(Motion capture)

-

✔(iphoneX 及更高型号)

人形遮挡(People Cclusion)

-

✔(iphoneX 及更高型号)

多人脸检测

-

✔(iphoneX 及更高型号)

多人协作(Collaborative session)

-

✔(iphoneX 及更高型号)

多图像识别

✔(iphoneX 及更高型号)


功能描述
世界跟踪(World tracking)在物理空间中跟踪用户设备的位置和方向(姿态)
平面检测(Plane detection)对水平与垂直平面进行检测
参考点(Reference points)对特定点的姿态跟踪,ARCore中称为Anchor
光照估计(Light estimation)对物理环境中的光照强弱及方向进行估计
人脸跟踪(Face tracking)检测并跟踪人脸
图像跟踪(Image tracking)跟踪物理空间中的2D图像
人脸跟踪(Face tracking)检测并跟踪人脸
物体跟踪(Object tracking)跟踪物理空间中的物体对象,目前只支持ARKit
Seesion分享支持多人共享场景,在ARKit中称为多人协作(Collaborative session),在ARCore中称为Cloud Anchor
人体动作捕捉(Motion capture)简称动捕,检测物理空间中的人体及动作,用- -个由17根骨骼组成的层次关节来表达人体动作
人形遮挡(People occlusion)利用计算机视觉判断人体在场景中的位置,获取人体形状及在场景中的位置实现虚拟物体遮挡
摄像机图像API提供摄像机图像底层支持,方便开发人员开发计算机视觉应用

ARFoundation 只是提供了跨平台开发的方案, 但实际开发中仍需要ARCore 和 ARKit的支持,例如即便 ARFoundation 提供了人体动作捕捉(Motion capture),但因为只有ARKit提供了这一技术,所以只能在iOS设备上使用。

ARFoundation ARKit注意事项

1、由于 ARFoundation 是再次封装,主要侧重于便捷性和开发效率,程序运行效率和兼容性与原生SDK相比会有所差距;
2、ARFoundation 并不提供底层开发API,平台相关的API均由第三方如ARKit、ARCore提供,因此ARFoundation无法在第一时间使用ARKit SDK的最新功能,因为对新版本的集成需要时间。

ARFoundation 开发环境搭建

1、建议安装Unity2019.1以上版本(为了能够使用 ARKit3 及以上版本功能)
2、XCode10以上版本

新建Unity项目,选择 Window -> Package Manaager
正在上传…重新上传取消

Package Manaager

选择ARFoundation,并点击 install
正在上传…重新上传取消

ARFoundation安装

选择ARKit XR Plugin,并点击install
正在上传…重新上传取消

ARKit XR Plugin安装

如果需要用到人脸追踪,选择ARKit Face Tracking, 并点击install
正在上传…重新上传取消

ARKit Face Tracking安装

如果需要用到ARCore相关功能,选择ARCore XR Plugin, 并点击install
正在上传…重新上传取消

ARCore XR Plugin安装

Hello ARFoundation

删除原有 Main Camera,并新增AR会话,并添加AR Plan Manager脚本
正在上传…重新上传取消

新增AR会话并添加脚本

新增AR Default Plane,并制成预制件,放入创建好的Prefabs文件夹中,然后删除场景里的AR Default Plane,将制作好的预制件拖拽到 AR Plan Manager 脚本中。
正在上传…重新上传取消

制作预制件


正在上传…重新上传取消

将预制件添加到脚本

在AR Session Origin组件中添加 AR Raycast Manager脚本
正在上传…重新上传取消

image.png

在新创建的Scripts文件夹中,新建C#脚本命名为DetectionController.cs,并写入以下代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;

// 强制必须加载此类
[RequireComponent(typeof(ARRaycastManager))]
public class Controller : MonoBehaviour
{
    // 需要加载的模型
    public GameObject model;
    // 射线检测管理器
    public ARRaycastManager aRRaycastManager;
    // 当前场景中是否已经加载模型
    public GameObject currentModel;


    void Start()
    {

    }

    void Update()
    {
        // 判断当前屏幕上是否有点击
        if (Input.touchCount > 0)
        {
            // 获取当前屏幕点击
            var touch = Input.GetTouch(0);

            List<ARRaycastHit> hits = new List<ARRaycastHit>();

            // 通过aRRaycastManager进行射线检测
            if (aRRaycastManager.Raycast(touch.position, hits, TrackableType.All))
            {
                // 获取射线检测的结果
                var hitPose = hits[0].pose;
                // 判断当前场景是否有模型
                if (currentModel == null)
                {
                    // 在点击位置加载模型
                    currentModel = Instantiate(model, hitPose.position, hitPose.rotation);

                    // 第二种写法
                    //currentModel = Instantiate(model);
                    //currentModel.transform.position = hitPose.position;
                    //currentModel.transform.rotation = hitPose.rotation;
                }
                else
                {
                    // 改变当前模型的位置
                    currentModel.transform.position = hitPose.position;
                    currentModel.transform.rotation = hitPose.rotation;
                }
            }
        }
    }
}

  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值