关于这个效果的名称,我一直没找到一个比较正式的说法。Spring Bone这个说法是来自于Anima2D这个插件中的一个演示用的脚本,我直接译成弹簧骨骼。

一般常见于对人物的头发的模拟上。

当然也可以直接用在普通物体上

效果的实现是通过改变物体的旋转进行的。在LateUpdate执行代码。我们在脚本中保存上一帧的骨骼末端位置,当运行当前帧时,如AnimatorController之类的组件会在Update中将物体的旋转设置为指定值。我们在LateUpdate中,通过保存的上一帧的骨骼末端位置以及当前的旋转值,进行计算,得到一个类似的插值位置,然后转化为旋转值,将物体旋转到对应位置。

部分代码如下:

        currentTipPos = transform.TransformPoint(springEnd);currentTipPos = Vector3.Lerp(lastFrameTip, currentTipPos, Time.deltaTime);currentTipPos = springLength * (currentTipPos - transform.position).normalized + transform.position;    //clamp length.transform.rotation =Quaternion.FromToRotation(transform.TransformDirection(springEnd), (currentTipPos - transform.position).normalized)* transform.rotation;currentTipPos = springLength * (currentTipPos - transform.position).normalized + transform.position;    //clamp length.transform.rotation =Quaternion.FromToRotation(transform.TransformDirection(springEnd), (currentTipPos - transform.position).normalized)* transform.rotation;

这样的实现快速有效,但是最终效果仅仅是物体的运动变为慢慢靠近目标点,显得不够真实。

想要加入类似弹簧的效果,我们需要进行真实的力、速度的计算。我们保存当前的速度,根据位置计算当前受到的力,然后根据力修改速度,通过这个速度去修改目标位置。

        currentTipPos = transform.TransformPoint(springEnd);var force = bounciness * (currentTipPos - lastFrameTip);  //spring force.force += stiffness * (currentTipPos - transform.position).normalized;  //stiffnessforce -= dampness * velocity;               //damp force. velocity = velocity + force * Time.deltaTime;       //v = v0 + at. we don't need integration here, you won't notice any "wrong".currentTipPos = lastFrameTip + velocity * Time.deltaTime; //s = s0 + vtcurrentTipPos = springLength * (currentTipPos - transform.position).normalized + transform.position;    //clamp length.transform.rotation =Quaternion.FromToRotation(transform.TransformDirection(springEnd), (currentTipPos - transform.position).normalized)* transform.rotation;

我设置了3个力的选项,分别是bounciness弹性力,提供“归位“的力,力由当前骨骼末端指向归位时的骨骼末端,stiffness刚性力,提供保持原状的力,力方向往骨骼方向延长,以及dampbess阻力,沿着速度反方向。

通过设置三个力的大小,可以实现不同的效果。最终效果如文章开篇的图2

此外还有一个细节需要注意,骨骼更新的顺序应该严格的遵守从父物体的骨骼更新到子物体。不然可能会出现奇怪的情况。

github: https://github.com/yangrc1234/SpringBone

转载于:https://www.cnblogs.com/yangrouchuan/p/7650115.html

