体感人偶控制优化——肌肉限制(一)_unity 肌肉限制 手部扭曲_草帽轩轩的博客-程序员秘密

技术标签: 体感  肌肉限制  人偶控制  

肌肉限制

使用了unity自带的 HumanPose 和 对应的控制类HumanPoseHandler:

HumanPose:

HumanPoseHandler:

如上图所示,两个类的结构都非常简单。后者通过玩家身上的Animator.avatar 和 玩家的Transform创建:

之后可以通GetHumanPose()方法获取当前avatar的HumanPose数据:

 

人偶控制中使用到的肌肉限制,根据名字就知道主要是要拿到HumanPose里的muscles数据。这个muscle数组是当前姿势下,人体各块肌肉的拉伸值,想要直观的感受这些值的作用可以在Unity编辑器中 选中人偶在Inspector中 点击Rig->Configure->Muscles & Setting 后看到,也可以在该页面下手动设置肌肉的最大值和最小值:

 

 

在代码中可以通过HumanTrait的静态方法 

GetMuscleDefaultMin(int i) // 获取序号为 i 的肌肉的最小默认值

GetMuscleDefaultaxn(int i) //获取序号为 i 的肌肉的最大默认值

 

通过HumanPose得到的muscles里面的值是基于范围值的程度值,例如项目里的具体限制值是 [-1,1],就把肌肉的拉伸值完全设置在合理范围内了。

根据sdk提供的世界坐标计算出来的骨骼旋转会有一些问题,导致关节会有被扭曲成麻花效果,这里加上肌肉限制,可以把肌肉的拉伸扭转等限制在一个较小的合理的范围内,有效的解决关节扭成麻花的问题。

 

项目中具体使用的代码示例:

 private void CheckMuscleLimits()
    {
        if (humanPoseHandler == null)
            return;

        humanPoseHandler.GetHumanPose(ref humanPose);

        bool isPoseChanged = false;

        float muscleMin = -1f;
        float muscleMax = 1f;

        for (int i = 0; i < humanPose.muscles.Length; i++)
        {
            if (float.IsNaN(humanPose.muscles[i]))
            {
                continue;
            }

            if (humanPose.muscles[i] < muscleMin)
            {
                humanPose.muscles[i] = muscleMin;
                isPoseChanged = true;
            }
            else if (humanPose.muscles[i] > muscleMax)
            {
                humanPose.muscles[i] = muscleMax;
                isPoseChanged = true;
            }
        }

        if (isPoseChanged)
        {
            Quaternion localBodyRot = Quaternion.Inverse(initialHipsRotation) * humanPose.bodyRotation;
            
            humanPose.bodyPosition = initialHipsPosition;
            humanPose.bodyRotation = localBodyRot; 

            humanPoseHandler.SetHumanPose(ref humanPose);
        }
    }

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u010407393/article/details/94552649

智能推荐

B1826 [JSOI2010]缓存交换 贪心+离散化+堆_Mr.Gu的博客-程序员秘密

这个题仔细一想可以直接贪心做,因为队列里下一个出现的早的一定最优。正确性显然。然后我只拿了50,我直接模拟另一个队列暴力修改最后一个点的nxt值,自然会T。但是其实不用修改,直接插入就行了前面的不影响后面的。然而只有80分,因为没有离散化。题干:Description在计算机中,CPU只能和高速缓存Cache直接交换数据。当所需的内存单元不在Cache中时,则需要从主存里把数据调入...

VLC(Video Lan Client)_videolanclient 官网_tramping的博客-程序员秘密

文章内容来自【http://www.rosoo.net/a/201103/10987.html】 一、简介    VLC的全名是Video Lan Client,是一个开源的、跨平台的视频播放器。VLC支持大量的音视频传输、封装和编码格式,完整的功能特性列表可以在这里获得http://www.videolan.org/vlc/features.html,下面给出一个简要的不完整的列表:

Spring.cloud.gateway default-filters_spring.cloud.gateway.default-filters_HiBoyljw的博客-程序员秘密

