一、可视化平面的另一种方式

  在上一节中, 我们已经实现了可视化检测到的平面,运行后效果良好,通过代码,我们更清楚的了解到了ARCore是如何让检测到的平面可视化的,这对于我们理解ARCore的工作方式会有很大的帮助。其实,ARCore已经简化了这个过程,我们下面来看看可视化平面的另一种实现方式。首先将上节中添加的代码从AppController中删除。然后在Hierarchy窗口右键,选择”Create Empty”,并将生成的空对象命名为”DetectedPlaceGenerater”,如下图所示:

  保持选中”DetectedPlaceGenerater”,Inspector窗口,点击 “Add Component”按钮,在搜索框中输入”Detected”,可以找到DetectedPlaneGenerator,将这个脚本附件到我们的平面上。如下图所示:

  将我们制作的平面Prefab拖到DetectedPlacePrefab框中,这样我们完成平面可视的工作。

  这比前面我们自己写代码来实现要简单很多。

二、放置位置

  现在,我们有了可供我们放置物体的平面了,我们将要在平面上放置我们物体,但在场景中什么位置放置我们物体呢?我们要知道检测到的平面是三维的,而我们的手机屏幕却是二维的,如何在二维的平面上操作旋转三维的虚拟物体?通常的做法就是作射线检测(Raycast),这与我们在VR中用鼠标拾取物体一样。
  射线检测(Raycast)的基本思路是在三维世界中从一个点沿一个方向发射出一条无限长的射线线,在射线的方向上,一旦与添加了碰撞器的模型发生碰撞,则产生一个碰撞检测到的对象,我们可以利用射线实现子弹击中目标的检测,也可以用射线来检测发生碰撞的位置,例如,我们可以从屏幕中用户点击的点,利用摄像机(AR中就是我们的眼睛)的位置来构建一条射线,与场景中的平面进行碰撞检测,如果发生碰撞则返回碰撞的位置,这样,我们就可以在检测到的平面上放置我们的虚拟对象了。
  ARCore在Frame中为我们准备了四种发射射线检测物体的方法。

Frame中公有静态方法 说明
Raycast(float x, float y, TrackableHitFlags filter, out TrackableHit hitResult) 对Arcore跟踪的物理对象执行光线投射,参考1,2为屏幕坐标点,一旦发生碰撞则返回,返回值为Bool型,true表示发生碰撞,false表示未发生碰撞。
Raycast(Vector3 origin, Vector3 direction, out TrackableHit hitResult, float maxDistance, TrackableHitFlags filter) 对Arcore跟踪的物理对象执行光线投射,参数1为射线起点,参数2为射线方向,一旦发生碰撞则返回,返回值为Bool型,true表示发生碰撞,false表示未发生碰撞。
RaycastAll(float x, float y, TrackableHitFlags filter, List< TrackableHit > hitResults) 对Arcore跟踪的物理对象执行光线投射,与所有对象进行检测,返回值为Bool型,true表示发生碰撞,false表示未发生碰撞。
RaycastAll(Vector3 origin, Vector3 direction, List< TrackableHit > hitResults, float maxDistance, TrackableHitFlags filter) 对Arcore跟踪的物理对象执行光线投射,与所有对象进行检测,返回值为Bool型,true表示发生碰撞,false表示未发生碰撞。

  TrackableHitFlags用来过滤需要进行碰撞检测的对象类型,其值可以是以下属性值的一个,也可以是几个。

TrackableHitFlags 属性 说明
Default 这个值用于与放置的所有物体发生碰撞检测。如果我们填写这个值,那么在ARCore中,我们发射的射线将与场景中的所有平面、包围多边形、带法线的特征点进行碰撞检测。
FeaturePoint 与当前帧点云中所有的特征点进行碰撞检测。
FeaturePointWithSurfaceNormal 与当前帧点云中的带有表面法线估计(方向)的特征点进行碰撞检测。
None 此值用来表示trackableHit返回中没有碰撞发生,如果将此值传递给raycast,则不会得到任何碰撞结果。
PlaneWithinBounds 与当前帧中已检测平面内的包围盒进行碰撞检测。
PlaneWithinInfinity 与已检测到的平面进行碰撞检测,但这个检测不仅仅局限于包围盒或者多边形,而是可以与已检测到的平面的延展平面进行碰撞检测。
PlaneWithinPolygon 与已检测平面内的凸边界多边形进行碰撞检测。

  TrackableHit类保存的是发生碰撞检测时的检测到相关信息。