Unity下实现弹簧骨骼(Spring Bone)相关推荐

  1. unity给头发添加物理_Unity学习笔记 Vol.64 使用Spring Bone给角色添加头发效果

    摘要 在游戏中,让我们的角色拥有一头柔顺的秀发,可以使角色显得更加生动.在UnityChan模版我们可以从中借鉴Unity酱的飘逸的头发的实现方法.下面我们来具体研究一下. 实现方法 UnityCha ...

  2. Unity之SkinMeshRenderer带骨骼的人体模型换装

    Unity之SkinMeshRenderer带骨骼的人体模型换装 SkinMeshRenderer系统 条件 换装解决方案 第一种解决方案 第二种解决方案 方案选择 代码 效果 参考链接 SkinMe ...

  3. Unity下如何实现RTMP或RTSP流播放和录制

    技术背景 在探讨Unity平台RTMP或RTSP直播流数据播放和录制之前,我们先简单回顾下RTSP或RTMP直播流数据在Unity平台的播放流程: 通过Native RTSP或RTSP直播播放SDK回 ...

  4. unity下图灵机器人的使用

    unity下图灵机器人的使用 这里json的解析与建立使用的是LitJson.dll 一.机器人建立 首先到图灵机器人的官网http://www.tuling123.com/注册一个号并建立机器人(有 ...

  5. Unity下计步器Pedometer算法的实现

    Unity下计步器Pedometer的实现 1.环境 unity2018,Android(小米5) 2.原理 加速度传感器的计步算法Pedometer 3.实现 注释写的很清楚了应该 using Un ...

  6. Unity即将内置骨骼动画插件Anima2D

    Unity即将内置骨骼动画插件Anima2D Unity一直在寻找新的方法来帮助开发者,并为他们提供最好的工具.在此我们向大家宣布,Unity将内置流行的骨骼动画插件Anima2D,从2017年1月开 ...

  7. Unity下的UDP客户端

    Unity下简洁有效的UDP客户端 前言 代码 资源 其他 中文乱码问题 前言 本来就想从网上找一个Unity的UDP客户端,百度上试了好多教程,问题百出,让人气不打一处来. 就几行代码的事情,浪费时 ...

  8. 【Unity】用于Humanoid骨骼的扭曲矫正组件

    [Unity]用于Humanoid骨骼的扭曲矫正组件 组件已知限制: 可以在一定旋转范围内消除变形,不能无限度的消除变形: 不支持连续的两个扭曲矫正骨骼,如果需要,可以自行调整代码. 在Unity中, ...

  9. 动态骨骼Dynamic Bone优化

    Dynamic Bone是基于弹簧质点算法的弹性节点模拟组件,可以用于柔性绳索和其他的简单的柔体,上一篇我们已经详细的对于算法进行过研究,想回顾的可以到这里查看 上周主要在对原版代码进行优化以适应大规 ...

最新文章

  1. python 归一化 标准化
  2. Leetcode 92 反转链表 II (每日一题 20210726)
  3. 路径调度问题(CVRP)后续之如何在MATLAB中安装YALMIP及CPLEX包
  4. Hibernate反向生成映射文件点击Hibernate reserve Engineering的时候没反应的解决方法
  5. 28,29_激活函数与GPU加速、Tanh和sigmoid、ReLU、Leaky ReLU、SELU、Softplus、GPU accelerated、案例、argmax
  6. python删除字符串_Python3 - 删除字符串中不需要的字符
  7. 使用NPOI和委托做EXCEL导出
  8. 漫步最优化十八——点到集合的映射
  9. Web3.0网关Deeper Network计划于本月末在四个平台上进行IDO
  10. 40.广搜练习:洪水
  11. linux的boot可用fat格式吗,u-boot中的FAT命令
  12. 云优cms,云优cms程序系统,云优cms分站系统
  13. MT6573_android_LCD_backlight_Driver
  14. 《Excel高手捷径:一招鲜,吃遍天》一第18招 怎样在Excel中插入方框内打勾符号(√)和方框内打叉符号(×)...
  15. 京东数据分析工具推荐(京东第三方数据平台)
  16. JavaScript正则表达式匹配中英文以及常用标点符号白名单写法
  17. 实现一周之内自动登录的 cookie和session还有localStorage的存储机制
  18. dcs常用的冗余方式_一种DCS系统冗余网络设备电源配置的制作方法
  19. python 接口自动化unittest+DingtalkChatbot钉钉机器人消息封装
  20. 2018 Mac下pycharm 安装Django及创建app

热门文章

  1. html界面——button设置样式
  2. 今天开始学JAVA了!
  3. 怎样实现url隐形转发?
  4. CSMA/CD与CSMA/CA区别
  5. PASCAL VOC数据集 生成train.txt、test.txt、tainval.txt、val.txt
  6. html clear属性值,clear属性怎么用
  7. PIVOT和UNPIVOT使用详解
  8. iOS即时通讯之CocoaAsyncSocket源码解析一
  9. Win32 编程基础
  10. time_t、SYSTEMTIME、CTime、COleDateTime互转