AutoHand第三人称的AutoHandVRIK开启和关闭

news2024/11/24 15:03:48

第三人称结构

第三人称在AutoHandVRIK脚本初始化完毕后,会出把两只手提到玩家对象根部对象上,并且在原始的模型手的位置创建了新的对象(leftHandFollowTarget,rightHandFollowTarget),副VRIK大概用途就是IK中间过渡。大概如图下面的样子。
female01大概是我的人物,Hidden IK Copy就是副VRIK。

在这里插入图片描述
因为工作需要关闭和打开IK,所以这里要处理IK和手部有时要随动画摆动。
可以这样来处理

关闭角色IK

需要把手部的当前追踪follow改为AutoHandVRIK脚本leftHandFollowTarget和rightHandFollowTarget(也就是原始模型手原来的Transform位置),并且把主VRIK和副VRIK的Weight通过渐变函数改为0,这里改副VRIK的原因是启用IK的时候希望副手的位置也在当前原始点。

打开角色IK

把手部的follow换回原始的副VRIK的手部位置(这个是AutoHandVRIK在初始化时候处理的,所以我们按照他的思路来)。然后再把VRIK的Weight渐变为1就可以了。因为主VRIK的手是副VRIK的手,所以我们可以直接把正手直接改为1,渐变为1可能出现扯皮问题。

大致脚本如下:

namespace Autohand {
    [DefaultExecutionOrder(-5), RequireComponent(typeof(VRIK))]
    public class AutoHandVRIK : MonoBehaviour 
    {
    	//...这里省略原始代码..
		//最后添加保存原来手的目标
	    private Transform handLeftTarget;   //左手原来的目标
        private Transform handRightTarget;  