TrackableHit 属性 说明
Distance float类型,获取从射线源到命中点的距离。
Flags TrackableHitFlags类型,获取一个位掩码,设置trackablehitmark标志对应于命中所属对象的类别。
Pose Pose类型,获取光线投射击中的物体在Unity世界坐标中的姿态。
Trackable Trackable类型,获取命中的可跟踪对象

三、放置物体

  有了上面的基础, 我们很容易理解下面的代码。

        TrackableHit hit;TrackableHitFlags raycastFilter = TrackableHitFlags.PlaneWithinPolygon | TrackableHitFlags.PlaneWithinBounds;if (Frame.Raycast(touch.position.x, touch.position.y, raycastFilter, out hit)){if ((hit.Trackable is DetectedPlane) && Vector3.Dot(FirstPersonCamera.transform.position - hit.Pose.position, hit.Pose.rotation * Vector3.up) < 0){Debug.Log("射线击中了DetectedPlane的背面!");}else{var FoxObject = Instantiate(prefab, hit.Pose.position, hit.Pose.rotation);FoxObject.transform.Rotate(0, mModelRotation, 0, Space.Self);var anchor = hit.Trackable.CreateAnchor(hit.Pose);FoxObject.transform.parent = anchor.transform;}}

  首先,我们定义我们过虑器,我们只想检测在多边形内与边界内的平面。然后我们以用户点击点构建射线做碰撞检测。如果发生了碰撞,我们则对碰撞情况进行分析,如果是击中了检测到的平面并且又不是平面的背面,我们则实例化我们的Prefab,同时我们生成一个anchor,并将我们的Prefab挂载到这个anchor上,以便ARCore跟踪这个物体的位置。在代码中Vector3.Dot(FirstPersonCamera.transform.position - hit.Pose.position, hit.Pose.rotation * Vector3.up) < 0),这句代码的意思是对从摄像机发射到碰撞点的向量与碰撞点的法向量做点积,小于0,说明角度大于90度,因此击中的是检测平面的背面。
  为了放置我们的虚拟物体,我们下面我们需要对AppController进行一下设置


  完整的代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using GoogleARCore;
