AR模型脱卡,unity端实现步骤详情

2023-11-18

AR模型脱卡unity端实现具体步骤

AR模型脱卡的原理

利用一些unity端AR插件做AR应用。通常会有一个需求,当识别物消失的时候,将3D模型从识别物这个父物体上移除,显示在屏幕中央。那么原理就显而易见了,就是在识别物追踪方法中,写一些模型的操作(判定当前模型显示、隐藏非当前模型)

实现方式

  • 两个摄像机,丢失追踪后。移除父物体关联,用另一个相机进行渲染。其实就是一个相机坐标系的转换。(稍显复杂)
  • 丢失追踪后,在主相机中创建一个空物体放置模型。(比较简单)

核心文件的编辑(简单点的)

  • NotFound.cs文件的编辑
using UnityEngine;
using System.Collections;
using Vuforia;
using System;

//拿到当前追踪识别
using UnityEngine;
using System.Collections;
using Vuforia;
using System;
using UnityEngine.SceneManagement;

public class NotFound : MonoBehaviour , ITrackableEventHandler
{

    #region PRIVATE_MEMBER_VARIABLES
    private TrackableBehaviour mTrackableBehaviour;

    //判断是否是第一次识别是否完成,防止开启程序未放入识别图也在屏幕中央出现模型
    bool firstfound = false;

    public bool imageIsOut = false;//识别成功的图片是否已经出现过

    //模型起始位置,值为起始模型组件中Transform.Position
    //Vector3 origposition = new Vector3 (0, 0.25f, 0);
    public Vector3 originPosition;
    public Vector3 rotation;

    public Vector3 it_position;
    public Vector3 it_rotation;

    //当前imagetarget对应的模型等target
    public Transform[] localTargets;

    //其他非当前imagetarget对应的模型等targets
    public Transform[] otherTargets;


    //Camera Object
    GameObject gObject;
    //Camera Object的Creat Empty脚本
    CreatEmpty cempty;

    //表示ImageTarget父物体那个组件
    public GameObject[] otherImageTargets;

    #region 自定义的协程延时函数
    //定义一个延时函数
    public static IEnumerator DelayToInvokeDo(Action action, float delaySeconds)

    {

        yield return new WaitForSeconds(delaySeconds);

        action();

    }
    #endregion //自定义的协程延时函数


    void Start()
    {
        //相机自动对焦
        Vuforia.CameraDevice.Instance.SetFocusMode(Vuforia.CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO);  


        mTrackableBehaviour = GetComponent<TrackableBehaviour>();
        if (mTrackableBehaviour)
        {
            mTrackableBehaviour.RegisterTrackableEventHandler(this);
        }
        //获取Camera中组件的CreatEmpty脚本
        gObject = GameObject.FindWithTag("MainCamera");
        cempty = gObject.GetComponent<CreatEmpty> ();
        if(cempty != null)
        {
            //杀死空物体
            cempty.destoryempty ();
        }
    }

    #endregion // UNTIY_MONOBEHAVIOUR_METHODS


    #region PUBLIC_METHODS

    /// <summary>
    /// Implementation of the ITrackableEventHandler function called when the
    /// tracking state changes.
    /// </summary>
    public void OnTrackableStateChanged(
        TrackableBehaviour.Status previousStatus,
        TrackableBehaviour.Status newStatus)
    {
        //Vector3 orirotation = new Vector3 (270, 0, 0);

        if (newStatus == TrackableBehaviour.Status.DETECTED ||
            newStatus == TrackableBehaviour.Status.TRACKED ||
            newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED)
        {

            //如果识别成功图片没有出现过,则执行下面的代码,显示并延时0.5秒后消失
            if(!imageIsOut)
            {
                for(int i = 0; i < otherTargets.Length; i++)
                {
                    //但是隐藏其他imagetarget对应的模型,目的是防止在该imagetarget对应的模型出现在屏幕中央的时候不受其他imagetarget对应的模型的影响
                    //otherTargets[i].gameObject.SetActive (false);
                    setShow (otherTargets [i], false);
                }

                for(int i = 0; i < localTargets.Length; i++)
                {
                    //localTargets[i].gameObject.SetActive (false);
                    setShow (localTargets [i], false);
                }


                //需要延时0.3s,让图片多显示0.3s后消失(执行outImage函数)
                //Invoke ("outImage", 0.5f);//如果这样,并不影响下面代码的执行。
                StartCoroutine(DelayToInvokeDo(() =>
                    {
                        outImage(newStatus);

                        //识别成功图片已经显示过了
                        imageIsOut = true;

                    }, 0.4f));

            }
            else
            {
                OnTrackingFound ();
            }


        }
        else
        {   

            OnTrackingLost ();
        }
    }

