利用Unity开发UI并接入HTC VIVE 手柄(基本上写完了,挖个坑12.1开完会更新)_unity htc vive-程序员宅基地

技术标签: c#  unity  笔记  视音频技术  

一、任务拆解

1. 设备型号、Unity环境配置

  • Unity 2018.3(之前用2021.3,教程比较少,自己复写很困难,就换了个版本)、HTC Vive Pro 2 专业套装、SteamVR
  • 安装Unity资源包:SteamVR Plugin(SDK要求 1.14.15)、vive input unity、icons(可能还有补充)
    在这里插入图片描述
    比较重要的官方文档:
    在这里插入图片描述

2. Unity播放全景视频

目前发现了两种做法

  • 第①种将全景视频渲染到整个skybox,让天空背景填充满全景视频
  • 第②种将全景视频限制在创建的Sphere中,在中间放个视频播放器

这两种都试了一下,操作过程及发现的利弊如下:

① skybox填充全景视频,并实现play界面巡航

步骤:

  • 设置video player
  • 设置接受渲染纹理的skybox材质
  • 设置场景以使用skybox

注意:应采用分辨率尽可能最高的全景视频(一般为 4K 或 8K),对设备计算资源和计算能力要求高。我这里还是用的笔电开发,后面涉及到交互类可能就需要换电脑。

  • 设置video player,直接把全景视频放到Assets,再添加到Hierarchy。点击play可以查看此视频。但是目前不知道怎么在不用手柄情况下调整play时的游戏视图。( (已解决-7.15)
    在这里插入图片描述

  • 查看导入的视频源信息:查看视频 Inspector ,滚动到视频预览,查看Source Info,搞清楚分辨率。
    在这里插入图片描述

  • 在Assets下创建Render Texture,调整大小同上。点击Hierarchy中的视频,调整video player下的渲染模式。视频不会在 Game 窗口中渲染,但可选择渲染纹理资源 (Render Texture Asset),然后确认其内容会随每一个视频帧更新。

在这里插入图片描述

  • 创建新的Material,将Shader 设置为 Skybox/Panoramic,Texture设置为刚建的Render Texture。如果是ERP格式,将 Mapping 设置为 Latitude Longitude Layout,选择 360 degree 或 180 degree 子选项。如果是CMP格式,将 Mapping 设置为 6 Frames Layout。查看Inspector的Preview,平移转动方向,确认大背景被换成全景图。

  • 设置lighting,菜单栏window>render>lighting。将新的Skybox Material拖放到 Environment 下的第一个字段。点击Play 可将视频显示为Skybox上的场景背景。

  • 在main camera的Inspector中添加组件 New Script,再点击play,就能game进行平移操作

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

public class LookAround : MonoBehaviour
{
    
    // Start is called before the first frame update
    public float speed = 3;

    // Update is called once per frame
    void Update()
    {
    
        if(Input.GetMouseButton(0))
        {
    
            transform.RotateAround(transform.position, -Vector3.up, Input.GetAxis("Mouse X"));
            transform.RotateAround(transform.position, transform.right, speed * Input.GetAxis("Mouse Y"));
        }
    }
}

② Sphere填充全景视频(目前暂时不采用这个方法-7.16注)

步骤:

  • 新建Material对象(后面简称M),将Shader 设置为 Skybox/Panoramic,Render Queue设置成Transparent
  • 在Hierarchy中创建Sphere(后面简称为S)作为播放球面,将其Inspector中的Material设为刚刚的M
  • 在Hierarchy中创建video player,设置Render Mode为Material Override,Renderer为刚刚的S,选择视频播放路径,点击play,可以看到Game中出现內容。

优缺点

  • 第①种对于高分辨率视频,渲染到整个Skybox,从play页面中查看比第②种更清晰,不需要手动对齐摄像机和视频中心,自带lighting。
  • 第②种相较于第①种,个人猜想对于性能的要求会低一点,渲染的视频画幅有限,采用的是官方的video player对象,不需要自己再去渲染一个video player,但是因为自带压缩,细节模糊;
  • 两种方法目前都暂时只能实现播放一个视频,不能连续渲染并播放多个不同的视频。第①种Render Texture使用的时候,需要调整分辨率,不适合多分辨率视频处理。第②种如果现在Sphere内部添加UI页面,比较困难。
  • 我现在尽可能只考虑可视化界面操作,如果后续必要,再去学习c#的编写。

3. Unity实现全流程

待开发脚本(2023.10.18正在写……)
先理一下思路:

  • 播放介绍GUI,上面有文字提示、确认键、声音播放\暂停(第二阶段),如果介绍文字太多,需要多个页面,因而还会有切换下一张、回到上一张按钮
  • 创建文件夹目录->遍历文件夹下的视频->播放视频,中间不停顿
  • 播放中灰间隔
  • 播放GUI,上面有选择分数、确认键(点击完变成绿色对勾) 、播放下一条视频按键(直接不允许回看回选)

4. Unity制作UI模块和界面

功能包括但不限于:暂停/继续、播放、滑动条、上/下一条视频、悬浮文本、弹窗、确认/取消

① 在视频画面上实现暂停/继续

  • 在video player的Inspector中添加New Script,添加公类Play、Pause、Stop
    public void Play()
    {
    
        videoPlayer.Play();
    }

    public void Pause()
    {
    
        videoPlayer.Pause();
    }

    public void Stop()
    {
    
        videoPlayer.Stop();
    }
  • 在Hierarchy添加Canvas,通过变换三角锥、放大缩小、平移调整画布到画面中央。在Canvas下添加Button,修改Inspector中Image第一栏,设置icon;增加鼠标点击Event,将刚刚编写的Play\Pause\Stop类赋给对应的Button。
    在这里插入图片描述

② 替换视频URL

  • 在video player的Inspector中添加New Script,添加私类URLtoVideo。在Canvas下新建InputField,在On End Edit(String)挂载URLtoVideo。这里输入的url可以是http开头的,也可以是本地路径。 注意是"//"或者“\”
    public void URLtoVideo(string url)
    {
    
        videoPlayer.source = VideoSource.Url;
        videoPlayer.url = url;
        videoPlayer.Prepare();
        videoPlayer.prepareCompleted += VideoPlayer_prepareCompleted;
    }

    private void VideoPlayer_prepareCompleted(VideoPlayer source)
    {
    
        Play();

    }

5. Unity实现与HTC Vive手柄交互(?先手柄与Steam交互,然后unity与steam链接)

值得记录的一些內容:

  • CameraRig:就是头盔视角模型,拖入场景即可触发头盔显示。内部包含了控制器上模型的子物体(头盔与左右手柄控制器)
  • Scripts:包含所有添加到Unity的VR功能工具脚本

6. 其他

便携式全景视频拍摄设备,一般有两种拍摄模式:360度2D视频(全景视频)、360度3D视频(全景3D视频)。目前我只考虑普通360°全景视频,如果要处理全景3D,Unity操作略有不同。

  • 360°2D视频 是全景视频 普通2D视频的360°环绕效果
  • 360度3D视频是具有3D景深效果的视频,但是只能从有限的视角点去观看(网上解释有点模糊,应当是考虑左右眼视差,将两种拍摄画面进行了一定的组合)

在这里插入图片描述

二、报错记录

  1. 材质出现紫红色?–大抵是版本更新后不匹配(待补充)

三、参考链接和书

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_44100263/article/details/131696199

智能推荐

从事汽车电子软件开发需要什么技能?_汽车mcu开发怎么入门-程序员宅基地

文章浏览阅读6.6k次,点赞8次,收藏90次。​前不久有一个朋友想转去做汽车软件开发,问我需要学习什么内容。今天在这里做一个分享,希望可以帮到这位朋友以及以后想要从事汽车电子软件开发的朋友们。随着SDV(软件定义汽车)概念的提出, 大家都认识到了软件在汽车电子领域的重要性,各大汽车主机厂纷纷成立了软件研发中心并争夺软件开发人才。上汽集团在今年年初成立了上汽软件中心(后改名为零束),长城汽车成立了诺博、诺创、诺博,还有很多OEM也成立或者扩大了各自的软件研发中心,这里都不赘述了。总之,这对从事汽车软件开发的同僚们是很大的利好。2019年大家经历了汽车_汽车mcu开发怎么入门

数学建模灵敏性分析(一阶、二阶灵敏度)python代码+懒人专用版_计算一阶sobol敏感性指数 python-程序员宅基地

文章浏览阅读9.2k次,点赞21次,收藏207次。对于勉强看懂了灵敏度分析的同学来说,本文给出一个方便移植、修改的python程序,可以很方便地进行灵敏度分析。_计算一阶sobol敏感性指数 python

怎样HTML做图片画廊,42个jQuery图片画廊插件-程序员宅基地

文章浏览阅读732次。这里列出了使用jQuery构建的42个jQuery图像库、滑块、插件和教程:1. TN3 GalleryTN3 Gallery是一个完整的基于HTML的可定制的图像库,包含幻灯片、转换和多个相册选项。兼容所有现代桌面和移动浏览器。由jQuery提供。2. AD Gallery当我编写可编辑的选择插件时,我受到了自己的启发,所以我决定再写一个。这是一个与插件类似的图片库插件,比如Thickbox和L..._jthumb

flink 流式处理中如何集成mybatis框架_flink集成mybatis-程序员宅基地

文章浏览阅读1.2k次,点赞2次,收藏6次。flink 中自身虽然实现了大量的connectors,如下图所示,也实现了jdbc的connector,可以通过jdbc 去操作数据库,但是flink-jdbc包中对数据库的操作是以ROW来操作并且对数据库事务的控制比较死板,有时候操作关系型数据库我们会非常怀念在java web应用开发中的非常优秀的mybatis框架,那么其实flink中是可以自己集成mybatis进来的。 我们这里以flink 1.9版本为例来进行集成。如下图为flink内部自带的flink-jdbc:创建一个fli._flink集成mybatis

SQL语言的数据类型_sql数据类型-程序员宅基地

文章浏览阅读4.1k次,点赞2次,收藏21次。MySQL中的数据类型有很多,主要分为三类:1.数值类型;TINYINT 1byte (-128,127) (0,255) 小整数值SMALLINT 2bytes (-32768,32767) (0,65535) 大整数值MEDIUMINT 3bytes (-8388608,8388607) (0,16777215) 大整数值INT/INTEGER 4bytes (-2147483648, 2147483647) (0,4294967295) 大整数值BIGINT _sql数据类型

Swagger中的注解对应的springdoc-openapi-ui中的注解_springdoc注解-程序员宅基地

文章浏览阅读3.9k次。swagger是我们开发过程中非常常用的一个api 文档维护组织吗,为了前后端更好的交互,swagger早已经成为了大家的首选api 文档框架。但随着spring的发展与强大,spring也出了自己的api框架,但实用惯了swagger的用户,在切换过来后发现就不太会用了,其实springdoc本身已经集成并兼容了swagger,但对应的注解有所变化。下面我们就来看看swagger的注解在springdoc中的对应关系。springdoc的maven依赖 <dependency> _springdoc注解

随便推点

无法从jinja2 引入 evalcontextfilter, Markup, escape_from jinja2 import markup, escape-程序员宅基地

文章浏览阅读4.3k次,点赞6次,收藏10次。1、问题描述:使用airtest 进行UI自动化测试,将python3.6 升级到python3.9。各种包安装完成后,运行脚本,报错:ImportError: cannot import name evalcontextfilter, Markup, escape from ‘jinja2‘无法从jinja2引入 evalcontextfilter, Markup, escape。2、解决办法查看了之前python3.6时的jinja2版本为3.0.3;升级到python3.9后,jinja2版本_from jinja2 import markup, escape

16款ChatGPT工具,炸裂收藏!-程序员宅基地

文章浏览阅读1.2k次,点赞2次,收藏3次。上一篇:ChatGPT+XMind,炸裂了!1.ChatGPT for google一个浏览器插件,可搭配现有的搜索引擎来使用。最大化搜索效率,对搜索体验的提升相当离谱:安装完插件后,在搜索引擎搜索任何问题,都能获取两份答案。左边是谷歌抓取的全网资源,右边是ChatGPT根据搜索结果总结提供的答案。每次检索问题都要疯狂翻页、恨不得把十几年的资讯挖个底儿透的筒子们快来集合,这个真行。2.VScode..._chatgpt软件

iterator_traits 存在的作用与意义-程序员宅基地

文章浏览阅读3.3k次。1.关于迭代器有关类型的获取与iterator_traits:有时候可能我们会需要知道迭代器的某些具体有关类型,如:迭代器所指对象的类型,两个迭代器之间距离的类型,迭代器解引用操作结果的类型,迭代器->操作结果的类型,以及迭代器本身的类型(单向,双向等)。因此,不同容器的迭代器都必须支持对上述迭代器有关类型的查询反馈,STL则采用内嵌类型声明的方式来实现对上述类型的返回。其中:value__iterator_traits

springboot使用aop以及原理分析_spring boot aspect原理-程序员宅基地

文章浏览阅读1.5k次。Java架构师交流群:793825326java版本:jdk1.8IDE:Idea2019Springboot:2.1.6.RELEASE1.pom:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-s..._spring boot aspect原理

编程入门训练_编程训练-程序员宅基地

文章浏览阅读1.4k次,点赞2次,收藏16次。编程入门训练:题目均来自于牛客网上编程入门训练的门类,所有源码均通过平台测试,以此文记录,有助于个人学习恢复编程能力_编程训练

git报 “The stash entry is kept in case you need it again“ 错误解析_the stash entry is kept in case you need it again.-程序员宅基地

文章浏览阅读9.7k次,点赞4次,收藏8次。本地执行git pull, 报了如下错误:D:\IdeaProject-ws-2\shedudma\sh_offlinedata>git pullremote: Enumerating objects: 27, done.remote: Counting objects: 100% (27/27), done.remote: Compressing objects: 100% (12/12), done.remote: Total 14 (delta 10), reused 0 (delta_the stash entry is kept in case you need it again.