using GoogleARCore.Examples.Common;public class AppController : MonoBehaviour {public Camera FirstPersonCamera;public GameObject prefab;private bool mIsQuitting = false;private const float mModelRotation = 180.0f;// Use this for initializationvoid Start () {OnCheckDevice();}// Update is called once per framevoid Update () {UpdateApplicationLifecycle();Touch touch;if (Input.touchCount < 1 || (touch = Input.GetTouch(0)).phase != TouchPhase.Began){return;}TrackableHit hit;TrackableHitFlags raycastFilter = TrackableHitFlags.PlaneWithinPolygon | TrackableHitFlags.PlaneWithinBounds;if (Frame.Raycast(touch.position.x, touch.position.y, raycastFilter, out hit)){if ((hit.Trackable is DetectedPlane) && Vector3.Dot(FirstPersonCamera.transform.position - hit.Pose.position, hit.Pose.rotation * Vector3.up) < 0){Debug.Log("射线击中了DetectedPlane的背面!");}else{var FoxObject = Instantiate(prefab, hit.Pose.position, hit.Pose.rotation);FoxObject.transform.Rotate(0, mModelRotation, 0, Space.Self);var anchor = hit.Trackable.CreateAnchor(hit.Pose);FoxObject.transform.parent = anchor.transform;}}}

  运行后的效果如下图:

ARCore之路-放置物体相关推荐

  1. ARCore之路:HelloAR项目例子分析

    项目效果 通过相机扫描环境中的平面,它会生成上图中的白色网格.可通过点击白色网格来生成三维模型. 下图是项目中的节点,下面将从挑选一些节点来分析,其中 Environmental Light 节点是灯 ...

  2. arcore之路-unity开发从入门到实践_AR开发之路——准备工作

    由于现在支持AR功能的手机没有普及,讲AR开发的教程也少,所以要学习AR开发还是要花点成本的,当然也有好处,花了学费,才会逼着自己坚持学下去. 为了学习AR,Relax今天入手了一部华为Nova 3i ...

  3. 搭建关卡修、向管卡放置物体、改天空颜色

    一.创建关卡 1.关卡 2.新建关卡 file-->new level ①Empty Level:空的关卡 是一个完全空的什么都没有的场景 ②Default:有天空.有太阳.有地面 ③VR-Ba ...

  4. ARCore⭐二、从零到放置物体

    目录

  5. ARCore之路-技术原理(二)

      前文说过,ARCore 使用三个主要功能将虚拟内容与通过手机摄像头看到的现实世界整合:运动跟踪. 环境理解.光估计.那么我们就来详细说一下这三个方面的原理,然后一并学习一下ARCore带来的新概念 ...

  6. ARCore之路:ARCore 中的 Session Config 配置中的参数介绍

    下图是 Session Config 中的参数: 1.Match Camera Framerate 切换 ARCore 是否会在 Unity 的帧更新中引入延迟以匹配相机传感器传输帧的速率 2.Pla ...

  7. ARCore之路-前言

    一.AR (一).什么是AR   增强现实技术(Augmented Reality,简称 AR),是一种实时地计算摄影机影像的位置及角度并加上相应图像.视频.3D模型的技术,这种技术的目标是在屏幕上把 ...

  8. ARCore之路-技术原理(一)

    一.位置追踪   谈到位置追踪,不得不说SLAM(simultaneous localization and mapping)即时定位与地图映射, SLAM最早由科学家Smith.Self.Chees ...

  9. ARCore之路:AugmentedFaceExample例子分析

    项目效果 将一个三维物体附着到脸部,随着脸部的移动,三维物体也会跟踪脸部来进行移动. 下图是该项目的 GameObject 节点,下面将从各个节点分析该项目. 1.ARCore Device 该节点的 ...

最新文章

  1. module 'tensorflow' has no attribute 'Session'
  2. Day4-springmvc中文乱码处理和客户端跳转
  3. RabbitMQ 死信/死信队列
  4. 《天天数学》连载18:一月十八日
  5. websocket 发送图片_Netty(四)实现WebSocket
  6. 消息最终一致性解决方案之RabbitMQ实现
  7. 计算机之间是如何进行通信的?;详解三次握手和四次挥手
  8. 【python】导入自定义模块
  9. haproxy实现mysql从库负载均衡
  10. 【韩顺平 零基础30天学会Java】(第三阶段)(自用)
  11. 遇到NOD32更新时提示“用户名和密码无效”解决办法
  12. 测试工程师六大能力模型
  13. c#进阶一:使用ILDASM来查看c#中间语言
  14. java转换docx为doc文件_JAVA - 将doc文档转为docx文档
  15. 人脸识别接口_智慧小区人脸识别门禁系统室外人脸识别门禁终端厂家
  16. Python人脸识别 Python3.7+OpenCV+Dlib+罗技C920摄像头 实现离线实时摄像头画面人脸检测+识别
  17. windows防火墙规则_如何在Windows防火墙中创建高级防火墙规则
  18. 爱快路由器 默认ssh 管理用户名 sshd
  19. windows 磁盘管理:简单卷、跨区卷、带区卷、镜像卷 和 RAID-5
  20. 24 款效率办公神器,简直不要太强大!

热门文章

  1. 中国计算机科学家数量百人,百位科学家获“中国青年科技奖”,高校人数占比超七成...
  2. python求excel平均值_python帮助计算excel文件上的平均值和std
  3. FDC2214学习笔记——如何从数字量确定电容值,胎教级别计算电容教程
  4. 自定义配置数据源 DataSource
  5. python中图例legend标签内容_matplotlib设置legend图例代码示例
  6. thx是什么意思_THX是什么意思
  7. 初中数学抽象教学的案例_初中数学教学案例
  8. 2023 年度 A 类学科竞赛项目清单
  9. 站在邙山之颠仰望天的那份湛蓝
  10. 7.1.5、Sqoop__sqoop常用命令参数,import,export,hive,数据库连接,hbase等