精华内容
下载资源
问答
  • ARCore之路-Untiy开发从入门到实践》前4章试读,最终版本可能略有差异。
  • ARCore之路-三角化可视平面

    千次阅读 热门讨论 2018-09-04 23:25:16
      前面章节中,我们已经将虚拟物体放置到ARCore检测到的平面上了,一切显得都是那么的神奇和谐,但ARCore之路可能比看起来要更加复杂一些。   在前面的章节中,我们制作的VisualDetectedPlane时,这个Prefab是...

      前面章节中,我们已经将虚拟物体放置到ARCore检测到的平面上了,一切显得都是那么的神奇和谐,但ARCore之路可能比看起来要更加复杂一些。
      在前面的章节中,我们制作的VisualDetectedPlane时,这个Prefab是有Mesh Collider的,理论上,这个平面是可以与其他碰撞体发生碰撞的。下面我们将Fox这个Prefab下挂载一个Rigidbody和Mesh Collider,然后我们设置一下Rigidbody下的Mass为1,钩上Use Gravity,即设置其质量为1,使用重力。如下图所示,编译运行一下。

    在这里插入图片描述

      按照我们设置与想法,实例化后的狐狸应该会与检测到的平面进行碰撞,然后可以稳稳的站在平面上,但事实是,这个狐狸会掉下去,也就是说我们想要的碰撞并没有发生。通过其他设置(不同的碰撞器、质量等),测试发现皆不能满足需求,希望ARCore以后会内建这个支持,但目前我们只能自己来处理。

    一、思路

      在AR场景中,如果虚拟物体不能与检测到的平面进行碰撞将会严重影响到用户体验,既然ARCore目前不能给我们提供一个便捷的方式来解决这个问题,我们就自己动手来解决它。解决的思路如下:
      1、获取到ARCore检测到的所的平面。
      2、对每一个平面进行处理,获取到该平面的最边沿的点。
      3、对获取到的点这个平面进行网格化,也就是三角化。
      4、对网格附加材质与Mesh Collider。

    二、三角化

      在计算机中我们用网格(Mesh)来描述表面,所有的网格又全部都由三角形组成,网格由图形硬件(GPU Graphics Processing Unit图形处理单元)进行处理来达到渲染显示的目的,目前,所有的GPU都能只能处理点、直线、三角形,也就是任何表面要想能被GPU处理则必须要将其使用先转化为点、直线、三角形组成的网格才行。使用三角形来构建网格,是因为三角形是平坦的并且拥有直边,所以他们可以完美地被用来显示平坦的和连续的表面,而且数据结构上简单便于处理,三角形可以构建任何表面,曲面或者是圆面也可以由大量小的三角形来近似组成。如果三角面数足够多,曲面或圆面可以非常平滑。
    这里写图片描述
      将一个不规则平面进行三角化是一个比较麻烦的过程,也超出了本文的范畴,我们只需要简单的作一介绍。对于给定点集,我们需要对点集进行处理,去掉空间位置太近的点、需要考虑点连成三角形的顺序(顺时针)、还要考虑中间空间的划分等等。三角化这个过程就是对给定点集进行处理以得到一个由三角形组成的网格以便进行下一步的处理。

    三、实现方法

    1、获取到ARCore检测到的所的平面。

      这一步比较简单,我们只需要从Session中取出所有检测到的平面即可。
    Session.GetTrackables(m_newPlanes, TrackableQueryFilter.New);

    2、对每一个平面进行处理,获取到该平面的最边沿的点。

      对第一个检测到的平面,我们都生成一个空对象(这个物体就是我们将要三角化并附加材质与碰撞体的对象):

           foreach (var plane in m_newPlanes)
    		{
    			var surfaceObj = new GameObject("ARSurface");
    			var arSurface = surfaceObj.AddComponent<ARSurface>();
    			arSurface.SetTrackedPlane(plane, m_surfaceMaterial);
    		}
    

      ARCore DetectedPlane提供了一个GetBoundaryPolygon(List< Vector3 > boundaryPolygonPoints)方法,利用这个方法可以获取在Unity世界空间中表示平面的边界多边形的点列表(顺时针顺序)。

    3、对获取到的点这个平面进行网格化,也就是三角化。

      对点进行三角化我们直接写成一个类供调用,这里不详述。

    4、对网格附加材质与Mesh Collider。

      为了让我们的网格可视化,我们还需要对其赋材质,最主要的是要添加上Mesh Collider碰撞体,这样才能托住我们的物体让其不往下掉。
    详细代码下如:

    using GoogleARCore;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class ARSurface : MonoBehaviour
    {
    	TrackedPlane m_trackedPlane;
    	MeshCollider m_meshCollider;
    	MeshFilter m_meshFilter;
    	MeshRenderer m_meshRenderer;
    	List<Vector3> m_points = new List<Vector3>();
    	List<Vector3> m_previousFramePoints = new List<Vector3>();
    	Mesh m_mesh;
    
    	void Awake()
    	{
    		m_meshCollider = gameObject.AddComponent<MeshCollider>();
    		m_meshFilter = gameObject.AddComponent<MeshFilter>();
    		m_meshRenderer = gameObject.AddComponent<MeshRenderer>();
    
    		m_mesh = new Mesh();
    		m_meshFilter.mesh = m_mesh;
    		m_meshCollider.sharedMesh = m_mesh;
    		Vector3 oneCentimeterUp = Vector3.up * 0.01f;
    		transform.Translate(oneCentimeterUp, Space.Self);
    	}
    
    	public void SetTrackedPlane(TrackedPlane plane, Material material)
    	{
    		m_trackedPlane = plane;
    		m_meshRenderer.material = material;
    		Update();
    	}
    
    	void Update()
    	{
    		if (m_trackedPlane == null)
    		{
    			return;
    		}
    		else if (m_trackedPlane.SubsumedBy != null)
    		{
    			Destroy(gameObject);
    			return;
    		}
    		else if (Session.Status != SessionStatus.Tracking)
    		{
    			m_meshRenderer.enabled = false;
    			m_meshCollider.enabled = false;
    			return;
    		}
    
    		m_meshRenderer.enabled = true;
    		m_meshCollider.enabled = true;
    
    		UpdateMeshIfNeeded();
    	}
    
    	void UpdateMeshIfNeeded()
    	{
    		m_trackedPlane.GetBoundaryPolygon(m_points);
    
    		if (AreVertexListsEqual(m_previousFramePoints, m_points))
    		{
    			return;
    		}
    
    		int[] indices = TriangulatorXZ.Triangulate(m_points); //三角化
    
    		m_mesh.Clear();
    		m_mesh.SetVertices(m_points);
    		m_mesh.SetIndices(indices, MeshTopology.Triangles, 0);
    		m_mesh.RecalculateBounds();
    
    		m_meshCollider.sharedMesh = null;
    		m_meshCollider.sharedMesh = m_mesh;
    	}
    
    	bool AreVertexListsEqual(List<Vector3> firstList, List<Vector3> secondList)
    	{
    		if (firstList.Count != secondList.Count)
    		{
    			return false;
    		}
    
    		for (int i = 0; i < firstList.Count; i++)
    		{
    			if (firstList[i] != secondList[i])
    			{
    				return false;
    			}
    		}
    
    		return true;
    	}
    }
    

    --------------------------2019年5月8日更新-------------------------------------------------------------------

      这个解决方案并不完美,后来实现了一种更优美的方案,性能更好,效果也更佳,本篇文件仅供学习原理参考。新文章《ARCore之路-解决碰撞问题的另一种方法》https://blog.csdn.net/yolon3000/article/details/89949436

    展开全文
  • ARCore之路-Untiy开发从入门到实践》目录,书籍预计于2019年6月出版。
  •   在我们之前的工程里,我们首先是把ARCore的两个Prefabs:ARCore Device 和 Environmental Light 拖到了我们的 Hierarchy窗口中,那么这两个ARCore的Prefabs都是做什么的呢?下面我们来详细了解一下这两个ARCore...

      在我们之前的工程里,我们首先是把ARCore的两个Prefabs:ARCore Device 和 Environmental Light 拖到了我们的 Hierarchy窗口中,那么这两个ARCore的Prefabs都是做什么的呢?下面我们来详细了解一下这两个ARCore的Prefabs的作用。

    这里写图片描述

    一、ARCore Device

      大致的来说,ARCore Device就是用来处理与设备相关的事宜,具体来说就是管理ARCore session。Session 我们前面说过,是用来管理整个AR应用生命周期的,因此,在场景中引入这个Prefab就是引入了ARCore AR应用的生命周期管理功能了。
      在场景加载激活后,此Prefab将创建并初始化一个Arcore session,并从一个跟随设备位置和方向的Unity摄像机渲染出背景图像。因为AR应用必须要有用户手机相机的使用调取权限,如果应用程序在初始化时没有访问相机的权限,则将弹出提示向用户请求相机调取权限。ARCore Device这个Prefab管理了Arcore session,而一个ARCore应用只允许有且只有一个 session,所以ARCore Device在一个场景中只能允许有且只有一个存在,默认情况下,销毁ARCore Device也会破坏 session,如果要在不同的场景中重用相同的 session,保持跟踪状态,则需要游戏对象上调用DontDestroyOnLoad()方法。不然,之前 session中的所有信息都将会丢失,也就是说相当于是重启了应用,重置了 session。

    这里写图片描述

      从上图右侧的Inspector中,可以看到ARCore Device包含了一个ARCore Session的脚本。这个脚本需要一个Session Config的ARCoreSessionConfig对象,这是个Session 配置Scriptable对象,这个对象里设置了ARCore的基本配置,其主要属性如下表所示:
    这里写图片描述

    ARCoreSessionConfig主要属性(默认值) 说明
    MatchCameraFramerate = true bool类型,用于设置Arcore是否可以在Unity的帧更新中引入延迟,以与摄像机传感器传送帧的速率相匹配(在大多数设备上,这是每秒30帧)。
    PlaneFindingMode = DetectedPlaneFindingMode.HorizontalAndVertical DetectedPlaneFindingMode类型,设置检测的平面类型,可以是单个值,也可以是一个组合值。
    EnableLightEstimation = true bool类型, 是否开启光估计,用于光估计渲染。
    EnableCloudAnchor = false bool类型,是否开启云锚点,以便在不同设备间共享锚点数据。
    CameraFocusMode = CameraFocusMode.Fixed CameraFocusMode类型,选择ARCore相机的对焦模式,默认是固定模式,也可以选择自动模式。
    AugmentedImageDatabase AugmentedImageDatabase类型,是一个用来对检测图像做对比的图像库。

      在上表中,需要特别说明的是MatchCameraFramerate这个配置。启用这个设置可以减少因在同一帧中多次渲染相同的背景纹理而导致的功耗。启用这个设置还会设置QualitySetting.vSyncCount=0,这样,整个Unity应用(包括动画、UI)都将以相机帧速率来进行刷新,这将降低性能消耗,但需要注意的是,启用此设置并不能保证每个Unity帧都有一个新的和唯一的摄像机背景纹理,因为ARCore将会等待一个新的相机帧(当前是 66毫秒) t成为可用才会进行更新以避免死锁。其他的属性等我们用到的时候再进行详细了解。

    这里写图片描述

      在ARCore Device下有一个First Person Camera(第一人称摄像机,这个摄像机其实就是模拟的我们的眼睛),这个摄像机下挂载了Tracked Pose Driver 和 ARCore Backgroud Renderer这两个脚本。从名字可以看出,第一个脚本是用来跟踪用户设备状态的,第二个脚本则主要是负责将从相机获取的图像渲染成场景背景。Tracked Pose Driver脚本将跟踪设备的当前位姿值,Tracked Pose Driver 可以跟踪多种类型的设备,包括通用XR设备、通用控制器和通用遥控器,姿态来源可以是RGB相机、HD设备的左右相机等,还可以设置跟踪类型, 是只跟踪位置还是只跟踪旋转或者两者兼之,然后也可以设置更新模式等等。

    二、Environmental Light

    这里写图片描述

      相比ARCore Device,Environmental Light Prefab只做一件事,那就是通过相机抓取的图形进行分析,设置_GlobalColorCorrection和_GlobalLightEstimation这两个Shader变量以便在Shader中调整虚拟物体的颜色(Shader是GPU上执行的渲染脚本,后面我们会用到)。这两个变量都可以在Shader中使用,_GlobalColorCorrection是在伽马空间中使用归一化像素强度时进行的颜色校正,颜色校正使用了一个RGB缩放因子来控制校正量,这个缩放因子也是通过ARCore对光照进行估计得出来的;_GlobalLightEstimation也是一个全局变量,ARCore会根据当前相机图像来分析并设置这个值,通过这变量来调整虚拟物体的光照。_GlobalColorCorrection与_GlobalLightEstimation的区别是,_GlobalColorCorrection使用了一个RGB缩放因子而_GlobalLightEstimation没有,_GlobalLightEstimation主要是为了与之前代码兼容。

    参考文献

    1、ARCore Reference ARCore Reference

    展开全文
  •    在《ARCore之路-三角化可视平面》文件完成后,很多读者找我要三角化的源码。其实,这个解决方案并不完美,后来再高手的指导下实现了另一种解决碰撞问题的方法,相比之下性能更好,效果也更好。这部分内容已写...

       在《ARCore之路-三角化可视平面》文章完成后,很多读者找我要三角化的源码。其实,这个解决方案并不完美,后来在高手的指导下实现了另一种解决碰撞问题的方法,相比之下性能更好,效果也更好。这部分内容已写到新书《ARCore之路-Untiy开发从入门到实践》中,为了避免大家走弯路,现将书中这部分内容提前发出来供大家参考。
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • ARCore之路-放置物体

    千次阅读 热门讨论 2018-08-26 22:54:56
      在上一节中, 我们已经实现了可视化检测到的平面,运行后效果良好,通过代码,我们更清楚的了解到了ARCore是如何让检测到的平面可视化的,这对于我们理解ARCore的工作方式会有很大的帮助。其实,ARCore已经简化...

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

      在上一节中, 我们已经实现了可视化检测到的平面,运行后效果良好,通过代码,我们更清楚的了解到了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 initialization
        void Start () {
            OnCheckDevice();
        }
    
        // Update is called once per frame
        void 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之路-运动跟踪之深入理解

    千次阅读 2018-09-08 16:27:07
      在前面的章节中,我们已经可以让我们的虚拟物体放置在合适的位置了,代码也可以很好的工作,并且也对部分ARCore技术进行了比较深入的探讨,实事上到此我们反倒更愿意再深入一步,了解ARCore实现的技术细节以便...
  • ARCore之路-APP Controller

    千次阅读 2018-08-21 21:28:12
      现在,我们已经创建了场景并添加了必要的支持组件,但现在场景中什么也没有,本节中,我们将要编写我们的控制器,利用ARCore提供给我们的功能来检测平面,当然,这是一个循序渐进的过程,我们首先要确保设备支持...
  • ARCore之路-搭建场景

    千次阅读 2018-08-20 21:48:51
      在前面,我们已经运行了ARCore提供的示例,虽然示例演示成功了,但我们其实对ARCore一无所知,不知其然也不知其所以然,所以,从本节开始,是时候为Android设备构建增强现实应用程序的框架了,我们将一步一步的...
  • ARCore之路-环境理解之点云

    千次阅读 2018-09-16 17:52:44
      AR是对现实环境的增强,运动跟踪解决了用户在...但AR应用必须要能理解其本身所处的环境,这样才能为用户带来沉浸感和真实感,这就是ARCore环境理解功能该做的事,ARCore环境理解通过VIO (visual-inertial odome...
  •   不过也非常荣幸的告诉大家,笔者已与人民邮电出版社签定了出版合同,预计ARCore书籍《ARCore之路-Untiy开发从入门到实践》2019年3月底会完成创作,2019年6月份出版。   这也是按照合同约定,书稿除了人民邮电...
  • ARCore之路-平面检测

    千次阅读 热门讨论 2018-08-24 22:44:17
      有了平面,也有了材质纹理了,但我们还需要一个渲染器来将检测到或者扩展出来的平面渲染出来,如果我们自己去写这个渲染器将不会是一件愉快的工作,好在ARCore已经为我们写好了,我们只需要将这个写好的类附加到...
  • ARCore之路-环境准备

    千次阅读 2018-08-12 22:38:14
      介绍前面的背景知识之后,从今天开始,我们将正式开始从无到有开发我们的AR应用,但是在开始我们的创作之前,我们需要把开发环境搭建好,是基础中的基础。我们将采用Unity平台、利用ARCore SDK来开发我们的AR...
  • ARCore之路-前言

    千次阅读 2018-08-07 21:36:25
    一、AR (一)、什么是AR   增强现实技术(Augmented Reality,简称 AR),是一种... Frank Baum第一个提出将电子数据叠加在实现上产生虚拟与实现混合的思想,当时他把这种技术称为“字符标识”,这是有...
  • ARCore之路-环境配置

    千次阅读 2018-08-13 22:14:48
      现在我们将创建一个新的项目,并设置我们需要的Arcore开发参数来启动和运行我们的项目。在开始菜单或者桌面的Unity图标启动Unity,点击New新建一个项目,我们命名为Fox,然后单击“创建项目”按钮。   待Un...
  • ARCore之路-运动跟踪之3D声场(一)

    千次阅读 2018-09-08 21:42:22
    但AR 3D声音的处理有其特别处,类似于电影采用的技术并不能很好的解决3D声音的问题。   在电影院中,观众的位置是固定的,因此我们可以在影院的四周都加装上音响设备,通过设计不同位置音响设备上声音的大小和...
  • ARCore之路-技术原理(二)

    千次阅读 2018-08-09 22:20:11
      前文说过,ARCore 使用三个主要功能将虚拟内容与通过手机摄像头看到的现实世界整合:运动跟踪、 环境理解、光估计。那么我们就来详细说一下这三个方面的原理,然后一并学习一下ARCore带来的新概念。 一、运动...
  • 在Project窗口,“GoogleARCore”->“Prefabs”,选择“ARCore Device”和“Environment Light”prefabs,并将其添加到Hierarchy窗口中。 ARCore Device处理所有与设备相关的事宜,更新device的位置,更新...
  •   在上章中我们对3D声场进行了简单介绍,本节将对3D声场概念及共振音频(Resonance Audio)的技术实现进行更深入的学习以便更好的利用。为何我们能够根据听到的声音就能确定声源的位置呢?上节我们对这个问题...
  •   共振音频(Resonance Audio)技术其实是一整套关于AR/VR 中3D声源定位、混音、处理、多音轨合成的高性能音频处理技术,其更详细的技术细节超出了本章的范围,不再详述。前面我们说unity2018版集成了共振音频...
  •   上节我们已经利用共振音频(Resonance Audio)SDK实现了3D音效,这只是使用了共振音频(Resonance Audio)最简单的特性,共振音频(Resonance Audio)提供了远比示例中高级的功能技术特性,特别是模拟房间的参数...
  • ARCore之路-连接设备调试应用

    千次阅读 2018-08-15 22:34:12
      首先我们需要使用的工具是adb,这是个应用工具,它在Android SDK下的platform-tools目录内,adb基于tcp协议上,使用WIFI来调试应用需要操作系统的root权限,我们可以在手机上下载安装Android Terminal ...
  • ARCore之路-技术原理(一)

    千次阅读 2018-08-08 22:43:47
    IMU 的精确航迹推算,从 IMU 提供的加速度和时间测量中,可以向后合并以计算速度并且再次向后合并以获取画面之间的实际距离,但是困难的是从 IMU 中除去误差以获得精确的加速度测量,在设备移动的几秒钟内,一个...
  • 三、ARCore计算机视觉示例 打开ARCore SDK自带的Computer vision示例。  在Hierarchy窗口中选中ComputerVisionController,在Inspector窗口中双击编辑ComputerVisionController.cs脚本。先不管其他辅助操作的功能...
  • ARCore

    2020-01-05 18:49:52
    ARCore官网地址:SDK地址: 官网地址: https://developers.google.cn/ar/ https://developers.google.com/ar/ SDK地址: https://github.com/google-ar/arcore-unity-sdk/releases 当前版本:1.14.0 主要功能 运动...
  • 以下内容为笔者阅读ARCore Sample的笔记,仅供个人学习、记录、参考使用,如有纰漏,还请留言指正。 tags: ARCore 入口:HelloArActivity HelloArActivity是示例应用的入口。这个入口简单演示了ARCore的使用方法。...
  • ARCore丨从零到放置物体

    千次阅读 2019-03-26 23:53:34
    本文记录ARCore从零到放置物体的关键步骤,详细解析请参考博客:ARCore之路 1、导入ARCore SDK 2、删掉场景中Main Camera 和 Directional Light 3、将”GoogleARCore-Prefabs下的ARCore Device和 Environmental ...
  • ARcore

    2018-06-15 14:17:29
    所以进行剪裁,是因为随着观察位置、角度不同,并不能总看到特定3D物体某个图元的全部。剪裁时,若图元完全位置视景体以及自定义裁剪平面的内部,则将图元传递到后面步骤进行处理;如果其完全位于视景体或者自定义...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,802
精华内容 720
关键字:

ARCore之路