pico 手臂手部手指完整版

news2024/11/15 21:02:15

别忘了设置好pico的设置和导入需要的样式
一、动画设置
1.1设置Avatar 遮罩;
在这里插入图片描述
1.2创建动画、手指动画的话,我创建了四个,分别对应的是(平展、弯曲食指、弯曲其他手指、握拳)
在这里插入图片描述
1.3建立分层、我建了三层,默认层,左手遮罩层、右手遮罩层;同时建立了BlendTree混合树
在这里插入图片描述
1.4添加参数和运动、混合类型选择2d Freeform Cartesian、并选择对应的运动和对应的参数
在这里插入图片描述
二、IK设置使用 Animation Rigging实现IK制作程序化的动画手臂跟随手自动移动等效果

在这里插入图片描述
三、完成以上操作后,下述完整代码(基本完成了以上操作、但是还要优化、比如移动、抓取等)

using System.Collections;  // 引入 System.Collections 命名空间,提供了一些通用的集合类型
using System.Collections.Generic;  // 引入 System.Collections.Generic 命名空间,提供了一些泛型集合类型
using UnityEngine;  // 引入 Unity 引擎的基本功能和类
using UnityEngine.InputSystem;  // 引入 Unity 的输入系统相关的类和功能 
public class NewBehaviourScript : MonoBehaviour
{
    //头部控制器(vr头盔)
    public Transform XROrigin;
    //头部控制器(vr头盔)
    public Transform headController;
    //左手控制器(左手柄)
    public Transform leftHandController;
    //右手控制器(右手柄)
    public Transform rightHandController;

    public Transform player;
    //头部rig
    public Transform head;
    //左手rig
    public Transform leftHand;
    //右手rig
    public Transform rightHand;

    //设置默认的模型身高
    public float playerHeight = 2.0f;

     
    public Animator animator;
    //
    // 公开的输入动作属性 - 捏合动作
    public InputActionProperty lpinchActionProperty;
    // 公开的输入动作属性 - 握取动作
    public InputActionProperty lgripActionProperty;
    // 私有变量,存储捏合动作
    private InputAction lpinchAction;
    // 私有变量,存储握取动作
    private InputAction lgripAction;


    // 公开的输入动作属性 - 捏合动作
    public InputActionProperty rpinchActionProperty;
    // 公开的输入动作属性 - 握取动作
    public InputActionProperty rgripActionProperty;
    // 私有变量,存储捏合动作
    private InputAction rpinchAction;
    // 私有变量,存储握取动作
    private InputAction rgripAction;



    // Start is called before the first frame update
    void Start()
    {

        /*初始化身高
        float playerzoom = headController.position.y / playerHeight;
      
        player.localScale = new Vector3(playerzoom, playerzoom, playerzoom);*/

        // 如果没有手动设置Animator,则获取当前物体上的Animator组件
        if (animator == null)
        {
            animator = GetComponent<Animator>();
        }


        //设置后在物体上添加脚本,进行绑定pico的值
        // 将 pinchActionProperty 中的动作赋值给 pinchAction
        lpinchAction = lpinchActionProperty.action;

        // 将 gripActionProperty 中的动作赋值给 gripAction
        lgripAction = lgripActionProperty.action;
      
      
        // 将 pinchActionProperty 中的动作赋值给 pinchAction
        rpinchAction = rpinchActionProperty.action;
        // 将 gripActionProperty 中的动作赋值给 gripAction
        rgripAction = rgripActionProperty.action;
        /* */
    }

    // Update is called once per frame
    void Update()
    {
      
        //修改角色朝向和启动转向动画(我这里没有启动动画)
        Vector3 cameraForward = headController.forward;
        cameraForward.y = 0;
        player.rotation = Quaternion.LookRotation(cameraForward);
        //修改角色位置 
        Vector3 newPosition = XROrigin.position ;
        transform.position = newPosition;

        //头部旋转

       
        Quaternion headControllerRotationQuaternion = headController.rotation; 

        head.rotation = headControllerRotationQuaternion;

        //根据头盔高度修改模型蹲的数值、修改动画(我这里没有写)




        //左手操作 
        // 计算旋转差值(四元数表示)
        Quaternion rotationDifference = Quaternion.Euler(0, -90, -90);  
            HandRotation(leftHandController, leftHand, rotationDifference);


        //右手操作
            // 计算旋转差值(四元数表示)
            Quaternion rightrotationDifference = Quaternion.Euler(0, 90, 90); 
            HandRotation(rightHandController, rightHand, rightrotationDifference);

        /*
               animator.Play("LForeFinger");
               animator.Play("LFinger"); 
        */
        // 读取捏合动作的值并转换为 float 类型
        float ltriggerValue = lpinchAction.ReadValue<float>();
        // 设置动画器的 "Trigger" 参数为读取到的捏合值
        animator.SetFloat("IsLForeFinger", ltriggerValue);
      //  Debug.Log("ltriggerValue" + animator.GetFloat("IsLForeFinger"));
      //  Debug.Log("ltriggerValue2" + ltriggerValue);

        // 读取握取动作的值并转换为 float 类型
        float lgripValue = lgripAction.ReadValue<float>();
       // Debug.Log("lgripValue" + lgripValue);
        // 设置动画器的 "Grip" 参数为读取到的握取值
        animator.SetFloat("IsLFinger", lgripValue);


        

        // 读取捏合动作的值并转换为 float 类型
        float rtriggerValue = rpinchAction.ReadValue<float>();
        // 设置动画器的 "Trigger" 参数为读取到的捏合值
        animator.SetFloat("IsRForeFinger", rtriggerValue);

       // Debug.Log("rtriggerValue" + rtriggerValue);
        // 读取握取动作的值并转换为 float 类型
        float rgripValue = rgripAction.ReadValue<float>();
        Debug.Log("rgripValue"+rgripValue);
        // 设置动画器的 "Grip" 参数为读取到的握取值
        animator.SetFloat("IsRFinger", rgripValue);

        /**/
    }

