Unity—反向动力学IK

2023-11-16

每日一句:人生最精彩的不是实现梦想的瞬间,而是坚持梦想的过程

目录

定义:

准备:

API:

设置IK

头部IK——设置人物的头部根据视角旋转

手脚IK

案例:脚步IK


定义:

一般来说,骨骼动画都是传统的从父节点到子节点的带动方式(即正向动力学),IK则倒过来,由骨骼子节点带动骨骼父节点。

根据骨骼的终节点来推算其他父节点的位置的一种方式

比如人物走路踩到了石头,就需要由脚的子节点带动全身骨骼做出踩到石头的响应。

准备:

·Model的Aniamtion Type设置为Humanoid

·检测Avatar是否异常

·Animator勾选Ik Pass

API:

OnAnimatorIK(int layeIndex)设置动画IK的回调layeIndex:调用反向动力学解锁器的层的索引;对应Layer的序号,每个勾选了IKPass的layer调用一次

AvatarIKGoal反向动力学目标[枚举类型].LeftFoot左脚/RightFoot右脚/LeftHand左手/RightHand右手

SetIKPositionWeight(AvatarIKGoal goal,float value)设置反向动力学目标的转换权重

SetIKPosition(AvatarIKGoal goal,Vector3 goalPosition)设置反向动力学目标的位置

SetLookAtPosition(Vector3 lookAtPosition)执行LookAt的位置

public Vector3 bodyPosition;身体质心的位置

public Quaternion bodyRotation;身体质心的旋转

(只应在OnAnimatorIK()函数调用中设置该值)

设置IK

头部IK——设置人物的头部根据视角旋转

用到两个API  

SetLookAtPosition  

SertLookAtWeight用来设置IK的权重,IK会和原来的动画进行混合。如果权重为1,则完全用IK的位置和旋转,如果权重为0,则完全用原来动画中的位置和旋转

void OnAnimatorIK(int layerIndex)

{

ani.SetLookAtPosition(pos);

ani.SetLookAtWeight(1);

}

手脚IK

SetIkPosition(AvatarIKGoal goal,Vector3 goalPosition);Ik目标位置

SetIKRotation(AvatarIKGoal goal,Quaternion goalRoattion);IK目标旋转

设置权重的API

SetIKPositionWeight(AvatarIKGoal goal,float value);

SetIKRotationWeight(AvatarIKGoal goal,float value);

常见的手部IK代码

void OnAnimatorIK(int layerIndex)

{

ani.SetIKPosition(AvatarIKGoal.LeftHand,position);

ani.SetIKPositionWeight(AvatarIKGoal.LeftHand,1);

ani.SetIKRotation(AvatarIKGoal.LeftHand,rotation);

ani.SetIKRotationWeight(AvatarIKGoal.LeftHand,1);

}

案例:脚步IK

