pico+unity3d手部动画

在这里插入图片描述
在 Unity 开发中,输入系统的选择和运用对于实现丰富的交互体验至关重要。本文将深入探讨 Unity 中的 Input System 和 XR Input Subsystem 这两种不同的输入系统,并详细介绍它们在控制手部动画方面的应用。

一、Input System 和 XR Input Subsystem 的区别

Input System 是 Unity 提供的一套功能强大且扩展性高的输入检测系统,适用于键盘、手柄、鼠标、摇杆等多种设备。它将输入设备与动作逻辑分离,通过配置映射来处理输入信息。我们能够在其中定义动作,使一个动作对应多个输入操作,或者将动作与多个设备输入操作进行绑定。
XR Input Subsystem 则是 UnityXR SDK 中的重要部分,主要用于获取按钮、摇杆和设备跟踪信息。它作为用户控制数据输入到 Unity 引擎的核心子系统,会将输入信息传递给 InputDevices 和 InputSystem。

二、使用 Input System 控制手部动画

创建新脚本 Animator Hand Controller


以下是为您注释的上述代码:

```csharp
using System.Collections;  // 引入 System.Collections 命名空间,提供了一些通用的集合类型
using System.Collections.Generic;  // 引入 System.Collections.Generic 命名空间,提供了一些泛型集合类型
using UnityEngine;  // 引入 Unity 引擎的基本功能和类
using UnityEngine.InputSystem;  // 引入 Unity 的输入系统相关的类和功能

/**
 * AnimateHandController 类,用于控制手部动画
 */
public class AnimateHandController : MonoBehaviour
{
    // 公开的输入动作属性 - 捏合动作
    public InputActionProperty pinchActionProperty;
    // 公开的输入动作属性 - 握取动作
    public InputActionProperty gripActionProperty;
    // 私有变量,存储捏合动作
    private InputAction pinchAction;
    // 私有变量,存储握取动作
    private InputAction gripAction;
    // 私有变量,存储动画器
    private Animator animator;

    // Start 方法,在游戏对象实例化后的第一帧更新之前调用,用于初始化
    void Start()
    {
    	 //设置后在物体上添加脚本,进行绑定pico的值
        // 将 pinchActionProperty 中的动作赋值给 pinchAction
        pinchAction = pinchActionProperty.action;
        // 将 gripActionProperty 中的动作赋值给 gripAction
        gripAction = gripActionProperty.action;
        // 获取当前游戏对象的动画器组件并赋值给 animator
        animator = GetComponent<Animator>();
    }

    // Update 方法,每一帧都会被调用,用于实时更新逻辑
    void Update()
    {
        // 读取捏合动作的值并转换为 float 类型
        float triggerValue = pinchAction.ReadValue<float>();
        // 设置动画器的 "Trigger" 参数为读取到的捏合值
        animator.SetFloat("Trigger", triggerValue);

        // 读取握取动作的值并转换为 float 类型
        float gripValue = gripAction.ReadValue<float>();
        // 设置动画器的 "Grip" 参数为读取到的握取值
        animator.SetFloat("Grip", gripValue);
    }
}

然后倒入pico中已经定义的值,左右手柄都要绑定
在这里插入图片描述
在这个脚本中,我们首先定义了输入动作属性,然后在 Start 方法中获取对应的输入动作,并获取动画器组件。在 Update 方法中,读取输入动作的值并设置动画器的相应参数,从而实现手部动画的控制。
要使用这个脚本,需要在物体上添加脚本,并进行 Pico 中定义值的绑定。
具体怎么查看、合适的键、双击文件能看到对应的pico映射
在这里插入图片描述

2、 unityXR


using System.Collections;  // 引入 System.Collections 命名空间,用于处理非泛型集合
using System.Collections.Generic;  // 引入 System.Collections.Generic 命名空间,用于处理泛型集合
using UnityEngine;  // 引入 UnityEngine 命名空间,用于访问 Unity 引擎的基本功能和组件
using UnityEngine.XR;  // 引入 UnityEngine.XR 命名空间,用于处理虚拟现实和增强现实相关的功能

/**
 * HandPresence 类,用于处理手部存在和动画相关的操作
 */
public class HandPresence : MonoBehaviour
{
    // 输入设备的类型:头部设备、控制器等;可以多选,手部动作的话,选择左右和控制器
    public InputDeviceCharacteristics controllerCharacteristics;  

    // 目标输入设备
    private InputDevice targetDevice;  

    // 手部动画器
    private Animator handAnimator;  

    // 在游戏开始时执行的初始化方法
    private void Start()
    {
        // 获取当前游戏对象的动画器组件
        handAnimator = GetComponent<Animator>();  
        // 尝试初始化输入设备
        TryInitialize();  
    }

    // 尝试初始化输入设备的方法
    private void TryInitialize()
    {
        // 创建一个新的输入设备列表
        List<InputDevice> devices = new List<InputDevice>();  

        // 根据指定的特征获取输入设备,并将其添加到列表中
        InputDevices.GetDevicesWithCharacteristics(controllerCharacteristics, devices);  
        // 如果找到的设备数量大于 0,则将第一个设备设置为目标设备
        if (devices.Count > 0)
        {
            targetDevice = devices[0];
        }
    }

    // 实时更新手部动画的方法
    private void UpdateHandAnimation()
    {
        // 尝试获取trigger按钮的触发值,如果成功则设置动画参数,否则设置为 0
        if (targetDevice.TryGetFeatureValue(CommonUsages.trigger, out float triggerValue))
        {
            handAnimator.SetFloat("Trigger", triggerValue);
        }
        else
        {
            handAnimator.SetFloat("Trigger", 0);
        }

        // 尝试获取grip按键的握取值,如果成功则设置动画参数,否则设置为 0
        if (targetDevice.TryGetFeatureValue(CommonUsages.grip, out float gripValue))
        {
            handAnimator.SetFloat("Grip", gripValue);
        }
        else
        {
            handAnimator.SetFloat("Grip", 0);
        }
    }

    // 实时每帧更新的方法
    private void Update()
    {
        // 如果目标设备无效,则重新尝试初始化
        if(!targetDevice.isValid)
        {
            TryInitialize();
        }
        else
        {
            // 否则更新手部动画
            UpdateHandAnimation();
        }
    }
}
}

选择输入设备输入设备的类型:头部设备、控制器等;可以多选,手部动作的话,选择左右和控制器
在这里插入图片描述

在这个脚本中,我们首先定义了输入设备的特征,然后在 Start 方法中获取动画器组件并尝试初始化输入设备。通过不断检测设备的有效性,并根据获取到的输入值更新手部动画的参数。
对于不同厂商设备按键与动作输入的映射,您可以参考 Unity 官方文档的不同厂商设备按键与动作输入的映射表 。
综上所述,Input System 和 XR Input Subsystem 为我们在 Unity 中处理输入和实现手部动画控制提供了丰富的选择和可能性,开发者可以根据项目的具体需求灵活运用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux 配置静态IP】Ubuntu20.04

最近学习网络编程&#xff0c;为了方便学习需要Ubuntu配置静态IP&#xff0c;网上看了好多贴子跟着试了下可以实现&#xff0c;但重启虚拟机后有时就无法连接&#xff0c;总之各种各样问题&#xff1b;相关的配置方法也比较凌乱&#xff0c;有用netplan 或者 ifupdown ,笔者简单…

使用LobeChat+Ollama快速搭建本地大模型,离线可用

文章目录 准备工作下载Ollama什么是Ollama 参考文献 分享一下如何部署本地大模型&#xff0c;让它成为你的离线助手。 准备工作 服务器或者电脑一台&#xff0c;配置越高越好&#xff0c; Windows和Mac皆可&#xff0c;Widows最好内存8G以上而且带一块好一点的显卡&#xff1b…

AI伦理议题:从隐私保护到算法公平

文章目录 &#x1f34a;1 人工智能兴起背后的伦理及道德风险1.1 算法偏见与歧视1.2 数据隐私侵权1.3 透明度受限1.4 决策失衡1.5 AI生成内容的危险性 &#x1f34a;2 建构AIGC伦理观&#xff1a;实现人机共创的永续提升2.1 技术手段与伦理预防2.2 即时警告与紧急关停措施2.3 法…

Qt 使用Installer Framework制作安装包

Qt 使用Installer Framework制作安装包 引言一、下载安装 Qt Installer Framework二、简单使用2.1 创建目录结构 (文件夹结构)2.2 制作程序压缩包2.3 制作程序安装包 引言 Qt Installer Framework (安装程序框架)是一个强大的工具集&#xff0c;用于创建自定义的在线和离线安装…

【Outlook】从Outlook新版回归经典版全攻略

引言 在微软宣布计划于2024年底淘汰邮件应用&#xff08;Mail app&#xff09;之后&#xff0c;许多用户发现新版Outlook应用&#xff08;Outlook (new)&#xff09;在他们的Windows 11/10系统上自动启动。如果您更倾向于使用经典版Outlook&#xff08;Outlook (classic)&…

【tomcat】Tomcat如何扩展Java线程池原理

池化技术 在后端中&#xff0c;对于经常使用池化就是来提升系统性能&#xff0c;比如数据库连接池、线程池连接池等&#xff0c;本质都是利用空间换时间的来提升性能&#xff0c;用来避免资源的频繁创建和销毁&#xff0c;以此提高资源的复用率&#xff0c;所以合理设置系统所…

Python | Leetcode Python题解之第233题数字1的个数

题目&#xff1a; 题解&#xff1a; class Solution:def countDigitOne(self, n: int) -> int:# mulk 表示 10^k# 在下面的代码中&#xff0c;可以发现 k 并没有被直接使用到&#xff08;都是使用 10^k&#xff09;# 但为了让代码看起来更加直观&#xff0c;这里保留了 kk,…

成为CMake砖家(5): VSCode CMake Tools 插件基本使用

大家好&#xff0c;我是白鱼。 之前提到过&#xff0c;白鱼的主力 编辑器/IDE 是 VSCode&#xff0c; 也提到过使用 CMake Language Support 搭配 dotnet 执行 CMakeLists.txt 语法高亮。 对于阅读 CMakeLists.txt 脚本&#xff0c; 这足够了。 而在 C/C 开发过程中&#xff…

完美的用户体验:如何设计一个直观和有效的网站导航?

APP的顶部导航栏对我们来说很熟悉。导航栏是UI设计中不可或缺的一部分&#xff0c;几乎每个页面都使用导航栏。虽然导航栏看起来很简单&#xff0c;不需要太多精力&#xff0c;但是设计一个与产品需求和客户目标高度匹配的导航栏并不是那么容易的。导航栏的设计标准有很多细节需…

qt 创建一个左侧边线拖拽的矩形

1.概要 2.代码 2.1 代码第一版 在Qt中&#xff0c;要创建一个可以向左侧拖拽边线的矩形&#xff0c;你需要自定义一个QGraphicsRectItem的子类&#xff0c;并重写其事件处理函数来响应鼠标的拖拽动作。以下是一个简单的实现示例&#xff1a; #include <QApplication>…

Python酷库之旅-第三方库Pandas(028)

目录 一、用法精讲 71、pandas.tseries.api.guess_datetime_format函数 71-1、语法 71-2、参数 71-3、功能 71-4、返回值 71-5、说明 71-6、用法 71-6-1、数据准备 71-6-2、代码示例 71-6-3、结果输出 72、pandas.util.hash_array函数 72-1、语法 72-2、参数 72…

快速排序及归并排序的实现与排序的稳定性

目录 快速排序 一. 快速排序递归的实现方法 1. 左右指针法 步骤思路 为什么要让end先走&#xff1f; 2. 挖坑法 步骤思路 3. 前后指针法 步骤思路 二. 快速排序的时间和空间复杂度 1. 时间复杂度 2. 空间复杂度 三. 快速排序的优化方法 1. 三数取中优化 2. 小区…

昇思25天学习打卡营第13天|munger85

文本解码原理–以MindNLP为例 重要的就是怎么样把数字最后转化成真正的文字。而且自回归模型它会一个字给一个字的预测&#xff0c;下一个字应该是什么&#xff1f; 如果这个模型下载很慢&#xff0c;你就可以通过这种方式从摩大社区进行下载。 这种方式&#xff0c; 每一次候…

AI+文娱,人工智能助力文娱行业智能化之路!

近些年来&#xff0c;我国文化产业领域对于人工智能等高新科技愈发重视&#xff0c;呈现出文化和科技深度有机融合的发展态势。科技与文化碰撞带来的火花&#xff0c;让我们对历史的表达有了更多可能。这既是高新技术的具体应用和不断落地&#xff0c;也是提升文化产品数字化、…

MFC CRectTracker 类用法详解

CRectTracker 类并非 Microsoft Foundation Class (MFC) 库中应用很广泛的一个类&#xff0c;一般教科书中很少有提到。在编程中如果需编写选择框绘制以及选择框大小调整、移动等程序时&#xff0c;用CRectTracker 类就会做到事半而功倍。下面详细介绍MFC CRectTracker 类。 M…

小熊猫C++与Dev-C++:两款C++开发环境的对比

引言 在C编程的世界中&#xff0c;选择合适的开发环境是至关重要的。今天&#xff0c;我们将对比两款流行的C开发工具&#xff1a;小熊猫C和Dev-C。这两款软件各有特色&#xff0c;适合不同的编程需求和偏好。本文将从多个方面对它们进行详细的比较&#xff0c;帮助开发者做出…

如何追查一个packet在linux 系统哪里丢失

要想追一个包在系统哪里丢失了&#xff0c; 就要了解 一个应用层的包在送出时 要经历那些 检查点 和被丢掉的点。 1. 在传输层&#xff0c;如果是 tcp 包 会有contrack 的 buf 的限制 可能会导致 packets 的丢失。 > 检查办法&#xff1a;查看dmesg日志有报错&#xff1a;k…

输入网址到网页显示的过程

输入网址到网页显示的过程 1. 浏览器解析 URL2. 域名解析解析的流程 3. TCP通过三次握手建立连接4. 生成TCP段&#xff1a;在数据的前面加上 TCP 头部&#xff0c;生成TCP段TCP 头部 5. 生成IP数据报&#xff1a;在TCP段的前面加上 IP包头&#xff0c;生成IP数据报IP包头 6. 在…

【时时三省】tessy 集成测试:小白入门指导手册

目录 1,创建集成测试模块且分析源文件 2,设置测试环境 3,TIE界面设置相关函数 4,SCE界面增加用例 5,编辑数据 6,用例所对应的测试函数序列 7,添加 work task 函数 8,为测试场景添加函数 9,为函数赋值 10,编辑时间序列的数值 11,执行用例 12,其他注意事项…

EXCEL VBA工程密码破解 工作表保护破解

这里写目录标题 破解Excel宏工程加密方法一 新建破解宏文件方法二 修改二进制文件 破解工作表保护引用 破解Excel宏工程加密 如图所示 白料数据处理已工程被加密。 方法一 新建破解宏文件 1 创建一个XLSM文件&#xff0c;查看代码 ALTF11 2 新建一个模块&#xff0c;“插…