    /*动画剪切*/



    //修改手部的位置和旋转
    void HandRotation(Transform HandController, Transform Hand, Quaternion rotationDifference ) {

        //修改角色手位置
        Hand.position = HandController.position;
        // 获取手控制器的旋转(四元数表示)
        Quaternion aRotationQuaternion = HandController.rotation;

        

        // 应用差值到手控制器的旋转并获取新的四元数
        Quaternion bRotationQuaternion = aRotationQuaternion * rotationDifference;

        // 将新的四元数设置给左手的旋转
        Hand.rotation = bRotationQuaternion;

 
  
    }
   
 

}

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

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

相关文章

第二十章 加密 SOAP 主体

文章目录 第二十章 加密 SOAP 主体加密概述加密 SOAP 主体 第二十章 加密 SOAP 主体 本主题介绍如何加密 IRIS Web 服务和 Web 客户端发送的 SOAP 消息正文。 主题“加密安全标头元素”和“使用派生密钥令牌进行加密和签名”描述了如何加密安全标头元素以及加密 SOAP 主体的其…

这10个提示词技巧太强了,用过的人都说真香!

ChatGPT 已经发布一年多了&#xff0c;这一年&#xff0c;我们经常会听到“提示词工程&#xff08;Prompt Engineering&#xff09;”这个术语&#x1f4bb; 在探讨这个概念之前&#xff0c;我们需要先了解什么是Prompt&#xff08;提示词&#xff09;&#x1f914; 简单来说…

面试题复习(0902-0909)

1. 完全背包问题 和01背包唯一的区别是&#xff0c;每件物品都有无限个&#xff08;也就是可以放入背包多次&#xff09; 代码和01唯一的区别在于j的循环是从小到大&#xff0c;不是从大到小。ij谁在外谁在内层区别不大。 #include <bits/stdc.h> using namespace std…

Linux(2)--VmWare虚拟机安装

文章目录 1. VmWare概念2. 安装步骤2.1 下载2.2 安装过程 3. 小结 1. VmWare概念 现在我们要学习Linux了&#xff0c;需要有一台安装Linux系统的计算机。 但是我们又不想放弃Windows&#xff0c;毕竟平时办公、娱乐还得用。 此时可以在电脑上安装VmWare虚拟机软件&#xff0…

C:9-9题目:蛇形矩阵

一、题目介绍&#xff1a; 给你两个整数n&#xff0c;m&#xff0c;请你构造一个n行m列的蛇形方阵&#xff0c;在这个方阵中&#xff0c;数字由1到nm&#xff0c;从最右上角开始&#xff0c;呈环状(逆时针)向内填充。 比如一个3*3的蛇形方阵 3 2 1 4 9 8 5 6 7 二、解题思路&a…

Dropout正则化:提升PyTorch模型性能的神器!

本文展示了在PyTorch模型中添加Dropout正则化如何影响模型在损失和准确率方面的性能。 Dropout正则化在机器学习中的意义是什么&#xff1f; Dropout正则化是机器学习中的一种方法&#xff0c;通过在神经网络中随机丢弃一些单元&#xff08;神经元&#xff09;来模拟同时训练多…

explicit 的作用(如何避免编译器进行隐式类型转换)

目录 1. 隐式转换&#xff08;Implicit Conversion&#xff09; 2. 显式转换&#xff08;Explicit Conversion&#xff09; 3. 隐式转换的风险与显式转换的必要性 4. 隐式类型转换的例子 5. explicit 的作用 6. explicit 在构造函数中的作用 7. explicit 适用于转换操作…

常见网络层(卷积、池化、全连接)与其计算

卷积可视化&#xff1a;卷积神经网络 (CNN) 基本原理和公式_cnn公式-CSDN博客 嵌入大小计算规则【注意评论区全连接层计算规则勘误&#xff1a;Pv Wv Bv】 Conv、MaxPool、FC 池化操作和conv在kernels上计算不一致&#xff0c;在图像尺寸上的规则都是一样的。 公式可以理解…

