首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

【Unity+Vuforia】Vuforia AR项目开发全流程:从物体扫描到3D交互

  • 25-04-24 15:41
  • 2757
  • 5841
blog.csdn.net

前面已经学习了Vuforia插件导入和识别场景的搭建

一、项目概述

本文将详细介绍一个基于Vuforia的AR应用开发全过程,该应用能够实现3D物体扫描、UI交互提示、星球模型生成以及3D信息展示等功能。以下是完整的技术实现路线。

1 环境配置

首先确保已安装以下组件:

  • Unity Hub + Unity 2021.3.x LTS版本

  • Vuforia Engine AR 9.8.x

  • TextMeshPro (Unity标准包)

2.项目功能清单:

本案例实现的功能清单内容:
1.扫描成功后会弹出一个UI文字提示框“恭喜你扫描成功”

2.扫描完毕以后弹出按钮(包含三个星球),点击按钮就会克隆对应星球到指定位置,

3.用手点击这些模型,模型会放大并且手离开就会复原

4.点击这些模型,会弹出3D 介绍的ui信息 面板

3.绘制UI原型图

担任UI交互设计师的角色根据功能为自己绘制原型图:

二、开发步骤 

实现步骤:

2.1 创建UI界面

(首页、主页面、交互页面以及所有的提示框信息面板)提前做好,命名最起码让程序看的懂,避免写代码的时间还没有找UI的时间长...........

2.3  游戏初始化脚本

        功能实现逻辑:
        1. 获取AR摄像机对应的游戏对象
        2. 将其设置为非激活状态
        作用:游戏启动时默认禁用AR摄像头,需要点击开始扫描按钮主动开启
        

2.4 点击开始扫描按钮跳转界面和打开摄像机

实现打开ARcamera以及首页UI和MianpageUI的跳转

 功能逻辑A:
    /// 1.检测摄像机当前状态
    /// 2.如果未激活则开启AR摄像机
    /// 3.如果已激活则提示警告

// 功能逻辑B:
    /// 1.关闭初始界面(含LOGO/按钮)
    /// 2.显示扫描模式界面(含扫描提示/多边形等)

场景搭建

下面式全部UI控制以及点击图标克隆地球的脚本

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class GameiniUImanager : MonoBehaviour
  5. {
  6. float Currentime;
  7. //1.初始化 (第一个页面打开其他关闭、摄像机关闭)
  8. //2.点击按钮进入第二个页面、打开摄像机
  9. [Header("请填入你的AR摄像机")]
  10. public GameObject Arcamera;
  11. //----------------------------
  12. [Header("请把对应的UI物体放进去")]
  13. public GameObject FirstPage;
  14. public GameObject SecondPage;
  15. public GameObject ThirdPage;
  16. public GameObject Tip01Page;
  17. public GameObject Tip02Page;
  18. public GameObject AlwaysDisPage;
  19. public GameObject EARTHoBJ;
  20. private void Start()
  21. {
  22. Arcamera.SetActive(false);//关闭摄像机
  23. FirstPage.SetActive(true);//打开第一个页面
  24. SecondPage.SetActive(false);//关闭页面
  25. ThirdPage.SetActive(false);//关闭页面
  26. Tip01Page.SetActive(false);//关闭页面
  27. AlwaysDisPage.SetActive(false);//关闭页面
  28. Tip02Page.SetActive(false);
  29. }
  30. public void FirstPageTurn()
  31. {
  32. Debug.Log("用户点击第一个页面关闭,打开第二个页面,摄像机打开");
  33. FirstPage.SetActive(false);//第一个页面
  34. SecondPage.SetActive(true);//关闭页面
  35. Arcamera.SetActive(true);//关闭摄像机
  36. }
  37. public void Tip01Open()
  38. {
  39. Tip01Page.SetActive(true);//打开
  40. Currentime = Time.time;
  41. AlwaysDisPage.SetActive(true);//关闭页面
  42. }
  43. public void OpenThirdpage()
  44. {
  45. SecondPage.SetActive(false);//关闭页面
  46. ThirdPage.SetActive(true);//关闭页面
  47. //提示框,请选择星球放
  48. }
  49. public void clonearth()
  50. {
  51. //用户点击了地球图标!开始克隆一个地球!
  52. GameObject tempOBJ= GameObject.Instantiate(EARTHoBJ, new Vector3(0, 0.1f, 0), Quaternion.identity);
  53. tempOBJ.AddComponent();
  54. }
  55. private void Update()
  56. {
  57. if (Time.time - Displaytime > 1.5f && Tip01Page.activeSelf)
  58. {
  59. Tip01Page.SetActive(false);//扫描成功的提示框
  60. Debug.Log("自动关闭提示框");
  61. ThirdPage.SetActive(true);//第三个页面
  62. }
  63. }
  64. }

代码功能总结

  1. ‌初始化功能‌:

    • 在游戏开始时关闭AR摄像机
    • 只显示第一个UI页面,其他所有页面都处于关闭状态
  2. ‌页面切换功能‌:

    • FirstPageTurn(): 从第一个页面切换到第二个页面,并激活AR摄像机
    • OpenThirdpage(): 从第二个页面切换到第三个页面
  3. ‌提示功能‌:

    • Tip01Open(): 打开提示页面01并开始计时
    • 在Update()中自动检测提示页面01的显示时间,超过3秒后自动关闭
  4. ‌AR对象功能‌:

    • clonearth(): 在场景中实例化地球对象
  5. ‌调试功能‌:

    • 在Update()中输出当前时间,方便调试

这个脚本主要实现鼠标放在物体上,会缩放物体,以及点击物体克隆UI面板!

要想侦听三维世界的物体,还需要2个东西!

1.摄像机需要添加Physic Raycast组件!

2.场景中需要EventSystem 游戏物体

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.EventSystems;
  5. public class Raycast : MonoBehaviour, IPointerClickHandler, IPointerExitHandler, IPointerEnterHandler, IDragHandler
  6. {
  7. Vector3 tempscale;
  8. Object UITipmuban;
  9. //public GameObject UIfarther;
  10. void Start()
  11. {
  12. tempscale = this.transform.localScale;
  13. GameObject.FindWithTag("UImuban");
  14. UITipmuban= Resources.Load("Earth");
  15. // Vector3 temppos= Camera.main.ScreenToWorldPoint(Input.mousePosition);
  16. }
  17. public void OnPointerClick(PointerEventData eventData)
  18. {
  19. Debug.Log("点击了物体");
  20. GameObject.Instantiate(UITipmuban, new Vector3(0, 2f, 0), Quaternion.identity, this.transform);
  21. }
  22. public void OnPointerExit(PointerEventData eventData)
  23. {
  24. this.transform.localScale = tempscale;
  25. }
  26. public void OnPointerEnter(PointerEventData eventData)
  27. {
  28. this.transform.localScale *= 1.5f;
  29. }
  30. public void OnDrag(PointerEventData eventData)
  31. {
  32. Debug.Log("拖拽了物体" + Camera.main.ScreenToWorldPoint(Input.mousePosition));
  33. this.transform.position = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 2f));
  34. }
  35. // Start is called before the first frame update
  36. }

数媒小百科
微信公众号
数字媒体技术
注:本文转载自blog.csdn.net的Unity青子的文章"https://blog.csdn.net/leoysq/article/details/146416878"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

134
游戏
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top