Unity之OpenXR+XR Interaction Toolkit实现 手枪模型的拆卸和组装

news2024/12/26 11:23:43

前言

之前我们曾实现过PC端的模型的拆卸和组装,如果使用VR模式来实现物体的拆卸呢?如何使用双手手柄来控制物体,拆卸物体呢?今天我们就来实现一个VR小Demo,基于OpenXR ,XR Interaction Toolkit插件来实现。

二.准备工作

我们需要准备好Unity2021工程和环境配置
有了前文:Unity之OpenXR+XR Interaction Toolkit基本配置的介绍,我们就不在详细说明这些了,大家自行复习。

流程简述:
我们新建一个3D(URP)工程
然后通过PackageManager安装XR Interaction ToolKit插件。
配置好XR Interaction Toolkit的Preset
新建一个3D场景
导入手枪模型

准备工作完毕
在这里插入图片描述

三.层级设置

我们先添加几个层,方便稍后的射线和碰撞遮罩的设置,它们分别是:
Gun层,用于手枪主体
GunPart层:用于手枪的拆卸子模块
在这里插入图片描述
我们设置层级的目的是,随时控制手枪拆卸的子模块和主体之间的碰撞,因为拆卸子模块和主体的碰撞在拆卸时是在一起的,我们需要控制它们之间不发生碰撞,所以我们需要设置ProjectSetting->Physics,设置Gun和GunPart不发生碰撞
在这里插入图片描述

三.手枪拆卸

1.手枪模型的分块

我们根据手枪的模型子节点,把能够拆卸的组件,给他独立一下节点,然后分别添加碰撞器和刚体。如图所示:
我这里拆分成了7大块拆卸子块,其他的和主模型放到一起作为枪身。
在这里插入图片描述

2.手枪的层级设置

我们看到上图,可以注意到,当我们为开始拆卸时,手枪和手枪的子模块都是有碰撞的,我们需要给他们分别设置层级。我们给手枪的各个子模块设置一下层级为GunPart,然后给手枪的主体设置层级为Gun。
这样我们可以做到拆卸时,虽然子模块和主体都可以交互,但是他们两者不发生交互。

3.手枪的抓取

我们一般习惯是右手拿枪,所以我们在拆卸枪时,也是设定为右手拿枪,左手拆卸子组件,在OpenXR中,我们想要拿起物体,需要给物体添加组件XR Grab Interactable。并且给它的InteractionLayerMask设定层级为Gun,如果Interaction Layers没有Gun和GunPart层,请添加,注意这里的InteractionLayers层是和Unity自带的LayerMask不同的两个设置,这里是OpenXR使用的。用于控制VR手柄交互访问的一些层。
如下图所示:
在这里插入图片描述
此时,如果我们创建一个XR Origin,我们可以测试一下是否可以通过摄像把手枪拿起来。

4.RightHandController设置

如果我们想使用射线抓取,那么我们就使用Ray Interactor,如果我们想使用手直接抓取操作,那么我们就使用Direct Interactor组件,这一块我们前几节课讲过,这里就不再赘述。我们只说一下RightHandController的一些参数设置。

XR Ray Interactor设置

XR Ray Interactor主要修改一下两个层级,其他保持默认即可
Interaction LayerMask:Gun:交互遮罩,只有Gun层的射线才可以点击
Raycast Mask:UI,Gun:射线遮罩,非Gun层,射线照射没有效果。
在这里插入图片描述

Direct Interactor设置

DIrect Interactor可以通过手部直接拿起物体,主要设置一个InteractionLayerMask即可
InteractionLayerMask:Gun:手部只能近距离抓取Gun层的物体。
在这里插入图片描述

5.子模块拆解

我们刚才说了,我们使用右手拿枪,左手拆卸枪,接下来我们依次给子模块添加XR GrabInteractable组件,并设置InteractionLayerMask为GunPart层。
在这里插入图片描述

6.LeftHandController设置

我们使用左手进行拆卸时,也可以选择使用射线抓取拆卸还是直接抓取拆卸,虽然两者都可以,但是因为VR手柄有一定的大小,如果我们右手直接抓取枪,左手也使用直接抓取拆卸,那么VR手柄可能会碰撞到一起,甚至打住我们自己的手,所以给大家提供几种选择
1.左右手都是射线抓取+直接抓取,哪个使用射线抓取,哪个使用直接抓取,用户可以自己选择。
2.右手通过射线抓取拿起枪支,手柄和枪保持一定距离,左手通过直接抓取拆卸枪支。

XR Ray Interactor设置

