一、课程安排
二、虚拟现实概述
1.虚拟现实技术
虚拟现实技术(英文名称:Virtual Reality,缩写为VR),又称虚拟实境或灵境技术,是20世纪发展起来的一项全新的实用技术。虚拟现实技术囊括计算机、电子信息、仿真技术,其基本实现方式是以计算机技术为主,利用并综合三维图形技术、多媒体技术、仿真技术、显示技术、伺服技术等多种高科技的最新发展成果,借助计算机等设备产生一个逼真的三维视觉、触觉、嗅觉等多种感官体验的虚拟世界,从而使处于虚拟世界中的人产生一种身临其境的感觉 [9] 。随着社会生产力和科学技术的不断发展,各行各业对VR技术的需求日益旺盛。VR技术也取得了巨大进步,并逐步成为一个新的科学技术领域。 [1]
2.虚拟现实硬件技术产业链
3.虚拟现实应用领域
虚拟现实技术主要应用于教育、军事、工业、艺术与娱乐、医疗、城市仿真、科学计算可视化等领域。
由于能够再现真实的环境,并且人们可以介入其中参与交互,使得虚拟现实系统可以在许多方面得到广泛应用。随着各种技术的深度融合,相互促进,虚拟现实技术在教育、军事、工业、艺术与娱乐、医疗、城市仿真、科学计算可视化等领域的应用都有极大的发展。
传统的教育方式,通过印在书本上的图文与课堂上多媒体的展示来获取知识,这样学习一会儿就渐显疲惫,学习效果较差,然而玩过英雄联盟的同学都知道此游戏为什么如此吸引人,本质就是回到场景,参与其过程。
虚拟现实技术能将能将三维空间的事物清楚的表达出来,能使学习者直接,自然地与虚拟环境中的各种对象进行交互作用。并通过多种形式参与到事件的发展变化过程中去,从而获得最大的控制和操作整个环境的自由度。
三、HTC Vive
1.HTC Vive简介
2.HTC Vive主体硬件
3.HTC Vive主机配置
4.HTC Vive软件配置
Steam平台官网 store.steampowered.com/
5.Steam VR
1.Steam VR和OpenVR的关联
2.Steam VR支持的平台
3.Steam VR plugin目录结构
Plugins
/*这个文件夹存放一些Steam VR的信息*/
——penvr_api.bundle
——Contents
/*Steam VR底层的c++文件*/
——x86
/*SteamVR C#调用底层c++的接口*/
openvr_api.cs
SteamVR
/*这个目录下的脚本都是用来定制SteamVR插件中某些脚本在Unity中的Inspector界面及功能的*/
——Editor
/*定制SteamVR_Camera.cs这个脚本在Inspector中的显示效果*/
SteamVR_Editor.cs
/*定制SteamVR_RenderModel.cs脚本在Inspector中的功能*/
SteamVR_RenderModelEditor.cs
/*定制SteamVR_SkyBox.cs在Inspector中显示的属性*/
SteamVR_SkyboxEditor.cs
/*用来检查插件的更新*/
SteamVR_Update.cs
/*这个文件夹下面放着一些工具脚本*/
——Extras
/*这个脚本用来检测物体是否被用户所凝视*/
SteamVR_GazeTracker.cs
/*通过手柄指向来产生一条激光束*/
SteamVR_LaserPointer.cs
/*示例场景中扔物体的脚本*/
SteamVR_TestThrow.cs
/*示例场景中跟踪相机的脚本*/
SteamVR_TestTrackedCamera.cs
/*存放示例demo的材质体*/
——Materials
/*存放SteamVR预制体*/
——Prefabs
/*相机预制体*/
[CameraRig]
/*状态相关的overlay显示预制体*/
[Status]
/*SteamVR_Render预制体*/
[SteamVR]
/*一些自带的shader*/
——Resources
——Scenes
/*SteamVR核心脚本*/
——Scripts
/*SteamVR的封装类*/
SteamVR.cs
/*SteamVR的核心相机类*/
SteamVR_Camera.cs
/*SteamVR相机翻转*/
SteamVR_CameraFlip.cs
/*SteamVR相机网格隐藏*/
SteamVR_CameraMask.cs
/*声音控制类*/
SteamVR_Ears.cs
/*外部相机*/
SteamVR_ExternalCamera.cs
/*场景进行渐显或者渐隐的类*/
SteamVR_Fade.cs
/*跟踪设备的扫描范围*/
SteamVR_Frustum.cs
/*关节反身运动*/
SteamVR_IK.cs
/*场景切换类*/
SteamVR_LoadLevel.cs
/*菜单类*/
SteamVR_Menu.cs
/*overly封装类*/
SteamVR_Overlay.cs
/*运动区域*/
SteamVR_PlayArea.cs
/*Vive渲染流程控制的核心类*/
SteamVR_Render.cs
/*设置天空盒*/
SteamVR_Skybox.cs
/*做球形投影的类*/
SteamVR_SphericalProjection.cs
/*头盔上的前置相机*/
SteamVR_TrackedCamera.cs
/*跟踪设备管理类*/
SteamVR_TrackedObject.cs
/*工具类,包括事件系统,Transform等等*/
SteamVR_Utils.cs
/*常用的纹理*/
——Textures
4.SteamVR中的动作(Action)
1.input动作编辑窗口
2. SteamVR的动作类型
3.添加一个新动作
5.将动作与控制器的按键进行绑定
设置默认值并添加fire动作并保存个人按键设置
打开InteractionSystem文件夹中的场景进行测试
打开测试窗口判断动作是否被绑定
6.通过脚本获取SteamVR2.x中动作的输入
1.基本Action类和动作类型的比较
2.脚本编辑监听动作变化
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Valve.VR;//引入StreamVR的命名空间
public class ActionDemo : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
//第一种方式使用动作类上的事件监听函数对动作进行监听
SteamVR_Actions.default_fire.AddOnStateUpListener(fireAttack,SteamVR_Input_Sources.Any);//参数一表示事件函数,参数二表示监听对应触发的控制器按键
//第二种方式使用添加事件的方式
SteamVR_Actions.default_fire.onStateUp += onFireAttack;
}
private void onFireAttack(SteamVR_Action_Boolean fromAction, SteamVR_Input_Sources fromSource)
{
print($"由事件处理,{fromSource}触发");
}
private void fireAttack(SteamVR_Action_Boolean fromAction, SteamVR_Input_Sources fromSource)//参数一表示获取到的动作,参数二表示触发的按键
{
print($"由事件处理,{fromSource}触发");
}
}
7.SteamVR中的Interaction System(交互系统)
1.SteamVR官方文档valvesoftware.github.io/steamvr_uni…
2.了解Interaction System
3.Interaction System文件目录
4.Player类功能介绍
-Player类是一个单例,意味着在一个场景中只有一个Player对象。
-Player主要功能是持续追踪手柄和头显。
-它可以在整个项目中全局访问,并且交互系统的许多方面都假定Player对象始终存在于场景中。
-不管是VR模式还是2D fallback模式,它都保持追踪。
-通过Player类使用访问器允许其他组件以类似的方式运行,而不知道是否正在使用VR头显或鼠标/键盘。
接下来我们利用Player类单例模式的特点获取左手的移动时的速度
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Valve.VR.InteractionSystem;//引入交互系统的命名空间
public class ActionController : MonoBehaviour
{
void Update()
{
//使用单例模式获取左手控制器移动的速度
Vector3 leftHandVolecity = Player.instance.leftHand.GetTrackedObjectVelocity();
print("左手控制器的速度为"+leftHandVolecity);
}
}
5.位置传送:Teleporting模块的使用
1.Teleport预制件
场景里必须要挂有Teleport脚本,是个单例里面是瞬移的一些逻辑处理,这个也是做好的预制体
pointerValidColor:指向可瞬移区域/点的射线颜色
pointerInvalidColor:指向不可瞬移区域的射线颜色
pointerLockedColor:指向已锁定的瞬移区域/点的射线颜色
teleportFadeTime:瞬移过度时间
2.TeleportArc
**segmentCount**:射线小线段的数量
**thickness**:宽度
**arcDuration**:弧度
**segmentBreak**:每个小线段的生成间距时间
**arcSpeed**:速度
**material**:材质球
3.瞬移类型
(1)TeleportArea
TeleportArea就是一个plane,TeleportArea脚本上面有两个字段
Locked:勾上此区域变成不可瞬移
Marker Active:勾上只有瞬移的时候才会显示此区域,不勾会一直显示
(2)TeleportPoint
Locked:勾上此区域变成不可瞬移
Marker Active:勾上只有瞬移的时候才会显示此区域,不勾会一直显示
TeleportPointType:MoveToLocation瞬移到此地点 , SwitchToNewScene跳转场景
Title:提示文字
SwitchToScence:跳转的场景,具体代码没有实现,自己补充
PlayerSpawnPoint:勾选,运行时会自动传送到这个地点
4.实现场景的跳转
修改TeleportPoint中TeleportToScene的代码逻辑
6.基本3D物体交互:Interactable组件详解
在正式进入手柄和物体的接触式交互之前,先来讲解一个非常重要的交互组件-Interactable,该组件是物体触摸、拾取、使用的前提条件。
Active Action Set On Attach:在拾取物体时激活的动作集
Hide Hand On Attach:拾取物体时是否隐藏手
Hide Skileton On Attach:拾取物体时是否隐藏骨骼
Hide Controller On Attach:拾取物体时是否隐藏控制器
Hand Animation On PickUp:拾取物体时手部动画(与SteamVR_Skeleton_Poser配合使用)
Set Range Of Motion On PickUp:设置手部拾取的运动状态
Use Hand Object Attachment Point:指定使用手的附着物体的位置点,还是直接使用手的位置作为挂载点
Attach Ease In:开启缓动
Snap Attach Ease In Time:缓动时间
Snap Attach Ease In Completed:发送缓动完成事件
Hand Follow Transform:手部跟随对象
Highlight On Hover:悬停在游戏物体上时,游戏物体高亮(包含所有子物体)
Hide Hightlight:不参与高亮的游戏物体列表
Hover Priority:层级,数值越大,Hover越优先
要实现游戏物体的抓取需要挂载Throwable脚本
attachment抓取状态标记
Attachment Offset:抓取偏移局部坐标点
Release Velocity Style:松开物体时力的来源
NoChange:无变化,物体自身刚体的力 GetFromHand:来自手的世界空间力
ShortEstimation:瞬时预估,根据最后时刻的力估计
AdvanceEstimation:高级预估,根据所受的力的最佳平均值来估计
Release Velocity Time Offset:当力的来源为手时,获取力的时间偏移量
Scale Release Velocity:松开力的缩放
Restore Orginal Parent:松开时回到原有父节点下