    #endregion // PUBLIC_METHODS

    //识别成功图片显示并消失之后
    private void outImage(TrackableBehaviour.Status newStatus)
    {   
        for(int i = 0; i < otherTargets.Length; i++)
        {
            //但是隐藏其他imagetarget对应的模型,目的是防止在该imagetarget对应的模型出现在屏幕中央的时候不受其他imagetarget对应的模型的影响
            //otherTargets[i].gameObject.SetActive (false);
            setShow (otherTargets [i], false);
        }

        for(int i = 0; i < localTargets.Length; i++)
        {
            //localTargets[i].gameObject.SetActive (false);
            setShow (localTargets [i], false);
        }

        //显示并消失之后在一次判断图片是否处于追踪状态
        if (newStatus == TrackableBehaviour.Status.TRACKED || 
            newStatus == TrackableBehaviour.Status.DETECTED || 
            newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED)
        {
            OnTrackingFound ();
            firstfound = true;
        }
        else
        {
            //OnTrackingLost ();
            for(int i = 0; i < otherTargets.Length; i++)
            {
                //但是隐藏其他imagetarget对应的模型,目的是防止在该imagetarget对应的模型出现在屏幕中央的时候不受其他imagetarget对应的模型的影响
                //otherTargets[i].gameObject.SetActive (false);
                setShow (otherTargets [i], false);
            }

            for(int i = 0; i < localTargets.Length; i++)
            {
                //localTargets[i].gameObject.SetActive (false);
                setShow (localTargets [i], false);
            }

        }

    }

    private void OnTrackingFound()
    {
        Debug.Log ("it is found");
        for(int i = 0; i < otherImageTargets.Length; i++)
        {
            //让其他的识别图在执行一次状态识别成功的代码,使得模型归位到imagetarget子物体
            otherImageTargets[i].GetComponent<NotFound> ().homing ();

            //当前图片识别成功时,关闭其他图片的识别
            //      otherImageTargets[i].SetActive (false);

            //将其他识别图中的识别成功图片设置成未显示过
            otherImageTargets [i].GetComponent<NotFound> ().imageIsOut = false;

        }

        for(int i = 0; i < localTargets.Length; i++)
        {
            //setShow (localTargets [i], true);
            //othertargetmodel.gameObject.SetActive (false);
            localTargets[i].parent = this.transform;
            localTargets[i].localPosition = it_position;
            localTargets[i].rotation = Quaternion.Euler (it_rotation);
   

            //开启当前图片对应的模型,因为在识别其他图片的时候有可能关闭了这个图片对应的模型
            //localTargets[i].gameObject.SetActive (true);
            setShow (localTargets [i], true);
        }

        //杀死空物体
        cempty.destoryempty ();

        //因为杀死了空物体,所以一旦丢失跟踪,模型就没地方放了,所以就加一个判断,丢失的话就不显示模型
        if(mTrackableBehaviour.CurrentStatus ==TrackableBehaviour.Status.NOT_FOUND)
        {
            for(int i = 0;i < localTargets.Length; i++)
            {
                setShow (localTargets [i], false);
            }
        }

        //target.rotation = Quaternion.Euler(orirotation);
        //firstfound = true;
    }
    private void OnTrackingLost()
    {
        Debug.Log ("it is lost");
        for(int i = 0; i < localTargets.Length; i++)
        {
            //localTargets[i].gameObject.SetActive (false);
            setShow (localTargets [i], false);
        }
        if (firstfound == true) 
        {
            //创建空物体
            cempty.creatempty ();


            for(int i = 0; i < otherTargets.Length; i++)
            {
                //但是隐藏其他imagetarget对应的模型,目的是防止在该imagetarget对应的模型出现在屏幕中央的时候不受其他imagetarget对应的模型的影响
                //otherTargets[i].gameObject.SetActive (false);
                setShow (otherTargets [i], false);
            }

            GameObject emptyobject = GameObject.Find ("empty");
            Transform cameraPos = emptyobject.transform;

            for(int i = 0; i < localTargets.Length; i++)
            {
                //将target作为cameraPos的子物体,cameraPos就是emptyobject(即空物体)的Transform表现形式
                localTargets[i].parent = cameraPos;
                localTargets[i].localPosition = originPosition;
                //target.localRotation = Quaternion.Euler (orirotation);
//              localTargets[i].localRotation = Quaternion.Euler (Vector3.zero);
//                localTargets[i].localRotation = Quaternion.Euler(rotation);

                //localTargets[i].gameObject.SetActive (true);
                setShow (localTargets [i], true);

            }

        }
        else
        {

            for(int i = 0; i < otherTargets.Length; i++)
            {
                //但是隐藏其他imagetarget对应的模型,目的是防止在该imagetarget对应的模型出现在屏幕中央的时候不受其他imagetarget对应的模型的影响
                //otherTargets[i].gameObject.SetActive (false);
                setShow (otherTargets [i], false);
            }

            for(int i = 0; i < localTargets.Length; i++)
            {
                print ("local Targets set active false");
                //localTargets[i].gameObject.SetActive (false);
                setShow (localTargets [i], false);
            }

        }


    }