解决windows远程桌面连接报错:这可能由于GredSSP加密数据库修正

这种问题需要修改一些远程端的安全级别 1.使用快捷键winr打开运行窗口 ------- 输入‘gpedit.msc’ 2.依次展开“计算机配置”->“管理模板”->“系统”->“凭据分配”设置名称&#xff1a; 加密数据库修正 3.双击“加密数据库修正”&#xff0c;将状态改为“启用”&a…

LDRA Testbed(TBrun)软件单元测试_实例讲解(对多次调用的函数打桩)

系列文章目录 LDRA Testbed软件静态分析_操作指南 LDRA Testbed软件静态分析_自动提取静态分析数据生成文档 LDRA Testbed软件静态分析_Jenkins持续集成&#xff08;自动静态分析并用邮件自动发送分析结果&#xff09; LDRA Testbed软件静态分析_软件质量度量 LDRA Testbed软件…

YOLOv10改进:CA注意力机制【注意力系列篇】(附详细的修改步骤,以及代码,目标检测效果优于SE和CBAM注意力)

YOLOv10改进&#xff1a;CA注意力机制【注意力系列篇】&#xff08;附详细的修改步骤&#xff0c;以及代码&#xff09; 如果实验环境尚未搭建成功&#xff0c;可以参考这篇文章 ->【YOLOv10超详细环境搭建以及模型训练&#xff08;GPU版本&#xff09;】 文章链接为&…

电脑pe是什么意思_电脑pe系统作用详细分析

有些小白很好奇&#xff0c;电脑pe是什么意思?所谓的电脑pe系统其实就是当我们的电脑出现问题而不能进入正常系统时候的一种“紧急备用”系统。如果需要重装操作系统的话&#xff0c;以往采用光盘使用的比较多&#xff0c;随着技术的进步&#xff0c;用u盘制作一个pe启动盘去安…

Kubernetes 系列 | k8s入门运维

目录 一、K8S集群搭建1.1 部署方式1.2 了解kubeadm1.3 部署流程1.3.1 初始化配置1.3.2 安装容器运行时1.3.3 安装K8S软件包1.3.4 创建集群 二、集群高可用1.1 集群高可用-堆叠1.2 集群高可用-集群外etcd 三、Pod运维3.1 Pod运维3.2 Pod的生命周期3.3 Pod状况3.4 Pod阶段3.5 容器…

【C++前缀和】3212. 统计 X 和 Y 频数相等的子矩阵数量|1672

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 LeetCode3212. 统计 X 和 Y 频数相等的子矩阵数量 难度分&#xff1a;1672 给你一个二维字符矩阵 grid&#xff0c;其中 grid[i][j] 可能是 ‘X’、‘Y’ 或 ‘.’&a…

中秋佳节,科技好礼献团圆!五款数码好物大推荐

中秋节的到来&#xff0c;总是让人充满了对团圆和美好生活的向往。在这个家人团聚、朋友欢聚的美好时刻&#xff0c;除了享受月饼和团圆饭&#xff0c;还可以通过一些先进的数码好物&#xff0c;提升节日的愉悦感和生活的舒适度。从提升运动体验的南卡Runner Pro5&#xff0c;到…

Windows系统 安装 Nacos

使用说明&#xff1a;安装 Nacos 服务端&#xff0c;以单机模式启动&#xff0c;不用集群。 一、下载Nacos Nacos Server 下载 | Nacos 官网 下载解压后&#xff1a; bin&#xff1a;启动脚本&#xff1b;conf&#xff1a;配置文件 这个文件可以修改端口、增加数据库连接等配…

从零到一:为未上架APP开通微信商户支付服务的步骤详解

随着移动支付的普及&#xff0c;微信商户支付已成为众多商家不可或缺的一部分。然而&#xff0c;对于某些仍处于开发阶段或特殊需求下的APP来说&#xff0c;它们可能尚未在应用商店上架&#xff0c;但仍需接入微信支付功能以满足用户需求。本文将为您提供一份详细的微信商户支付…

2024年印尼金融科技报告解读(1) | 印尼金融科技发展现状与挑战

概述 金融科技的创新正加速全球金融普及和经济增长&#xff0c;尤其在东南亚&#xff0c;其影响尤为显著。 印尼作为该区域的经济龙头&#xff0c;凭借其庞大的人口基数和独特的地理位置&#xff0c;对"非接触式"服务和中小企业融资的需求迅猛增长&#xff0c;成为数…

mp3和mp4区别是什么?音视频转换,用这2个工具就够了

在刷视频的时候&#xff0c;在看电影的时候&#xff0c;在听歌的时候……我们经常能听到“mp3”、“mp4”这两种格式的名字。它们是什么格式&#xff1f;mp3和mp4区别是什么&#xff1f;我们能做什么&#xff1f; mp3是一种流行的音频编码格式&#xff0c;以其高效的压缩算法著…

屏幕空间UV 警戒线

屏幕空间UV 警戒线 屏幕UV已经抗锯齿