【EasyAR实战项目】图像识别+模型交互(全网首发,保姆级教程)

news2024/11/27 4:27:34

话不多说,先看实现效果

开发准备

以下为作者开发的环境,当然也可以使用更高的版本,尤其是EasyAR的版本可以选择更高的,因为这玩意儿版本迭代的太快了,而且更高版本所支持的手机型号更新,兼容性更强。

1 Unity Hub2020.3.33

下载地址  Unity所有版本下载 | Unity中国官网

2 EasyAR Sense Unity Plugin4.2

下载地址  下载-EasyAR官网

3 VScode

下载地址  Download Visual Studio Code - Mac, Linux, Windows

4 图片与3D模型(以下下载内容为本项目中使用的资源)

下载地址  Muryotaisu | 角色 | Unity Asset Store

工具下载

Unity Hub与Plugin下载

 安装JDK和Android SDK模块,若电脑环境为IOS就使用IOS Build Support

EasyAR SDK下载

获取Sense License Key

 登录后申请Sense许可证

稀疏空间矩阵在本项目中用不到,如果后续需要也可以申请。应用名称取啥都可以,但是Package Name必须要与自己创建的3D模板包一致(见开发步骤中第一步)

这里PackageName填错了,正确的应该是 com.DefaultCompany.EasyARdem1

开发步骤

1 创建3D模板

注意:此时的Package name应当与所申请Sense许可证中填写的Package Name相一致

2 将EasyAR SDK导入到环境中 

 

 

3 配置EasyAR基本信息

 回到开发者中心获取Sense Lisense Key

4 导入3D模型与所需识别的图片

因为作者下载过该模型,所以可以直接在Unity中打开,若第一次下载与上述EasyAR SDK的导入方法一致

将模型放置于环境中

在Assets目录下创建一个StreamingAssets文件,将所后续所需识别的图片放置在该文件夹中

 6  将Image Target与EasyAR_Image_Tracker文件放入工程中

 7 在ImageTarget对象中,将所需识别的图片放入Image Target Controller脚本中,当照片的名字输入正确后,场景中会自动出现所对应的照片

将Tracker对象设置为ImageTracker

 8 在Easy_AR_ImageTracker对象中的AR Session脚本中的Center Target对象设置为ImageTarget

 9 调整对象的位置与所需识别图片之间的距离 

10  配置Camera的属性

11 编写放缩与旋转脚本,实现用户对3D模型对象的交互

创建脚本

在文件夹中右击-->creat-->C#Script

脚本代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class suofang : MonoBehaviour
{
    private Touch oldTouch1;  //上次触摸点1(手指1)
    private Touch oldTouch2;  //上次触摸点2(手指2)
    void Update()
    {
        //没有触摸,就是触摸点为0
        if (Input.touchCount <= 0)
        {
            return;
        }
        //单点触摸, 水平上下旋转
        if ( Input.touchCount ==1)
        {
            Touch touch = Input.GetTouch(0);
            Vector2 deltaPos = touch.deltaPosition;
            transform.Rotate(Vector3.down * deltaPos.x, Space.World);//绕Y轴进行旋转
            transform.Rotate(Vector3.right * deltaPos.y, Space.World);//绕X轴进行旋转,下面我们还可以写绕Z轴进行旋转
        }
        //多点触摸, 放大缩小
        Touch newTouch1 = Input.GetTouch(0);
        Touch newTouch2 = Input.GetTouch(1);
        //第2点刚开始接触屏幕, 只记录,不做处理
        if (newTouch2.phase == TouchPhase.Began)
        {
            oldTouch2 = newTouch2;
            oldTouch1 = newTouch1;
            return;
        }
        //计算老的两点距离和新的两点间距离,变大要放大模型,变小要缩放模型
        float oldDistance = Vector2.Distance(oldTouch1.position, oldTouch2.position);
        float newDistance = Vector2.Distance(newTouch1.position, newTouch2.position);
        //两个距离之差,为正表示放大手势, 为负表示缩小手势
        float offset = newDistance - oldDistance;
        //放大因子, 一个像素按 0.01倍来算(100可调整)
        float scaleFactor = offset / 75f;
        Vector3 localScale = transform.localScale;
        Vector3 scale = new Vector3(localScale.x + scaleFactor,
                                    localScale.y + scaleFactor,
                                    localScale.z + scaleFactor);
        //在什么情况下进行缩放
        if (scale.x >= 0.5f && scale.y <= 2f)
        {
            transform.localScale = scale;
        }
        //记住最新的触摸点,下次使用
        oldTouch1 = newTouch1;
        oldTouch2 = newTouch2;
    }
}