private Animator theAnimator;

    private Vector3 leftFootIK, rightFootIK;//射线检测需要的IK位置

    private Vector3 leftFootPosition, rightFootPosition;//Ik位置赋值

    private Quaternion leftFootRotation, rightFootRotation;//IK旋转赋值

    [SerializeField]private LayerMask ikLayer;//射线可以检测到的层

    [SerializeField] [Range(0, 0.2f)] private float rayHitOffset;//射线检测位置与IK位置的偏移

    [SerializeField] private float rayCastDistance;//射线检测距离

    [SerializeField] private bool enableIK = true;//是否启用IK

    [SerializeField] private float ikSphereRadius = 0.05f;

    [SerializeField] private float positionSphereRadius = 0.05f;

    private void Awake()

    {

        theAnimator = this.gameObject.GetComponent<Animator>();

        leftFootIK = theAnimator.GetIKPosition(AvatarIKGoal.LeftFoot);

        rightFootIK = theAnimator.GetIKPosition(AvatarIKGoal.RightFoot);

    }

    private void OnAnimatorIK(int layerIndex)

    {

        leftFootIK = theAnimator.GetIKPosition(AvatarIKGoal.LeftFoot);

        rightFootIK = theAnimator.GetIKPosition(AvatarIKGoal.RightFoot);

        if (!enableIK)

        {

            return;

        }

        //设置IK权重

        theAnimator.SetIKPositionWeight(AvatarIKGoal.LeftFoot, theAnimator.GetFloat("LIK"));

        theAnimator.SetIKRotationWeight(AvatarIKGoal.LeftFoot, theAnimator.GetFloat("LIK"));

        theAnimator.SetIKPositionWeight(AvatarIKGoal.RightFoot, theAnimator.GetFloat("RIK"));

        theAnimator.SetIKRotationWeight(AvatarIKGoal.RightFoot, theAnimator.GetFloat("RIK"));

因为权重是1,动画为跑时,脚的动画将被IK完全影响

因此可以创建一条动画曲线,为其添加关键帧,去控制IK的值

当脚与地面完全贴合时,IK权重为1,离开地面时,IK权重为0

在Animator中创建一个和动画曲线名称一样的参数,它会在动画播放时自动获取对应曲线的值,之后在代码中修改权重

 

        //设置IK位置和旋转值

        theAnimator.SetIKPosition(AvatarIKGoal.LeftFoot, leftFootPosition);

        theAnimator.SetIKRotation(AvatarIKGoal.LeftFoot, leftFootRotation);

        theAnimator.SetIKPosition(AvatarIKGoal.RightFoot, rightFootPosition);

        theAnimator.SetIKRotation(AvatarIKGoal.RightFoot, rightFootRotation);

    }

    // Update is called once per frame

    void Update()

    {

        Debug.DrawLine(leftFootIK + (Vector3.up * 0.5f), leftFootIK + Vector3.down * rayCastDistance, Color.blue, Time.deltaTime);

        Debug.DrawLine(rightFootIK + (Vector3.up * 0.5f), rightFootIK + Vector3.down * rayCastDistance, Color.blue, Time.deltaTime);

        if(Physics.Raycast(leftFootIK+(Vector3.up*0.5f),Vector3.down,out RaycastHit hit,rayCastDistance+1,ikLayer))

        {

            Debug.DrawRay(hit.point, hit.normal, Color.red, Time.deltaTime);

            leftFootPosition = hit.point + Vector3.up * rayHitOffset;

            leftFootRotation = Quaternion.FromToRotation(Vector3.up, hit.normal) * transform.rotation;

        }

    //当检测到指定层物体时,返回碰撞点的各种信息,脚步的旋转值与返回的法线信息有关

     if (Physics.Raycast(rightFootIK + (Vector3.up * 0.5f), Vector3.down, out RaycastHit hit_, rayCastDistance + 1, ikLayer))

        {

            Debug.DrawRay(hit_.point, hit_.normal, Color.red, Time.deltaTime);

            rightFootPosition = hit_.point + Vector3.up * rayHitOffset;

            rightFootRotation = Quaternion.FromToRotation(Vector3.up, hit_.normal) * transform.rotation;

        }

    }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity—反向动力学IK 的相关文章

  • 为什么存在 async 关键字

    浏览 msdn 9 频道视频时 我发现以下未答复的评论 希望有人能解释一下 我不明白 async 关键字的意义 为什么不直接允许 任何时候方法返回任务时都会使用await关键字 就像迭代器一样 可以在任何返回 IEnumerable 的方法
  • 如何使用 zlib 制作 .zip 文件

    我正在阅读zlib的文档 它相当详细 但我读到了这一行 输出数据将位于zlib格式 与 gzip 或zip formats http www zlib net zlib how html http www zlib net zlib how
  • 为什么Apache MPM prefork.c 使用互斥体来保护accept()?

    我坐下来读书Apache 的 MPM prefork c http code metager de source xref apache httpd server mpm prefork prefork c这段代码使用了一个名为accept
  • 从 C 结构生成 C# 结构

    我有几十个 C 结构 我需要在 C 中使用它们 典型的 C 结构如下所示 typedef struct UM EVENT ULONG32 Id ULONG32 Orgin ULONG32 OperationType ULONG32 Size
  • 如何创建用于 QML 的通用对象模型?

    我想知道是否有任何宏或方法如何将 Qt 模型注册为 QObject 的属性 例如 我有AnimalModel http doc qt io qt 5 qtquick modelviewsdata cppmodels html qabstra
  • SFINAE 如何使用省略号?

    过去 当使用 SFINAE 选择构造函数重载时 我通常使用以下内容 template
  • 如何使用MySqlCommand和prepare语句进行多行插入?(#C)

    Mysql 给出了如何使用准备语句和 NET 插入行的示例 http dev mysql com doc refman 5 5 en connector net programming prepared html http dev mysq
  • HttpWebRequest vs Webclient(特殊场景)

    我知道这个问题之前已经回答过thread https stackoverflow com questions 1694388 webclient vs httpwebrequest httpwebresponse 但我似乎找不到详细信息 在
  • 两种类型的回发事件

    1 我发现了两篇文章 每篇文章对两种类型的回发事件的分类都略有不同 一位资源说两种类型的回发事件是Changed事件 其中控件实现 IPostbackDataHandler 当数据在回发之间更改时触发 然后Raised事件 其中控件实现 I
  • C# 中的常量和只读? [复制]

    这个问题在这里已经有答案了 可能的重复 const 和 readonly 之间有什么区别 https stackoverflow com questions 55984 what is the difference between cons
  • tabcontrol selectedindex 更改事件未被触发 C#

    嘿伙计们 我有一个很小的问题 请参阅下面的代码 this is main load private void Form1 Load object sender EventArgs e tabAddRemoveOperator Selecte
  • 二叉树中的 BFS

    我正在尝试编写二叉树中广度优先搜索的代码 我已将所有数据存储在队列中 但我不知道如何访问所有节点并消耗它们的所有子节点 这是我的 C 代码 void breadthFirstSearch btree bt queue q if bt NUL
  • 为什么要在 C++ 中使用 typedef?

    可以说我有 set
  • 使用 mingw32 在 Windows 上构建 glew 时“DllMainCRTStartup@12”的多个定义

    我关注了这个主题 使用 mingw 使建筑物在 Windows 上闪闪发光 https stackoverflow com questions 6005076 building glew on windows with mingw 6005
  • 0-1背包算法

    以下 0 1 背包问题是否可解 浮动 正值和 浮动 权重 可以是正数或负数 背包的 浮动 容量 gt 0 我平均有 这是一个相对简单的二进制程序 我建议用蛮力进行修剪 如果任何时候你超过了允许的重量 你不需要尝试其他物品的组合 你可以丢弃整
  • 使用 HTMLAgilityPack 从节点的子节点中选择所有

    我有以下代码用于获取 html 页面 将网址设置为绝对 然后将链接设置为 rel nofollow 并在新窗口 选项卡中打开 我的问题是关于将属性添加到 a s string url http www mysite com string s
  • 在 C++17 中使用 成员的链接错误

    我在 Ubuntu 16 04 上使用 gcc 7 2 并且需要使用 C 17 中的新文件系统库 尽管确实有一个名为experimental filesystem的库 但我无法使用它的任何成员 例如 当我尝试编译此文件时 include
  • 受限 AppDomain 中的代码访问安全异常

    Goal 我需要在权限非常有限的 AppDomain 中运行一些代码 它不应该访问任何花哨或不安全的内容 except对于我在其他地方定义的一些辅助方法 我做了什么 我正在创建一个具有所需基本权限的沙箱 AppDomain 并创建一个运行代
  • 在 Xamarin 中获取 OutOfMemoryException

    java lang OutOfMemoryError 考虑增加 JavaMaximumHeapSize Java 执行时内存不足 java exe 我的 Visualstudio Xamarin 项目出现内存不足异常 请帮助我如何解决此问题
  • 带有私有设置器的 EFCore Base 实体模型属性 - 迁移奇怪的行为

    实体模型继承的类内的私有设置器似乎会导致 EFCore 迁移出现奇怪的问题 考虑以下示例 其中有多个类 Bar and Baz 继承自Foo 跑步时Add Migration多次命令 添加 删除private修饰符 生成的模式在多个方面都是

随机推荐

  • 【华为OD统一考试B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • 解决pip更新问题.WARNING: You are using pip version 19.2.3, however version 20.2.1 is available.

    一开始遇到这个问题在网上找了很多发现解决不了问题的根本 一开始我以为是网络的问题 后来一直是这样 然后有大佬告诉我你可能python版本太高了 他说卸载了换3 7的 3 8的很多功能都用不了 不过这样是很麻烦的 因为之前也安装了一些库 如果
  • 云服务器上Wamp搭建网站

    说明 想要在云服务器搭建网站 且需要被外网访问浏览的苦逼程序员可以参考本文 前提是你已经购买好了服务器以及公网IP 近一个月买了3次服务器 使用wamp搭建了3次网站了 本以为最后一次会轻车熟路 但是东搞西搞还是花了1个多小时 看来还是要把
  • (附源码)python+mysql+基于协同过滤算法的书籍推荐 毕业设计101555

    摘 要 21世纪的今天 随着社会的不断发展与进步 人们对于信息科学化的认识 已由低层次向高层次发展 由原来的感性认识向理性认识提高 管理工作的重要性已逐渐被人们所认识 科学化的管理 使信息存储达到准确 快速 完善 并能提高工作管理效率 促进
  • “晓白”学python-科普篇(3)-那些和python相关的岗位之python-web开发工程师

    老袁啊 python有这么广泛的应用 那我学好python能不能找到一份和python相关的工作呢 晓白问道 老袁听了回答道 你这个问题太笼统了 实际上你想问的是两个问题 一个就是那个工作岗位和python是相关的 第二个就是这些工作岗位对
  • nginx 正向代理 配置 http 和 https

    nginx 正向代理 配置 http 和 https 应用场景 同学A 所在公司对外网有所限制 借助云服务器nginx正向代理 实现正常浏览公网资料 服务端 云服务器 安装nginx cd usr local wget http nginx
  • Vue3内置组件teleport详解

    teleport的作用 该组件可以将指定内容渲染到特定容器中 而不受 DOM 层级的限制应用场景 当蒙层内容在一个组件中时 蒙层内容是无法遮挡住全部内容的 因此 需要使用teleport将蒙层内容渲染到更全局的组件中 如果不使用telepo
  • python入门(二)——数据类型

    目录 一 数字类型 二 字符串 例题1 凯撒密码 例题2 星号三角形 三 time模块 人家说合格的程序员要养成经常写博客的习惯 嗯 我正在培养中 日积月累 希望自己能坚持下去 一 数字类型 1 整数 与往常的C C 等语言的不同是 pyt
  • python为什么没有指针_Python的指针:有什么意义?

    Python部落 python freelycode com 组织翻译 禁止转载 欢迎转发 目录为什么Python没有指针 Python中的对象 不可变对象和可变对象 了解变量C的变量 Python的名称 关于Python的预实现对象的注释
  • slect( )、poll( )、epoll( )函数详解

    1 slect 函数 1 1 函数原型 include
  • QT 手动建立 带参数的信号槽

    在QT中 如果直接使用UI 在控件上点击槽函数自动建立信号槽及槽函数是非常方便的 但是 有时候 我们会采用全代码 动态建立窗口和控件 这个时候就需要手动方式来建立控件的槽函数 方法如下 1 首先在window h头文件中添加 public
  • Java中多态的实现机制

    多态性是面向对象程序设计代码重用的一个重要机制 我们曾不只一次的提到Java多态性 在Java运行时多态性 继承和接口的实现一文中 我们曾详细介绍了Java实现运行时多态性的动态方法调度 今天我们再次深入Java核心 一起学习Java中多态
  • JavaScript 错误处理

    错误处理 一 What 什么是错误处理 错误是指导致系统不能按照用户意图工作的一切原因 事件 在程序设计过程中 由于某些错误的存在 致使程序无法正常运行 处理这些错误以使程序正确运行就称为错误处理 错误处理功能是衡量编译器性能的重要方面 它
  • elasticsearch 出现 cluster_block_exception read_only_allow_delete问题

    做爬虫的时候 只是简单的存入elasticsearch中 在测试服务器上结果发现老是插入不进去 提示的错误 logstash outputs elasticsearch retrying failed action with respons
  • java数组经典题目:数3退1;每数到3就退出一个人,求最后剩下一个人的编号;

    import java util Arrays public class Tes public static void main String args 数3退1 每数到3就退出一个人 求最后剩下一个人的下标 boolean people
  • 竞赛:STL之vector用法详解(关于vector这一篇就够了!)

    目录 前言 一 什么是vector 二 vector常见的函数 1 函数说明表 2 vector的存储和遍历 构造vector的四种方法 3 vector的插入 删除 insert的几种形式 erase的用法 4 begin函数和front
  • 【目标检测】Fast R-CNN详解

    前言 Fast R CNN是作者Ross Girshick继R CNN后的又一力作 同样使用VGG16作为网络的骨架 在训练速度比R CNN快了近9倍 测试速度快了213倍 在Pascal VOC数据集上accuracy从62 提升至66
  • Java8中Map的遍历方式总结

    public class LambdaMap private Map
  • 核方法计算

    什么是核方法 往简单里说 核方法是将一个低维的线性不可分的数据映射到一个高维的空间 并期望映射后的数据在高维空间里是线性可分的 我们以异或数据集为例 在二维空间中 异或数据集是线性不可分的 但是通过将其映射到三维空间 我们可以非常简单地让其
  • Unity—反向动力学IK

    每日一句 人生最精彩的不是实现梦想的瞬间 而是坚持梦想的过程 目录 定义 准备 API 设置IK 头部IK 设置人物的头部根据视角旋转 手脚IK 案例 脚步IK 定义 一般来说 骨骼动画都是传统的从父节点到子节点的带动方式 即正向动力学 I