从零开始的PICO开发教程(4)-- VR世界 射线传送、旋转和移动

从零开始的PICO开发教程(4)-- VR世界 射线传送、旋转和移动

文章目录

一、前言

在开发VR游戏的时候,第二个要解决的就是移动和转向问题,该专题将详细解析如何在VR世界中实现这些功能。

1、大纲

经过该教程你将学会

  1. 如何用扳机键或握把键(任君选)进行地区传送和锚点传送
  2. 如何通过左摇杆/右摇杆 转动画面
  3. 如何通过摇杆在场景中移动
  4. 初步熟悉 手柄按键与Unity中物体的交互方法

二、VR射线移动功能实现与解析

1、区域传送

(1)新建 XR Origin

XR – 》 Device-based --》 XR Origin(VR)
在这里插入图片描述
注:在层级窗口右键找不到XR选项的同学,可以参考之前的教程完成PICO开发环境配置:从零开始的PICO教程(1)Pico游戏开发项目配置

(2)新建一个用于传送的地面

  1. 在Hierarchy(层级窗口) 右键 3D Object --> Plane 新建地面
    • 但目前白色与传统的地面不是很像,我们给他修改颜色为灰色
  2. 在Project(项目窗口)右键 Create – 》Folder 创建一个文件夹,修改名字为:Materials,后续这个文件夹将专门用于存放Unity的材质
  3. 在Project(项目窗口)右键 Create – 》Material 创建一个材质,改名为gray在这里插入图片描述
  4. 点击材质调整颜色为灰色,然后将材质拖拽到Plane
  5. 为地面添加VR中常用的传送组件 Teleportation 在这里插入图片描述
  • Teleportation 组件介绍
    Teleportation是VR应用中流行的导航工具。用户可以指向并指示他们想要移动的目的地,并在发起传送命令时被传送到目的地。Teleportation是用户通过快速动画过渡到目标位置的运动,该动画经过调整以保持玩家舒适度。这是在 VR 中移动用户的最常见方式,同时将不适感降到最低。

    • Teleportation Area :添加组件后 该对象后将成为一个可传送对象,用途:地面、可站立位置
    • Teleportation Anchor:添加组件后 物体传送则只能传送到该物体的几何中心点上。一般Teleportation Anchor 都会结合Empty Object 使用,点击可传送对象,传送后将传送到指定位置,用途:传送阵、特殊地点
    • Teleportation Provider(传送提供者)
      Locomotion System中的一种特殊方式,用于快速将角色从一个位置瞬间传送到另一个位置。传送可以是在游戏场景中的固定点之间进行,也可以是根据玩家的输入或交互动作进行。传送通常用于解决长距离移动或跨越障碍物的问题,提供流畅的用户体验。
      Teleportation Provider可以与VR和AR设备的手柄、控制器或触摸界面等输入设备结合使用。通过触发传送操作,玩家可以在虚拟场景中快速移动到指定位置,而无需使用传统的行走或奔跑方式。这种传送方式在一些游戏、体验和虚拟导航应用中非常常见。

(3)将XR Origin设置为可传送的Provider 并赋值给可传送地面

  1. 将XR Origin设置为待传送的Provider对象
    在这里插入图片描述
  2. 让可传送地面知道,要传送誰在这里插入图片描述
  • Locomotion (运动系统)组件介绍
    用于控制角色或玩家在虚拟场景中移动的系统。它提供了一系列方法和工具,使角色可以在游戏场景中自由移动,并与环境进行交互。Locomotion System通常用于第一人称或第三人称的角色控制,以及虚拟现实(VR)和增强现实(AR)应用程序中的用户导航。
    它包含以下核心功能

  • 移动控制:Locomotion System提供了一种方式来控制角色的移动,比如使用键盘、鼠标、手柄或触摸屏等输入设备。它可以处理角色的前进、后退、旋转、跳跃等基本移动操作。

  • 碰撞检测:为了避免角色与场景中的物体产生穿越或碰撞,Locomotion System通常包含碰撞检测功能。它可以检测到障碍物、墙壁或其他物体,并阻止角色通过或与其发生碰撞。

  • 地形适应:在复杂的场景中,地形的高度变化或不规则形状可能会影响角色的移动。Locomotion System可以提供地形适应功能,使角色能够自动调整其移动方式,以适应地形的变化。

  • 动画控制:Locomotion System可以与角色的动画系统集成,以实现平滑的移动过渡和姿势控制。它可以根据角色的移动速度和方向来播放相应的动画。