序本文主要研究下spring.cloud.gateway.default-filters配置 { &quot;sourceType&quot;: &quot;org.springframework.cloud.gateway.config.GatewayProperties&quot;, &quot;name&quot;: &quot;spring.cloud.gateway.default-filters&quot;, ...

接口默认方法是什么鬼 ​_什么是接口的默认方法_IT技术猿猴的博客-程序员秘密

接口之所以成为接口,就在于它没有实现,只是声明。但后来一切都变了,Java 里出现了默认方法,C# 也出现了默认方法。接口已经不像传统意义上的接口,其概念开始向抽象类靠近,一个纯抽象的东西,突然出现了实体,于是开始傻傻分不清了。世界已经变了,可他是怎么开始改变的呢?缘起虽然本文有提到 Java,但是笔者近年主要还是在写 C# 程序,所以未明确语言的命名规范会更倾向 C# 的规范一些,敬请谅...

mysql实验6答案_SQL 2008课后习题答案 实验6_验行客的博客-程序员秘密

SQL 2008课后习题答案1.建立索引&lt;1&gt;对YGGL数据库的Employees表中的DepartmentID列建立索引use YGGLgocreate index depart_indon Employees(DepartmentID)go&lt;2&gt;在Employees表的Name列和Address列上建立复合索引create index Ad_indon Employee...

破解google翻译接口_shykevin的博客-程序员秘密

一、网页分析打开谷歌翻译链接:https://translate.google.com/按F12,点击network。在左侧输入"who are you"可以看到,请求的链接为:https://translate.google.com/_/TranslateWebserverUi/data/batchexecute?rpcids=MkEWBc&amp;f.sid=-26090...

随便推点

读书笔记《Outlier Analysis》 第三章 异常检测的线性模型_傅华涛Fu的博客-程序员秘密

1.线性模型的基本介绍1.1 回归模型真实数据中的属性通常是相关的。这种依赖关系提供了相互预测属性的能力。如在正常情况下,一个人的身高和体重之间具有一定的相关性;房价和房屋面积的相关性;薪资和工龄之间的相关性等。预测和异常检测的概念是密切相关的。异常值通常是在特定模型的基础上偏离预期值(预测值)的值。线性模型侧重于使用属性间依赖关系来实现这一目标,这也叫回归模型。1.2 回归建模的两种形式回归建模是相关分析的一种参数化形式。 一些形式的相关分析试图从其他自变量预测因变...

[部署篇10]VMWare搭建Openstack——Cinder的安装与配置_chinagissoft的博客-程序员秘密

块存储 (Block Storage):Cinder。为运行实例提供稳定的数据块存储服务,它的插件驱动架构有利于块设备的创建和管理,如创建卷、删除卷,在实例上挂载和卸载卷。自Folsom版本集成到项目中。单独的说,假如我运行的虚拟化实例的硬盘不够了该怎么办?我们就可以使用Cinder来解决该问题。一、我们在控制节点安装块存储服务1. 约定:  Keystone使用MyS

富文本编辑器——百度UEditor插件安装教程_ueditor json插件_两只橙的博客-程序员秘密

一、使用环境Win7Eclipsejettty9chrome二、下载百度UEditor插件1、下载地址:http://ueditor.baidu.com/website/download.html2、这里下载的版本是[1.4.3.3 Jsp版本]3、将下载好的文件包放在工程目录中4、修改ueditor/ueditor.config.js 里的务器统一请求接口路径注:这个请求路径是请求服务器

C++之STL和Boost_c++ stl与boost_bingqingsuimeng的博客-程序员秘密

最近一年我电话面试了数十位 C++ 应聘者,惯用的暖场问题是“工作中使用过 STL 的哪些组件?使用过 Boost 的哪些组件?”。得到的答案大多集中在 vector、map 和 shared_ptr。如果对方是在校学生,我一般会问问 vector 或 map 的内部实现、各种操作的复杂度以及迭代器失效的可能场景。如果是有经验的程序员,我还会追问 shared_ptr 的线程安全性、循环引用的后果

每日一题 — 2020 - 04 - 08_清泠,的博客-程序员秘密

知识点:前缀和前后和的题好久没做了,其实昨晚大体知道这题怎么写了,但是不知道为啥最近懒得想题,愁人,还是要多做做题(多想)。解题思路:首先我们可以发现规律,就是往前移动,那么当前位置的数(要移动的数)的前 k 个数都会自增一倍然后当前移动的数,他减小了 k 倍所以我们最初处理下前缀和和一开始的总值即可这里需要注意的是:他是必须移动的,就是不能把最初的值作为一个初始值代码:...

单纯形法和对偶单纯形法_对偶单纯形法和单纯形法的区别_Andy Dennis的博客-程序员秘密

前言我在学习这个知识点的时候,花了不少时间,苦于网上的教程要么和老师描述的方法不一致(当然应该也可以),要么不全,所以当时在做作业题的时候,花了不少时间(&gt;10hours)。因此想写一篇博文来清晰的记录这两种方法的用法。单纯形法1. 停止条件当检验数Ci - Zi 这一行的数都小于0时, 可以停止。2. 选择主元标准我总结了一个小技巧: 先选检验数 Ci-Zi 那一行最大的。然后再选择 b / ai (ai &gt; 0)最小的。这里的ai的意思呢,大家看下面这个例子哈。我们先看

推荐文章

热门文章

相关标签