将脚本对象拖放于模型上

文件导出

文件导出为apk格式,可直接在手机上运行

1 设置导出格式,勾选ARM64和IL2CPP是为了提高该项目与手机环境的兼容性

 

2 将电脑调试转换成安卓平台

3 电脑和手机通过USB进行连接,随后在Run Device选项中选择自己的手机,点击Buile and Run即可

 4 如果每次调试通过这种方式还是比较麻烦的,其实只要第一次在Build setting中设置好格式后,之后在文件中直接点击Build and Run即可快速调试

5 成功运行后在手机桌面上会有该项目的软件

运行结果

本项目中的手势交互为用户触屏,还有一个更符合AR体验的方式,即隔空手势交互,可参考下述文章

【AR隔空手势交互】Unity中基于Manomotion实现隔空手势交互_北村南的博客-CSDN博客_unity 手势交互

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/551412.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot实现限流注解

SpringBoot实现限流注解 在高并发系统中&#xff0c;保护系统的三种方式分别为&#xff1a;缓存&#xff0c;降级和限流。 限流的目的是通过对并发访问请求进行限速或者一个时间窗口内的的请求数量进行限速来保护系统&#xff0c;一旦达到限制速率则可以拒绝服务、排队或等待…

MySQL---存储引擎

1. 存储引擎 数据库存储引擎是数据库底层软件组织&#xff0c;数据库管理系统使用数据引擎进行创建、查询、更新和删 除数据。 不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能。不同的数据库管理系统都支持 多种不同的数据引擎。MySQL的核心就是存储引擎。 …

IDEA创建项目的操作步骤以及在虚拟机里面创建Scala的项目简单介绍

文章目录 前言 一、Idea创建项目的操作 1、选择本地的Scala插件包 2、创建项目的操作 3、输入新建的项目名称 4、在文件file里面选择new一个新的module文件 5、输入项目的名称&#xff0c;点击下一步 6、创建一个Scala文件夹 7、选择Mark directory as 8、单击文件里…

【5.21】六、自动化测试—概述

目录 6.1 自动化测试概述 6.1.1 什么是自动化测试 6.1.2 自动化测试的基本流程 6.1.3 自动化测试实施策略 6.1.4 自动化测试的优势和劣势 测试中的许多操作都是重复性的、非智力性的和非创造性的&#xff0c;但要求工作准确细致&#xff0c;此时计算机最适合代替人工去完成…

SpringBoot2.6.3集成ElasticSearch7.13.4详解,上下两篇,上篇集群配置,下篇集成配置(上)

一、集群配置准备 &#xff08;1&#xff09;方式一&#xff0c;从网盘下载ElasticSearch7.13.4 链接: https://pan.baidu.com/s/1vwUu1kbpCc5exkfOPgb29g 提取码: thn5 &#xff08;2&#xff09;方式二&#xff0c;从官网下载 https://www.elastic.co/cn/downloads/past-…

【C++学习】C++11——lambda表达式 | 可变参数模板 | 包装器

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《C学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; lambda表达式 | 可变参数模板 | 包装器 &#x1f3c0;lambda表达式&#x1f94e;lambda表达式语法&am…

汇编十一、汇编实现外部中断

1、实现目的 (1)实现8颗LED灯呈流水灯依次被点亮&#xff1b;静态数码管通过按键按下&#xff0c;显示数值发生改变&#xff0c;通过按键依次显示0-9。 (2)按键检测采用外部中断检测。 2、原理图及硬件连接 2.1、LED灯 (1)51单片机P1端口接八个共阴极LED灯&#xff0c;即I…

【python之django1.11框架二】django ORM 操作MySQL的基本操作

1. django 连接数据库(MySQL) # setting.py 文件 # 默认用的是sqkite3 DATABASES {default: {ENGINE: django.db.backends.sqlite3,NAME: os.path.join(BASE_DIR, db.sqlite3),} }# django链接MySQL 1.第一步配置文件中配置 DATABASES {default: {ENGINE: django.db.backend…

RocketMQ 消息发送、消息类别

一、消息发送 1.1 单生产者单消费者消息发送&#xff08;OneToOne&#xff09; 1、新建maven项目recketmqtest 2、导入RocketMQ客户端坐标 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-client</artifactId><…

chatgpt赋能Python-pythonbug