本次教程主要使用到了其移动控制的功能,高阶教程中会再次使用到这些。现阶段了解即可。

(4)运行项目查看传送功能是否实现

利用PICO官方自带的PICO Unity Live Preview Plugin 实现 实时预览应用场景的功能,还不能实时预览应用场景功能的同学可以查看:从零开始的PICO教程(2)–实时预览应用场景
在这里插入图片描述
射线触发到可传送地面时候,转变为激活状态的,颜色变为白色。按下握把键,触发传送事件,完成传送。传送功能实现。
注:进入VR世界的时候看不到地面,可能是头显位置在地面下面,提高头显高度即可。

2、锚点传送

(1)创建锚点传送地面

参考:区域传送的第二节 新建一个用于传送的地面 完成以下操作

  1. 进入层级窗口 Create – > Plane 创建平面。
  2. 选择plane下右键 Create Empty对象,重命名为anchor (射线点击Plane 将传送到该Empty对象的位置)
  3. 进入Project 窗口,在Materials文件夹下新建一个材质,名字为blue,修改颜色为blue。然后赋值给第一步新建的plane对象。
  4. 选择第一步创建的plane对象,添加组件Teleportation Anchor,然后拖拽第二步创建的anchor 空对象,到Teleport Anchor Transform上
    在这里插入图片描述
    到这里,就完成锚点传送啦,运行VR游戏,点击plane,头显将自动移动过去。

(2)修改传送触发按键

目前,默认是按握把键传送,如果我想扳机键传送又要怎么改呢?
在这里插入图片描述

改好后就完成咯,之后想要移动,点击右控制器的扳机键即可。
修改完后,建议大家运行一遍体验效果。

三、视角旋转

来到这一步,相信在座的各位都会遇到头显转向不方便的问题吧。假如我祭出摇杆转向头显又该如何应对呢?

1、XR Origin添加Snap Turn Provider组件

  1. 选择XR Origin对象,添加Snap Turn Provider组件,然后点击新增控制器,拖拽LeftHand Controller到XR Origin对象的Teleport Anchor Transform上

在这里插入图片描述
好好好,到这里,我们就可以通过左摇杆控制头显视角转动了。 大家可以运行在头显中查看是否已经能正常转动。
注:在这里,可以通过修改Turn Amount 来修改每按一次摇杆头显转动角度。

四、人物移动

目前能传送不晕,又能转向。离你在VR世界运动,只剩下移动咯,人物移动头显也会自动移动,但很多时候场景有限,这就需要我们拥有可以通过摇杆控制头显视角移动的功能

1、创建PlayControl脚本

  1. 在Project(项目窗口)右键 Create – 》Folder 创建一个文件夹,修改名字为:Scripts,后续这个文件夹将专门用于存放C#脚本
  2. 在Scripts文件夹内右键 Create – 》C# Script 创建一个脚本,改名为PlayControl
    PlayControl脚本内容如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR;
using UnityEngine.XR.Interaction.Toolkit;public class PlayControl : MonoBehaviour
{// 传入右控制器的引用 public XRController rightController;//小球的移动速度public float Speech=2.0f;void Start(){}void Update(){//存储摇杆的在一个x,y轴上的移动数据 Vector2 result;//判断玩家是否移动了摇杆bool ret;//out 类似一个引用声明,primary2DAxis 修改的值可以通过out 后面的参数也就是result获得ret = rightController.inputDevice.TryGetFeatureValue(CommonUsages.primary2DAxis, out result);if (ret){Vector3 currentPosition = this.transform.position;this.transform.Translate(Speech * result.x * Time.deltaTime, 0, Speech * result.y * Time.deltaTime);}}
}

注意:脚本名字一定要跟里面的公共 类的类名一样是:PlayControl。如果不一样,则任意修改这两者中的一个,使其一样即可。

2、将PlayControl脚本赋值给XR Origin

在这里插入图片描述
这样就实现了,右摇杆控制人物移动的功能

五、手柄与脚本组件交互