    //方便其他脚本调用的接口函数,使this.中模型归位
    public void homing()
    {
        for(int i = 0; i < localTargets.Length; i++)
        {
            localTargets[i].position = new Vector3(0,0,0);
            localTargets[i].rotation = Quaternion.Euler (Vector3.zero);
            localTargets[i].parent = this.transform;
        }

    }
    //自己写的隐藏模型代码,仅模型可用
    void setShow(Transform target,bool IsShow)
    {

        Renderer[] targetrendererComponents = target.GetComponentsInChildren<Renderer>(true);
        Collider[] targetcolliderComponents = target.GetComponentsInChildren<Collider>(true);


        if(IsShow)
        {
            // enable rendering:
            foreach (Renderer component in targetrendererComponents)
            {
                component.enabled = true;
            }

            // enable colliders:
            foreach (Collider component in targetcolliderComponents)
            {
                component.enabled = true;
            }
        }
        else
        {
            // Disable rendering:
            foreach (Renderer component in targetrendererComponents)
            {
                component.enabled = false;
            }

            // Disable colliders:
            foreach (Collider component in targetcolliderComponents)
            {
                component.enabled = false;
            }
        }
    }
}
  • CreatEmpty.cs文件的编写
using UnityEngine;
using System.Collections;
using Vuforia;
public class CreatEmpty : MonoBehaviour {
    Vector3 emptyposition = new Vector3 (16, -62, 120);
    public void creatempty()
    {
        //定义一个空物体,并将他作为Camera的子物体,并设置其坐标和旋转角度
        GameObject emptyObject = new GameObject ();
        emptyObject.transform.parent = GameObject.FindWithTag ("MainCamera").transform;
        emptyObject.name = "empty";
        emptyObject.transform.localPosition = emptyposition;
        emptyObject.transform.localRotation = Quaternion.Euler (Vector3.zero);
    }
    //杀死camera组件中名字为“empty”的物体
    public void destoryempty()
    {
        if (GameObject.Find ("empty"))
            GameObject.Destroy (GameObject.Find ("empty"));
        else
            print ("没有empty!");     
    }
}

实现步骤(复杂点的)

  • 添加新的Camera,并将Camera配置如下:
    787409-20170602180927008-612058727.png
    这里有个坑就是,图层的depth属性的设置。值越高图层显示优先级越高。

  • 对于预制体添加标志Compent
    787409-20170602180944899-346973813.png
    这里添加两个组件Rotate是控制模型旋转的,另外一个是一个标志。方便我们通过组件查找到我们要访问的Object。

  • 核心追踪的方法实现,挂靠到imageTarget上

        public string ObjectName;
        private void OnTrackingFound()
        {
            //初始化模型
            TrackObjectFree[] objs = FindObjectsOfType<TrackObjectFree> ();
            foreach (TrackObjectFree to in objs) {
                Destroy (to.gameObject);
            }
            Resources.UnloadUnusedAssets ();
            //创建模型
            GameObject o = GameObject.Instantiate (Resources.Load (ObjectName)) as GameObject;
            o.transform.parent = this.transform;
            o.transform.position = this.transform.position;
        }
        private void OnTrackingLost()
        {
            TrackObjectFree to = GetComponentInChildren<TrackObjectFree> ();
            if (to != null) 
            {
                to.gameObject.transform.parent = this.transform.parent;
                to.gameObject.layer = 10;
            }
        }