XR Ray Interactor主要修改一下两个层级,其他保持默认即可
Interaction LayerMask:GunPart:交互遮罩,只有GunPart层的射线才可以点击
Raycast Mask:UI,GunPart:射线遮罩,非GunPart层,射线照射没有效果。
在这里插入图片描述

XR Direct Interactor设置

XR Direct Interactor组件用于左手直接抓取拆卸枪支。
InteractionLayerMask设置为GunPart层,控制左手只能操作枪支的子模块,无法拿起枪支主体。
在这里插入图片描述

四.拆卸Demo

以上步骤完成后,我们基本就可以运行测试Demo了。

1.自由拆卸

如果我们是自由的方式拆卸枪支,那么以上应该就没有什么大问题了。我这里操作没有什么问题。如下图所示:
在这里插入图片描述

2.流程拆卸

如果我们是流程化的方式拆卸枪支,比如第一步拆弹夹,第二部拆枪膛,第三步等等,那么我们需要再写脚本来辅助这些功能,并且还可以添加当前要拆卸的部件的高亮效果,我这里的流程化脚本就不展示了,逻辑比较简单,就是加一个子组件的碰撞控制,再监听一下当前拆卸物体是否放下。如果要做商业项目,那这里逻辑会更加定制化,我们就不再多说,我这里的流程化效果如下所示:第一步拆下弹夹后,枪膛扣高亮,等待下一步拆卸。
在这里插入图片描述

五.手枪组装

刚才我们说了手枪的拆卸,有拆卸就一定有组装,我们先分析一下组装的基本原理:
首先我们复制出来一个手枪2,把要拆卸的枪支模块都单独拖拽出来当做单独游戏对象放到桌面上,其他没用的都删掉。
这样的话,我们每个枪支子组件就有了两个,我们添加上碰撞和XR Interaction 组件

接下来,我们分析一下如何组装。
我们可以通过左手把零散的子模块拿起来,然后去和右手枪支主体上的相同模块子组件发生碰撞触发检测,触发成功的,我们认为组装成功了,可以把左手的零散的子模块隐藏,显示右手主体的子模块。这样我们就完成一次模块组装。
在这里插入图片描述
由于组装无法做成自由模式,必须有顺序的组装,所以我们必须添加额外的脚本来辅助组装的功能。比如触发检测,组件的显示和隐藏,组装流程的控制等等。这个可复杂可简单,所以我就只说一下组装的原理,代码我就不演示了。

六.最终

好了,本篇文章就到这里,希望能够对你有所帮助,有问题欢迎留言。

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

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

相关文章

程序员面试宝典

前言 编者: 大淘宝技术开发工程师 / 刘苏宏(淘苏) 淘苏(花名)目前是大淘宝技术的一名开发工程师。从国企 跳槽来到互联网,【职业规划】是他被问得最多,也思考得 最多的问题。 扫一扫,关注公众号【大淘宝技术】 了解更多大淘宝技术干货沉淀 …

技术架构演进之路-Docker【一】

技术架构演进之路 了解每种技术架构以及如何演进的,熟悉Docker在架构中的核心作用 八大架构演进 单机架构 当前服务由应用服务和数据库服务两个服务组成,应用服务由 用户模块、商品模块、交易模块三个模块组成,我们可以理解它为 淘宝。用户模…

互联网时代,自媒体宣发的概念、优势、策略及注意事项

自媒体宣发是指通过自己或者委托专业机构,运用自媒体平台传播宣传信息的一种方式。在互联网时代,自媒体已经成为了企业推广的一种重要手段。本文将为大家介绍自媒体宣发的概念、优势、策略及注意事项。#自媒体# 一、什么是自媒体宣发? 自媒体…

通配符SSL证书是什么?

通配符SSL证书可以对申请的域名保护以外,还可以对下一级子域名无限使用,适合存在很多二级域名项目的网站,这样不需要额外对子域名申请SSL证书,还可以进行同意管理及部署SSL证书避免跨站窜站的问题。 申请通配符SSL证书 一、申请通…

SSH远程终端神器,你在用哪一款

唠嗑部分 在我们日常开发中啊,不可避免的要与Linux打交道,虽然我们作为开发,不要求我们对Linux有多么的专业,但是基本的操作还是要会的,举几个常用的例子: 1、查看nginx配置,配置转发 2、清理…

蓝桥杯模块学习4——数码管

第一章 硬件部分 1.1 电路的组成部分 1.1.1 译码器和锁存器 具体可回顾之前LED灯的文章: https://blog.csdn.net/weixin_63568691/article/details/130660096 1.1.2 共阳极数码管: 原理图: 功能: (1)可…

[网鼎杯 2020 青龙组]bang 复现--frida-dexdump安卓脱壳工具的使用