如果我想为手柄的其他功能为其赋值,该怎么做呢?
在这里插入图片描述
我们可以用
函数:inputDevice.TryGetFeatureValue获取手柄上的按键
CommonUsages属性则可以选择该回调函数是获取手柄上哪个按键。

CommonUsages值对应手柄按键
CommonUsages.primary2DAxis摇杆
CommonUsages.grip握把键
CommonUsages.trigger扳机键

下面我将举个例子,实现按下握把键加速,松开速度降低的功能

将脚本PlayControl 修改如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR;
using UnityEngine.XR.Interaction.Toolkit;public class PlayControl : MonoBehaviour
{// 传入右控制器的引用 public XRController rightController;//小球的移动速度float Speech=2.0f;void Start(){}void Update(){//存储摇杆的在一个x,y轴上的移动数据 Vector2 result;float pressedThre;//判断玩家是否移动了摇杆bool ret;bool retGripPress = rightController.inputDevice.TryGetFeatureValue(CommonUsages.grip, out pressedThre);if (retGripPress){Speech = pressedThre * 6;}//out 类似一个引用声明,primary2DAxis 修改的值可以通过out 后面的参数也就是result获得ret = rightController.inputDevice.TryGetFeatureValue(CommonUsages.primary2DAxis, out result);if (ret){Vector3 currentPosition = this.transform.position;this.transform.Translate(Speech * result.x * Time.deltaTime, 0, Speech * result.y * Time.deltaTime);}}
}

本次代码主要功能:将握把键 的按压程度(0~1)传入pressedThre,然后再将其做为速度,这样就可以实现,按的越下速度越快的效果了。
其余的按键也可以通过这种方法来获得,后续如果要求的人比较多,会再出一版pico 手柄教程。
在这里插入图片描述

六、结束

通过这章VR世界 射线传送、旋转和移动VR世界 射线传送、旋转和移动,你已经可以制作一个简单的街景VR啦,下一章让我们来制作开始本次VR开发教程的第一个实战项目吧。



该教程由:深圳技术大学 – 元宇宙开发者协会 撰写提供。如果是本学校学生欢迎加入 元宇宙开发者协会 你会见识到一个与众不同的社团
元宇宙开发相关合作欢迎发送 协会邮箱:2981007652@qq.com

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

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

相关文章

志高团队:广阔前景 全新的投资理财体验

当今时代,数字金融迅猛发展,投资理财领域正在经历前所未有的重大变革。作为加拿大华企联合会控股旗下的重要项目,恒贵即将启动,旨在为广大投资者带来全新的投资理财体验。这一创新项目的优势和广阔前景受到了业内观察机构的广泛关注和期待。 恒贵作为一家全新的P2C多元化投资理…

YOLOv3模型原理深度解析

概况 (1)YOLOv3是YOLO系列第一次引入残差连接来解决深度网络中的梯度消失问题(是不是第一次,有待你后面考证),实际用的backbone是DarkNet53 (2)最显著的改进,也是对你涨…

DM/达梦数据库查询或更新某一列中多个字典码对应内容