转载于:https://www.cnblogs.com/fuunnyy/p/6878187.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AR模型脱卡,unity端实现步骤详情 的相关文章

  • 【华为OD机试真题 JAVA】执行时长

    JS版 华为OD机试真题 JS 执行时长 标题 执行时长 时间限制 1秒 内存限制 262144K 语言限制 不限 为了充分发挥GPU算力 需要尽可能多的将任务交给GPU执行 现在有一个任务数组 数组元素表示在这1秒内新增的任务个数且每秒都
  • Python脚本报错AttributeError: ‘module’ object has no attribute’xxx’解决方法

    最近在编写Python脚本过程中遇到一个问题比较奇怪 Python脚本完全正常没问题 但执行总报错 AttributeError module object has no attribute xxx 这其实是 pyc文件存在问题 问题定位
  • #C++矩阵类的实现

    C 矩阵类的实现 环境 Win10 VS2017 最近老师布置一个简单的C 作业 实现一个矩阵类 并且实现矩阵运算 主要实现运算为矩阵的加 减 乘 除以及求行列式 伴随矩阵 代数余子式和逆矩阵等 在参考网上的一些前辈的代码后 写出了这些运算
  • 信号与系统复习题

    选择题 2分 题 1 频谱与时域的关系 时域压缩 频域展宽 时域有限 频域无限 2 填空题 20分 2分 空 1 冲击信号的性质 抽样性 尺度变换性 奇偶性 2 线性时不变的概念 线性 齐次性 输入夸大多少倍 输出扩大多少倍 可加性 相应的
  • HFP协议

    通话专题HFP协议学习总结 一 配置和角色 二 HFP的连接 2 1服务级连接建立 2 1 1 服务发现和RFCOMM的连接 2 1 2 支持的特性交换 2 1 3 codec协商 2 1 4 HF指示器 2 1 5 AG指示器 2 1 6
  • ctfshow 文件上传 web151~170

    目录 web151 web 152 web 153 web 154 web 155 web 156 web 157 159 web 160 web 161 web 162 163 web 164 web 165 web 166 web 16
  • STM32F030C8T6 多通道ADC采集

    void adc init void ADC InitTypeDef ADC InitStructure GPIO InitTypeDef GPIO InitStructure RCC ADCCLKConfig RCC ADCCLK PCL
  • 动态规划算法解决背包问题(Java实现)

    文章收藏的好句子 你在书本上花的任何时间 都会在某一个时刻给你回报 目录 1 动态规划算法的概述 2 背包问题 3 动态规划算法解决背包问题 3 1 不可重复装入商品 3 2 思路分析 1 动态规划算法的概述 1 动态规划算法的思想是 将大
  • Python psycopg2使用SimpleConnectionPool数据库连接池以及execute_batch批量插入数据

    有关快速插入大量数据到数据库的一个比较好的博文如下 Fastest Way to Load Data Into PostgreSQL Using Python 其中文末还有提到几种不同方式的对比 效率十分的震撼 可以看看 1 连接池和批量插
  • MYSQL 安装

    MySQL8安装Installer 图文教程 编程宝库 Windows10 MySQL Installer 安装 编程宝库
  • shell提取字符串中的数字保存到变量中

    1 提取数字到变量 temp echo helloworld20180719 tr cd 0 9 echo temp 输出 20180719 2 重定向到文件 echo helloworld20180719 tr cd 0 9 gt mid
  • 【数据结构与算法】--排序

    目录 一 排序的概念及其运用 二 常见的排序算法 2 2选择排序 2 3 交换排序 2 3 4 1 快速排序优化 一 排序的概念及其运用 1 1 排序的概念 排序 所谓排序 就是使一串记录 按照其中的某个或某些关键字的大小 递增或递减的排列
  • [OpenAirInterface实战-14] :OAI nFAPI VNF/PNV持续集成测试的xml配置文件详解

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 120850348 目录 1 nFAPI
  • 23种设计模式之装饰模式

    装饰模式 一个简陋的房子 它可以让人在里面居住 为人遮风避雨 但如果给它进行装修 那么它的居住环境就更加宜人了 程序中的对象也与房子十分类似 首先有一个相当于 房子 的对象 然后经过不断装饰 不断对其增加功能 它就变成了使用功能更加强大的对
  • Unity Cinemachine插件学习笔记,实现单目标和多目标之间切换

    Cinemachine在2017版中正式加入 结合Timeline可以轻松的制作出一下相机动画 相比Unity自带的标准相机 这个Cinemachine插件可操作的变量更多 不同虚拟相机 用来控制相机的 可以平滑转换等 具体可以参考上篇 U
  • pytorch:如何修改加载了预训练权重的模型的输入或输出--(原权重文件修改参数)

    在使用pytorch的过程中 我们往往会使用官方发布的预训练模型 并在此基础上训练自己的模型 为了适配训练数据 有时候需要局部修改这类预训练模型的结构 本文将分别以修改输入的通道数和输出的分类数为例 讲解一种通用的方法来修练模型的结构 加载
  • 图像去模糊:MSSNet 模型详解

    本内容主要介绍实现单图像去模糊的 MSSNet 模型 论文 MSSNet Multi Scale Stage Network for Single Image Deblurring 代码 官方 https github com kky7 M
  • 什么是 DevSecOps?2022 年的定义、流程、框架和最佳实践

    DevSecOps 是一套实用且面向目标的方法 用于确保系统安全 DevSecOps 被定义为通过与 IT 安全团队 软件开发人员和运营团队合作 在标准 DevOps 周期中建立关键安全原则的过程 以下是对 2022 年 DevSecOps
  • 基于单片机的无线数据传输系统设计

    基于单片机的无线数据传输系统设计 类别 电子综合 1 引 言 随着计算机 通信和无线技术的逐步融合 在传统的有线通信的基础上 无线通信技术应运而生 他具有快捷 方便 可移动和安全等优势 所以广泛应用到遥控玩具 汽车电子 环境监测和电气自动化
  • 使用java关键字编写代码

    使用java关键字编写代码 java的关键字 java的基本数据类型 Java是一种强类型语言 必须为每一个变量声明一种类型 Java共包含8中基本类型 其中4种整型 2种浮点型 1种用于表示Unicode编码的字符单元的字符类型char和