Python Bug: 了解并避免Python编程中的错误 在编程中遇到错误是件非常常见的事情&#xff0c;Python编程也不例外。在Python中&#xff0c;被称为“bug”的错误主要分为两种&#xff0c;编译错误和运行时错误。本文将向您介绍如何识别、调试和避免Python编程中的错误&#xff…

Windi CSS 原子css 下一代工类 CSS 框架

最近由于项目原因接触到了windi Css 发现这个东西真是绝绝子啊,不用在代码里写一行style,完全以类的形式去写样式,它里面包含了几乎所有的css样式&#xff0c;可以让我们不需要再去繁琐的写css样式&#xff0c;原来几行的css现在只需要短短的几个字符。他的许多新特性给我们带来…

《算法竞赛进阶指南》(持续更新ing)

算法竞赛进阶指南 位运算 AcWing 89. a^b #include<iostream> using namespace std;int main(void) {long long a,b,p;cin>>a>>b>>p;long long ans1%p;while(b){if(b&1)//判断b当前二进制位是否为1{ansans*a%p;}aa*a%p;//每跨越一个二进制位&…

用WaveNet预测(Adapted Google WaveNet-Time Series Forecasting)

目录 剧情简介: 数据来源 加载数据 分割数据和可视化 时间序列的多元波网模型:实现(多步预测) 创建模型 创建数据集 数据准备 1- Training dataset preparation 2- Validation dataset preparation Train the Model with TPU: 使用经过训练的适应Google WaveNet预测…

【多线程】| 基本知识汇总

目录 &#x1f981; 掌握基本概念1. 什么是线程&#xff1f;2. 什么是主线程以及子线程&#xff1f;3. 什么是串行&#xff1f;什么是并行&#xff1f; 什么是并发? &#x1f981; 线程的创建1. 通过继承Thread类实现多线程2. 通过Runnable接口实现多线程 &#x1f981; 线程执…

AI故事:智慧学校的人脸识别奇幻之旅

人脸识别 在一个名为智慧学校的小镇上&#xff0c;生物老师Rita和她的丈夫朝哥&#xff0c;一个富有创造力的艺术家&#xff0c;过着幸福美满的生活。他们的家庭与学校紧密相连&#xff0c;成为了一座小小的教育乐园。 智慧学校里有一群充满朝气的学生&#xff0c;其中小枣是…

自定义属性,v-bind computed的使用

0.0 自定义组件的使用 【掌握】 先自定义自己的组件 引入组件 import 组件名 from 路径/文件名 注册组件 <script> export default {components:{ // 组件注册组件名:组件名&#xff0c;组件名1},data(){ // 数据return {}},methods:{ // 方法} ​ } ​ </script&…

buu [AFCTF2018]MyOwnCBC 1

题目描述&#xff1a; 三份文件 #!/usr/bin/python2.7 # -*- coding: utf-8 -*-from Crypto.Cipher import AES from Crypto.Random import random from Crypto.Util.number import long_to_bytesdef MyOwnCBC(key, plain):if len(key)!32:return "error!"cipher_t…

lwIP更新记03:IPv6

从 lwIP-2.0.0 开始&#xff0c;lwIP 终于有可用的 IPv6 协议栈了&#xff01;IPv6 支持 双栈&#xff08;IPv4 和 IPv6 同时使用&#xff09; 或 IPv4/IPv6 二选一 模式。 lwIP-1.4.1 版本也有 IPv6&#xff0c;但那是实验性质的&#xff08;见…\lwip-1.4.1\src\core\ipv6目…

linux专题:嵌入式linux系统启动流程基础分析

目录 第一&#xff1a;linux内核源码基本简介 第二&#xff1a;uboot启动分析 第三&#xff1a;内核源码分析 第一&#xff1a;linux内核源码基本简介 下载 Linux 内核网址&#xff1a; https://www.kernel.org/ 最新 Linux 内核是 5.15 版本。现在常用 Linux 内核源码为4…

八大排序-直接插入排序、希尔排序、直接选择排序、冒泡排序、堆排序、快速排序、归并排序、基数排序

目录 前言 直接插入排序&#xff08;Insertion Sort&#xff09; 一、概念及其介绍 二、过程图示 三、代码 四、复杂度 希尔排序&#xff08;Shell Sort&#xff09; 一、概念 二、实现思路 三、图示过程 四、代码 4.1代码 4.2运行结果 4.3解释 五、复杂度 堆排…