一.前言 在NSSCTF练习安卓逆向,第一次遇到安卓脱壳题 大佬的题解只有一句话"frida-dexdump一把嗦" 听起来容易做起来难,还遇到了安卓虚拟机的玄学bug,折磨了我很久,好在最终使用真机成功dump并得到flag 题目来源:[网鼎杯 2020 青龙组]bang 如果直接用jadx打开会发现…

重大喜讯!国产讯飞星火大模型将超越chatGPT!

引言 近年来,随着人工智能技术的快速发展,自然语言处理成为了研究的热点。而在自然语言处理领域,ChatGPT是一个备受关注的模型,它的出现极大地推动了自然语言处理技术的发展。然而,最近国内一家公司——讯飞&#xff0…

记录--10个超级实用的Set、Map使用技巧

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 Set是一种类似于数组的数据结构,但是它的值是唯一的,即Set中的每个值只会出现一次。Set对象的实例可以用于存储任何类型的唯一值,从而使它们非常适用于去重。 Map是…

如何为研发团队打造专属的效能提升路径|QECon 演讲回顾

近日,ONES 受邀参加 2023 QECon 全球软件质量&效能大会(深圳站)。在会上,ONES 研发效能改进咨询顾问陈仪,发表了主题为《如何为研发团队打造专属的效能提升路径》的演讲。 陈仪有着丰富的咨询经验,曾带…

C++考试

文章目录 1.程序填空1.1函数调用1.2前置和后置“”、“--”运算符重载1.3异常处理1.4文本文件读取 2.程序阅读2.1C编程基础2.2继承与派生2.3静态成员2.4继承与派生2.5 输入输出2.6 模板 3.程序改错3.1三种访问权限3.2 友元3.3抽象类不能实例化对象3.4常数据成员初始化必须使用构…

面试题总结

1、0513 1.重载和重写的区别? 重载发生在同一类中,同名的方法如果有不同的参数列表(类型不同、个数不同、顺序不同)则视为重载。 重写发生在父子类中,重写要求子类重写之后的方法与父类被重写方法有相同的返回类型,比…

Linux:在VMware中,如果虚拟机之前可以上网,之后突然不能上网,怎么办?

Linux系统版本:centos 7.5 x64位 VMware版本: VMware Workstation Pro 16 文章目录 前言一、什么原因会导致这种问题并如何解决它?原因①:虚拟机没有启动网络服务原因②:外部主机上VMware的【VMware NAT Service】服务…

Linux常用命令——htpasswd命令

在线Linux命令查询工具 htpasswd apache服务器创建密码认证文件 补充说明 htpasswd命令是Apache的Web服务器内置工具,用于创建和更新储存用户名、域和用户基本认证的密码文件。 语法 htpasswd(选项)(参数) 选项 -c:创建一个加密文件;…

用“平面两点距离”求三角形面积,再用“三角形面积”多边形面积

不小于 3 边的多边形,都可以任一顶点发出的边切分为 n - 2 个三角形。 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单…… 地址&am…

跟着我学 AI丨教育 + AI = 一对一教学

随着人工智能(AI)技术的迅速发展,它已经开始了改变教育的方式。本文将介绍AI在教育行业中的应用场景,当前从事AI 教育的公司有哪些以及这些公司所提供的教育产品的特点,和未来AI 教育的潜在实现方式。 AI在教育行业的…

【C++初阶】C/C++内存管理

⭐博客主页:️CS semi主页 ⭐欢迎关注:点赞收藏留言 ⭐系列专栏:C初阶 ⭐代码仓库:C初阶 家人们更新不易,你们的点赞和关注对我而言十分重要,友友们麻烦多多点赞+关注,你们的支持是我…

【数据结构】一篇带你彻底了解栈

文章目录 栈的概念及结构栈接口的实现栈的初始化入栈出栈获取栈顶元素判断栈是否为空获取栈中有效元素个数栈的销毁 总结 栈的概念及结构 栈:一种线性数据结构,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶 (Top&…

Node.js 学习系列(三) —— REPL

Node.js REPL(Read Eval Print Loop:交互式解释器) 表示一个电脑的环境,类似 Windows 系统的终端或 Unix/Linux shell,可以在终端中输入命令,并接收系统的响应。 Node 自带了交互式解释器,可以执行以下任务: 读取 —…

Spring 初始导读

1.Spring初始 1. 为什么要学框架 学习框架相当于从"小作坊"到"工厂"的升级 , 小作坊什么都要做 , 工厂是组件式装配 , 特点就是高效. 2.框架的优点展示(SpringBoot Vs Servlet) 使用SpringBoot 项目演示框架相比 Servlet 所具备的以下优点: 无需配置 …