准备工作(建表、插入数据) 1、建立表格:学生-学习科目表student_study 注意:科目kemu列内容是字典码,需要更换成对应内容。 CREATE TABLE "TEST"."STUDENT_STUDY" ( "NAME" VARCHAR(2…

mysql redis的区别

.mysql和redis的数据库类型 mysql是关系型数据库,主要用于存放持久化数据,将数据存储在硬盘中,读取速度较慢。 redis是NOSQL,即非关系型数据库,也是缓存数据库,即将数据存储在缓存中,缓存的读取…

Verdi实现信号的平移

在Verilog/System verilog中,# xxx可以实现延迟指定时间的功能,而在使用verdi查看信号波形并进行分析时,同样也可以实现类似的功能。 (注:这种信号平移是有其应用场景的,例如,在某些仿真模型中,…

ValueError: Index contains duplicate entries,cannot reshape

项目场景: python-dataframe 在对行转列的时候出现 ValueError: Index contains duplicate entries,cannot reshape 问题描述 dataframe官方文档 # 为什么报错 是因为 index 和 columns 有重复值 df df.drop_duplicates(subset[foo,bar],keepfrist) df.pivot(i…

使用patch-package保存node_modules包修改

遇到情况,第三方包存在bug或者缺少文件时候,我们手动修改了某个包时候,下次npm安装时候会导致原来的修改呗覆盖 安装 这时候可以用到npm工具包patch-package,项目更目录命令行安装 npm i -D patch-package修改文件 修改好nod…

SpringSecurity学习 - 认证和授权

一般来说中大型的项目都是使用SpringSecurity 来做安全框架。小项目有Shiro的比较多,因为相比与SpringSecurity,Shiro的上手更加的简单。 一般Web应用的需要进行认证和授权。 认证:验证当前访问系统的是不是本系统的用户,并且要…

Ubuntu20.4搭建基于iRedMail的邮件服务器

iRedMail 是一个基于 Linux/BSD 系统的零成本、功能完备、成熟的邮件服务器解决方案。基于ubuntu20.4搭建基于iRedMail的邮件服务器包括环境配置,iRedMail安装与配置,iRedMail调整邮件附件大小等3个小节进行描述。具体如下详细描述。 1 环境配置 1.设置…

SDXL prompt 笔记

模型 模型有两个,分别是 stable-diffusion-xl-base-1.0、stable-diffusion-xl-refiner-1.0。 base 模型是用来做文生图,refiner 模型是用来做图生图的。 SDXL 模型之 base、refiner 和 VAE_云水木石的博客-CSDN博客 分辨率 默认是1024*1024&#xf…

深入探索图像处理:从基础到高级应用

💂 个人网站:【工具大全】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 图像处理是计算机视觉领…

极验率先推出一键认证安全版,供客户自主免费升级,规避日常运营中的风险盲区

2017年6月1日,互联网服务开始响应《中华人民共和国网络安全法》的要求实施账号实名认证。由此,手机号码成为网络世界最主要的“身份证”,也让本机号码一键认证成为可能。其中,极验是最早的直连三大运营商的五家供应商之一&#xf…

生物的神经系统与机器的人工神经网络

生物的神经系统与机器的人工神经网络 文章目录 前言一、人工神经网络二、生物的神经系统三、关系四、相似与区别4.1. 相似:4.2. 区别: 总结 前言 因为本人是学生物的,并且深度学习的核心——人工神经网络与生物的神经系统息息相关,故想要在本…

VMwave虚拟机配置和外网联通

还原默认设置之后,参考 VMwave 虚拟机的三种上网方式_51CTO博客_虚拟机网络设置的三种 设置桥接模式 ,配置虚拟机为静态IP(网段和主机相通)。

华为开源自研AI框架昇思MindSpore应用案例:消噪的Diffusion扩散模型

目录 一、环境准备1.进入ModelArts官网2.使用CodeLab体验Notebook实例 二、案例实现构建Diffusion模型位置向量ResNet/ConvNeXT块Attention模块组归一化条件U-Net正向扩散数据准备与处理采样训练过程推理过程(从模型中采样) 本文基于Hugging Face&#x…

zabbix自定义监控

一、实验准备 192.168.115.148 zabbix-server 192.168.115.151 zabbix-angent rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm yum install zabbix-server-mysql zabbix-agent yum install centos-release-scl vim /etc/y…

Java毕业设计-基于SpingBoot的网上图书商城

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1. 简介2 技术栈3.1系统功能 4系统设计4.1数据库设计 5系统详细设计5.1系统功能模块5.1系统功能…

STM32F103RCT6学习笔记1:GPIO认识—点灯

今日开始快速掌握这款STM32F103RCT6芯片的环境与编程开发,有关基础知识的部分不会多唠,直接实践与运用!文章贴出代码测试工程与测试效果图: 目录 STM32F103RCT6参数解读: GPIO的基础认识与分类: 串口相…

5.后端·新建子模块与开发(自动模式)

文章目录 学习资料自动生成模式创建后端三层 学习资料 https://www.bilibili.com/video/BV13g411Y7GS?p11&spm_id_frompageDriver&vd_sourceed09a620bf87401694f763818a31c91e 自动生成模式创建后端三层 首先,运行起来若依的前后端整个项目,…

《Python趣味工具》——自制emoji3

今日目标 在上次,我们绘制了静态的emoji图。并且总结了turtle中的常用函数。 本次我们将尝试制作一个动态的emoji,让你的表情包动起来! 文章目录 一、动画原理:二、制作动画:1. 修改eyes_black()函数:2. 绘…