		void SetupIKCopy() {
		{
			//...这里省略原始代码..
		    //最后添加保存原来手的目标
            handRightTarget = rightHand.follow;
            handLeftTarget = leftHand.follow;
		}

		
        public bool IKIsEnable = true;
        float nowLerp;
        float lerpspeed = 1f;
        [ContextMenu("EnableIK")]
        public void EnableIK()
        {
            IKIsEnable = true;
            
            //打开的时候,要跟着头显手位置
            nowLerp = visibleIK.solver.GetIKPositionWeight();
            leftHand.SetHandTarget(handLeftTarget);
            rightHand.SetHandTarget(handRightTarget);

            if (checkIKSwitch != null)
            {
                StopCoroutine(checkIKSwitch);
                checkIKSwitch = null;
            }
            checkIKSwitch = StartCoroutine(IKChange(true));
        }

        [ContextMenu("DisableIK")]
        public void DisableIK() 
        {
            //关闭IK,需要吧isCopy的比重放到拉到最低
            
            IKIsEnable = false;
            //关闭的时候要跟着手。

            nowLerp = visibleIK.solver.GetIKPositionWeight();
            leftHand.SetHandTarget(leftHandFollowTarget);
            rightHand.SetHandTarget(rightHandFollowTarget);

            if (checkIKSwitch != null)
            {
                StopCoroutine(checkIKSwitch);
                checkIKSwitch = null;
            }
            checkIKSwitch = StartCoroutine(IKChange(false));
        }
        Coroutine checkIKSwitch;

        IEnumerator IKChange(bool switchopen)
        {
            yield return 0;
            
            while (true)
            {
                yield return 0;
                if (switchopen)
                {
                    //如果是打开IK,那么需要插值到1.最终要跟随手部设置的
                    nowLerp = Mathf.Lerp(nowLerp, 1.5f, Time.deltaTime * lerpspeed);
                    visibleIK.solver.SetIKPositionWeight(1f);
                    invisibleIK.solver.SetIKPositionWeight(nowLerp);
                    if (nowLerp > 1f)
                    {
                        break;
                    }
                }
                else
                {
                    //如果关闭IK,显示动作,那么手跟踪原始位置
                    nowLerp = Mathf.Lerp(nowLerp, -0.5f, Time.deltaTime * lerpspeed);
                    visibleIK.solver.SetIKPositionWeight(nowLerp);  
                    invisibleIK.solver.SetIKPositionWeight(nowLerp);
                    
                    if (nowLerp < 0f)
                    {
                        break;
                    }
                }
            }
        }

这样就可以直接切换了。

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

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

相关文章

从字母百分比看字符串处理的奥妙

本篇博客会讲解力扣“2278. 字母在字符串中的百分比”的解题思路&#xff0c;这是题目链接。 本题的思路是&#xff0c;统计字符letter在字符串s中出现的次数cnt&#xff0c;以及字符串s的长度n&#xff0c;其中n也可以使用strlen来求。最终要求计算的百分比是cnt*100/n。 int…

性能测试工具LoadRunne函数如何使用详解(上)

性能测试工具LoadRunner是软件测试行业主流测试工具&#xff0c;也是软件测试实验室在申请CNAS/CMA资质、测试质量体系建设一定会用到的一款软件测试工具。LoadRunner的函数是是组成测试脚本的最小单元&#xff0c;它真实模拟 一个个请求操作&#xff0c;并接收返回结果。学习L…

王道考研数据结构——顺序表

08 线性表的基本概念 对参数的修改结果需要“带回来”就使用引用类型的参数 顺序表的定义&#xff1a; 顺序存储、链式存储 sizeof(int)、sizeof(MyStruct) 顺序表的扩展 虽然大小改变&#xff0c;但是时间开销大 让代码健壮&#xff1a;对数据操作的合法性进行检查&#xf…

How to Write and Publish a Scientific Paper-How to Prepare Effective Graphs

How to Prepare Effective Graphs WHEN NOT TO USE GRAPHS 在上一章中&#xff0c;我们讨论了某些不应该制成表格的数据类型。它们也不应该被转换成图表。基本上&#xff0c;图表都是图形表格。 要点是这样的。某些类型的数据&#xff0c;特别是稀疏类型或单调重复的类型&am…

细节决定成败,聊聊JS的类型(下)

讲完了基本类型&#xff0c;我们来介绍一个现象&#xff1a;类型转换。 因为 JS 是弱类型语言&#xff0c;所以类型转换发生非常频繁&#xff0c;大部分我们熟悉的运算都会先进行类型转换。大部分类型转换符合人类的直觉&#xff0c;但是如果我们不去理解类型转换的严格定义&a…

牛客练习赛113

A小红的基环树 题目描述 定义基环树为n个节点、n条边的、没有自环和重边的无向连通图。 定义一个图的直径是任意两点最短路的最大值。 小红想知道&#xff0c;n个节点构成的所有基环树中&#xff0c;最小的直径是多少&#xff1f; 思路分析 特判n3时为1&#xff0c;其他时候都…

行业追踪,2023-07-11,新增加 rps50 排名,汽车零部件回落 10 日均线,直接反弹

自动复盘 2023-07-11 成交额超过 100 亿 排名靠前&#xff0c;macd柱由绿转红 成交量要大于均线 有必要给每个行业加一个上级的归类&#xff0c;这样更能体现主流方向 rps 有时候比较滞后&#xff0c;但不少是欲杨先抑&#xff0c; 应该持续跟踪&#xff0c;等 macd 反转时参与…

Stable Diffusion - 提示词翻译插件 sd-webui-prompt-all-in-one

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/131649921 sd-webui-prompt-all-in-one 是一个基于 stable-diffusion-webui 的扩展&#xff0c;目的是提高 提示词/反向提示词 输入框的使用体验&…

汽车应用级MS35774/MS35774A低噪声 256 细分微步进电机驱动

MS35774/MS35774A 是一款高精度、低噪声的两相步进 电机驱动芯片&#xff0c;芯片内置功率MOSFET &#xff0c;长时间工作的平均电 流可以达到 1.4A &#xff0c;峰值电流 2A 。芯片集成了过温保护、欠压 保护、过流保护、短地保护、短电源保护功能。 主要特点 ◼ 2 相步进…

【python】Excel文件的插入操作

上篇文章写了pandas读取Excel文件的操作&#xff0c;但实际应用中&#xff0c;我们还需要对Excel指定单元格进行写入操作。 pandas模块写入 pandas模块方法写入&#xff0c;简单粗暴&#xff0c;就是把整个Excel文件重写 import pandas as pdfile_path 测试用例.xlsx # 读取Ex…

【Java基础】符号位、原码、补码、反码、位逻辑运算符、位移运算符、复合位赋值运算符

文章目录 前言&#xff1a;符号位、原码、补码、反码1.是什么2.各种码转换 一.二进制高低位1.1.什么是高低位1.2.高低位交换 二.位逻辑运算符位与运算 &位或运算 |异或运算 ^取反运算 ~ 三.位移运算符左位移运算符 <<右位移运算符 >>1.正数右移&#xff1a;2.负…

什么是QPS,什么是RT

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;什么是QPS&#xff0c;什么是RT ✅创作者&#xff1a;林在闪闪发光 ⏰预计时间&#xff1a;30分钟 &#x1f389;个人主页&#xff1a;林在闪闪发光的个人主页 &#x1f341;林在闪闪发光的个人社区&#xff0c;欢迎你的加…

生产慢查询问题分析

1.问题描述 7月1日零点set_24出现大量慢查询告警&#xff0c;经DBA定位为子系统涉及的一条查询语句出现慢查询&#xff0c;引起set_24的cpu使用率突增&#xff0c;触发大量告警&#xff0c;查看生产执行计划发现慢查询为索引跳变引起&#xff1b;具体出现问题的sql语句如下&am…

【裸机开发】I2C 通信接口(三)—— I2C 底层驱动接口实现

目录 一、I2C 初始化 二、产生开始 / 停止信号 1、开始信号 2、重复开始信号 3、停止信号 三、向总线上发送数据&#xff08;阻塞模式&#xff09; 四、从总线上读取数据&#xff08;阻塞模式&#xff09; 五、整合&#xff1a;数据读写统一调用接口 一、I2C 初始化 初…

springboot驾校管理系统

框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9 …

springboot+dynamic-datasource实现多数据源动态切换,非@DS注解方式

springbootdynamic-datasource实现多数据源动态切换&#xff0c;非注解 一、前言二、方案思路三、代码实现 一、前言 最近在分析SaaS平台多租户的功能&#xff0c;必然涉及数据库部分的功能&#xff0c;多租户的设计方案要考虑租户隔离数据和租户共享数据&#xff0c;共享数据…

concrt140.dll怎么修复?哪种修复方法更值得推荐

运行软件的时候&#xff0c;计算提示找不到concrt140.dll&#xff0c;第一次遇到的小伙伴肯定不知道是什么意思。concrt140.dll是Microsoft Visual C Redistributable for Visual Studio 2015的一部分。它是一个动态链接库文件&#xff0c;包含在Windows操作系统中。这个文件主…

【Python】瓶装液位检测系统

文章目录 概要效果图整体架构流程技术细节 概要 本代码是一个简单的GUI应用程序&#xff0c;用于瓶装液位检测系统。 效果图 整体架构流程 整体架构流程如下&#xff1a; 创建GUI窗口和必要的部件&#xff1a; 创建一个主窗口&#xff08;root&#xff09;作为GUI应用程序的…

分享一套开源充电桩云平台(v2.5.1)-- 支持二轮(电动自行车)、四轮(电动汽车)

开源充电桩云平台&#xff08;v2.5.1&#xff09; 支持二轮(电动自行车)、四轮(电动汽车) 后台体验地址 二轮后台体验地址&#xff0c;star star &#xff1a; 点我访问 四轮后台体验地址&#xff0c;star star &#xff1a; 点我访问 用户端二维码 公众号二维码 小程序二维…

攻防世界-WEB2

代码审计 首先进行代码审计 <?php $miwen"a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";function encode($str){$_ostrrev($str);// echo $_o;for($_00;$_0<strlen($_o);$_0){$_csubstr($_o,$_0,1);$__ord($_c)1;$_cchr($__);$_$_.$_c; …