UnityAR-平面检测

一、新建平面
在Unity中,有一类叫Prefabs的预制件,所谓的预制件其实就是一个模块,这个模块包含了GameObjects及其相关联的组件、属性、动作、模型、纹理等等,这是一个功能块,这种设计使得模块可以非常方便的被复用。在我们引入ARCore的相关Prefab前,我们把场景中的”Main Camera” 和”Directional Light”删掉,因为ARCore中已经有这两个GameObject了,Hierarchy窗口,选中”Main Camera”, “Directional Light”,右键选择”Delete” 删除掉(或者在选择后直接按Delete键删除)。
在这里插入图片描述

在Project窗口中,找到”GoogleARCore” -> “Prefabs” ,选择 “ARCore Device” 和 “Environmental Light” prefabs,并将这两个 prefabs拖到Hierarchy窗口中,如下图所示。
在这里插入图片描述

前面我们介绍过Prefabs,当检测到真实世界中的平面时,我们需要一种在虚拟空间中表示这一特征的方法,这就是使用可视化的虚拟平面,为了使用代码来创建平面,我们也要制作一个平面的Prefabs,当检测到更多真实世界的平面时,我们还要实例化并附加更多的Prefabs,以使可用的虚拟平面更大。
  在Hierarchy窗口,点击右键,选择 “Create”-> “3D Object” ->”Plane”,新建一个平面,命名为”VisualDetectedPlane”如下图所示:
在这里插入图片描述

在这里,我们特别需要关注的是在平面的Inspector窗口中,Position一定要归0,同时还要确保Scale为(1,1,1),如果这里有少许偏移,那么在用代码实例化平面后也同样会出现偏移。
在这里插入图片描述

二、应用纹理
  有了平面,我们还要给平面赋一个材质,以便在实例化后用户能看到这个平面。保持当前”VisualDetectedPlane”属于被选中状态,点击Mesh Renderer组件左侧的箭头打开Mesh Renderer组件详细信息,在详细信息栏展开后点击Element0后面的那个小圆圈,这将打开材质选择面板,在材质选择面板中,选择”PlaneGrid”,这就为我们的“VisualDetectedPlane”平面赋上了一个漂亮的可视材质纹理了。如下图所示:
在这里插入图片描述

三、添加平面渲染脚本
有了平面,也有了材质纹理了,但我们还需要一个渲染器来将检测到或者扩展出来的平面渲染出来,如果我们自己去写这个渲染器将不会是一件愉快的工作,好在ARCore已经为我们写好了,我们只需要将这个写好的类附加到我们的平面上即可,点击 “Add Component”按钮,在搜索框中输入”Detected”,可以找到DetectedPlaneVisualizer,将这个脚本附件到我们的平面上。如下图所示:
在这里插入图片描述

四、制作平面Prefabs
  与前面所说一样,在Hierarchy窗口中,将VisualDetectedPlane平面拖动到Projects窗口中的Prefabs文件夹中,这样我们就做好了VisualDetectedPlane平面的Prefabs,然后删除Hierarchy窗口VisualDetectedPlane平面。
在这里插入图片描述

五、更新App Controller
  好了,有了可视化的平面Prefabs了,我们现在需要更新一下我们的App Controller,以便处理检测到的平面的可视化问题。因为平面中我们添加加的DetectedPlaneVisualizer是由ARCore提供的,我们需要在我们的代码中引用其命名空间GoogleARCore.Examples.Common。
  然后我们再申明一个GameObject,注意这个变量是public型的,等挂载这个脚本后,这个变量会出现在Inspector窗口中,另外,我们还实例化了两个list来存放我们新检测到的平面和已检测到的所有平面,代码如下所示:


```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using GoogleARCore;
using GoogleARCore.Examples.Common;

public class AppController : MonoBehaviour {

    private bool mIsQuitting = false;
    public GameObject DetectedPlanePrefab;
    private List<DetectedPlane> mNewPlanes = new List<DetectedPlane>();
    private List<DetectedPlane> mAllPlanes = new List<DetectedPlane>();
    // Use this for initialization
    void Start () {
        OnCheckDevice();
    }

    // Update is called once per frame
    void Update () {
        UpdateApplicationLifecycle();

        Session.GetTrackables<DetectedPlane>(mNewPlanes, TrackableQueryFilter.New);
        for (int i = 0; i < mNewPlanes.Count; i++)
        {
            GameObject planeObject = Instantiate(DetectedPlanePrefab, Vector3.zero, Quaternion.identity,
                transform);
            planeObject.GetComponent<DetectedPlaneVisualizer>().Initialize(mNewPlanes[i]);
        }

        Session.GetTrackables<DetectedPlane>(mAllPlanes);

    }
    /// <summary>
    /// 检查设备
    /// </summary>
    private void OnCheckDevice()
    {
        if(Session.Status == SessionStatus.ErrorSessionConfigurationNotSupported)
        {
            ShowAndroidToastMessage("ARCore在本机上不受支持或配置错误!");
            mIsQuitting = true;
            Invoke("DoQuit", 0.5f);
        }
        else if (Session.Status == SessionStatus.ErrorPermissionNotGranted)
        {
            ShowAndroidToastMessage("AR应用的运行需要使用摄像头,现无法获取到摄像头授权信息,请允许使用摄像头!");
            mIsQuitting = true;
            Invoke("DoQuit", 0.5f);
        }
        else if (Session.Status.IsError())
        {
            ShowAndroidToastMessage("ARCore运行时出现错误,请重新启动本程序!");
            mIsQuitting = true;
            Invoke("DoQuit", 0.5f);
        }
    }
    /// <summary>
    /// 管理应用的生命周期
    /// </summary>
    private void UpdateApplicationLifecycle()
    {
        if (Session.Status != SessionStatus.Tracking)
        {
            const int lostTrackingSleepTimeout = 15;
            Screen.sleepTimeout = lostTrackingSleepTimeout;
        }
        else
        {
            Screen.sleepTimeout = SleepTimeout.NeverSleep;
        }

        if (mIsQuitting)
        {
            return;
        }
    }
    /// <summary>
    /// 退出程序
    /// </summary>
    private void DoQuit()
    {
        Application.Quit();
    }
    /// <summary>
    /// 弹出信息提示
    /// </summary>
    /// <param name="message">要弹出的信息</param>
    private void ShowAndroidToastMessage(string message)
    {
        AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject unityActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
        if (unityActivity != null)
        {
            AndroidJavaClass toastClass = new AndroidJavaClass("android.widget.Toast");
            unityActivity.Call("runOnUiThread", new AndroidJavaRunnable(() =>
            {
                AndroidJavaObject toastObject = toastClass.CallStatic<AndroidJavaObject>("makeText", unityActivity,message, 0);
                toastObject.Call("show");
            }));
        }
    }
}

这段代码的逻辑如下,首先我们从Session中得到标记为new的DetectedPlane,并将这些检测到的平面赋给mNewPlanes list表,然后我们根据新检测到的mNewPlanes数量,对每一个新检测到的平面实例化一个我们之前制作的VisualDetectedPlane平面,并将新实例化的平面赋给planeObject以便显示和利用。最后我们还保留一份所有检测到的平面的副本。

六、测试平面检测功能
  至此,我们已经更新了App Controller,也制作了我们需要可视化的平面,现在我们要把这个脚本挂载到场景中,在Hierarchy窗口中,右键选择”Create Empty”,新建一个空对象,并命名为”AppController”。
在这里插入图片描述

点击Detected Plane Prefab后的小圆圈打开物体选择对话框,选择”VisualDetectedPlane”,如下图所示:
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Unity AR Foundation是一个基于Unity引擎的增强现实(AR)开发框架。该框架旨在简化AR开发过程,使开发者能够轻松地在Unity中创建AR应用程序。Unity AR Foundation提供了许多功能,包括跟踪和定位,平面检测,虚拟对象插入和交互等。使用Unity AR Foundation,开发者可以将虚拟内容与现实世界中的场景交互,创造出更加真实和沉浸式的AR体验。 ### 回答2: Unity AR Foundation是Unity公司推出的一个增强现实(AR)开发框架。该框架基于现有的Unity开发平台,为用户提供了一个高效、易用、全面的AR开发环境,能够帮助用户很容易地实现AR项目的设计、开发和测试。 这个框架能够通过一些先进的AR技术和算法,如图像识别、SLAM、声音识别等,将体感设备与现实世界相连,从而使开发者实现了更加生动、逼真的AR体验。Unity AR Foundation还结合了可能由多个AR平台共同使用的多个AR平台,如ARCore、ARKit,从而实现了更广泛的应用覆盖。 Unity AR Foundation最大的特点就是让AR开发者得以从日渐浓重的技术栈之中脱身,并更专注于低级别的算法和创意的应用。AR Foundation提供了一个清晰的基础依赖项结构,包括识别和翻译外部AR设备数据流的摄像机定位、输入系统、对象观察和手势识别。这样,用户不仅可以使用它提供的基于物理的AR组件,还可以在Unity中创建针对自己特定需求的组件。此外,它还提供了丰富的AR材料库和AR资源,为AR项目的开发提供了必要的素材支持。 公认的是,AR是未来的发展趋势。无论是在游戏开发、文化传承、数字营销等领域,AR技术都将开辟新的篇章。而Unity AR Foundation的机遇就在于他作为较为成立的AR框架之一,为广大的AR开发者提供了一个机会,让他们可以尝试更加复杂、多样和创新的应用,并为更高质量的产品呈现集大成的AR技术。 ### 回答3: Unity AR Foundation 是基于Unity引擎的增强现实框架,可以帮助开发者更加快速地开发出高质量的增强现实应用程序。它包含了一系列功能丰富的工具和组件,允许开发者在不同的设备上实现增强现实效果,无论是在ARKit或ARCore平台上,还是在基于浏览器的Web AR应用程序中。 Unity AR Foundation 可以大大简化AR应用程序的开发流程,因为它提供了与现有的AR平台无缝集成的工具和组件。除此之外,Unity AR Foundation 还提供了一些重要的功能,比如物体跟踪、平面检测、手势识别和虚拟现实等。 这个框架允许开发者创建逼真的虚拟体验,将虚拟物体投影到到真实世界中。这对于游戏行业、社交媒体和其他商业用途都有广泛的应用。例如,通过Unity AR Foundation,开发者可以创建具有交互性的广告,展示他们的产品,创造更具吸引力和互动性的展示形式。 总之,Unity AR Foundation 是一个非常有用的增强现实框架,可以协助开发者简化并加速AR应用的开发过程。这个框架和基于AR的应用程序一样,具有广泛的适用性和创新性潜力,将改变我们生活和工作的方式。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值