随机推荐

  • Oracle VM VirtualBox做好虚拟硬盘后,如何进一步更改虚拟硬盘的大小

    以管理员身份打开 命令提示符窗口 然后利用命令cd进入Oracle VM VirtualBox安装目录 如下图 我进入了Oracle VM VirtualBox安装目录 D Program Files Oracle VirtualBox 然
  • 隐藏此电脑的视频,图片,文档,下载,音乐和3D对象

    此电脑美化 我们平常使用的资源管理器界面 3D 对象 视频 图片这些我们不需要的东西给占据 作为一个有强迫症的人我决定对其进行修改 最终结果如下如所示 网上普遍叫的方法是通过修改注册表文件进行修改 比较好的文章有 Win10删除资源管理器
  • moviepy音视频剪辑:视频半自动追踪人脸打马赛克

    一 引言 在 moviepy1 03音视频剪辑 使用manual tracking和headblur实现追踪人脸打马赛克 介绍了使用手动跟踪跟踪人脸移动轨迹和使用headblur对人脸进行打马赛克 实际上 moviepy除了使用manual
  • windows服务启动失败解决流程

    最近遇到windows服务启动失败的情况 网上查阅了一下相关的解决方式 顺便记录一下解决的一般流程和方式 一般是软件的配置文件出现问题 先检查配置文件是否有问题 例如没有符合yml格式 不可使用tab键而是空格键 等细节问题 1 查看相关应
  • C++const限定符

    最近通过网络资料复习const 后通过跟专业书籍对比 发现网络上很多都存在一些错误 于是在此做个笔记 1 const定义常量 一旦创建后其值就不能再改变 所以其必须初始化 若用表达式初始化 那么会在运行时初始化 若用值初始化 则在编译阶段初
  • 完美解决sqlalchemy.exc.ObjectNotExecutableError: Not an executable object

    报错的程序如下 from sqlalchemy import create engine import pandas as pd engine create engine mysql pymysql root 123456 localhos
  • 双极性正弦脉宽调制(双极性SPWM)介绍及MATLAB仿真验证

    前言 本文介绍单相全桥逆变电路双极性正弦脉冲宽度调制 双极性SPWM 并用MATLAB仿真验证 并且通过对比逆变器滤波前后效果 突出了SPWM谐波高频化 便于滤除的显著特点 希望本文对大家有帮助 文末有仿真模型代码 有需要自取 目录 前言
  • PM2常用命令

    安装pm2 npm install g pm2 1 启动 1 pm2 start app js 2 pm2 start app js name my api my api为PM2进程名称 3 pm2 start app js f name
  • chatgpt赋能python:如何用Python求和

    如何用Python求和 Python是一种高级编程语言 最初设计用于简单的脚本编写 但是也可以用于复杂的科学计算 求和是我们在编程中经常需要处理的基本操作之一 Python具有简单易学的语法和广泛的开源库 使其成为处理数据的强大工具 在本文
  • 2022CISCNmisc

    ez usb 题目已经告诉是usb流量 一共有三个地址2 8 2 10 2 4但2 4没用 我们分别导出2 8和2 10 从网上搜usb脚本将他们两个分别解出来 将那一打穿放到010发现是个rar文件 但是损坏了打不开 可以用winrar修
  • bp神经网络的训练方法,一文搞定bp神经网络

    BP人工神经网络方法 一 方法原理人工神经网络是由大量的类似人脑神经元的简单处理单元广泛地相互连接而成的复杂的网络系统 理论和实践表明 在信息处理方面 神经网络方法比传统模式识别方法更具有优势 人工神经元是神经网络的基本处理单元 其接收的信
  • -day17 面向对象基础

    第三模块 面向对象 网络 并发编程 此模块包含如下三大部分知识 面向对象 Python中支持两种编程方式来写代码 分别是 函数式编程 面向对象式编程 函数式 定义函数 在函数中实现功能 def func print 一个功能 执行函数 fu
  • mysql高可用分库分表ShardingSphere之Sharding-proxy

    文章目录 一 ShardingSphere 1 1 官网地址说明 1 2 为什么分库分表 二 官网整合说明 1 1 下载sharding proxy 1 2 sharding proxy集成注册中心 1 3 查看配置手册 1 3 1 官网数
  • C++ 快速排序

    快速排序是比较常用的一种排序 平均时间复杂度为O nlogn 最坏的时间复杂度为O n 话不多说 上代码 include
  • [Python人工智能] 三十三.Bert模型 (2)keras-bert库构建Bert模型实现文本分类

    从本专栏开始 作者正式研究Python深度学习 神经网络及人工智能相关知识 前一篇文章开启了新的内容 Bert 首先介绍Keras bert库安装及基础用法 这将为后续文本分类 命名实体识别提供帮助 这篇文章将通过keras bert库构建
  • 【C++】异常

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 目录 一 异常 1 C语言处理异常的方式 2 C 处理异常的方式
  • MyBatis 中if 标签 判断字符串不生效

    今天遇到if 标签判断字符串不生效 导致查询结果错误 异常sql 的mapper 文件
  • Ubuntu14.04安装ssh实现远程登陆

    Ubuntu14 04安装ssh实现远程登陆 安装 sudo apt get install y ssh 修改ubuntu的ip地址和PC在同一网段内 配置 sudo gedit etc ssh sshd config 修改成如下设置 重启
  • C++给变量起别名

    以下代码展示给变量a取一个别名b 两者指向同一个内存空间位置 改变b a也会相应改变 include
  • AR模型脱卡,unity端实现步骤详情

    AR模型脱卡unity端实现具体步骤 AR模型脱卡的原理 利用一些unity端AR插件做AR应用 通常会有一个需求 当识别物消失的时候 将3D模型从识别物这个父物体上移除 显示在屏幕中央 那么原理就显而易见了 就是在识别物追踪方法中 写一些