Unity下实现弹簧骨骼(Spring Bone)
关于这个效果的名称,我一直没找到一个比较正式的说法。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; //stiffness
force -= 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 + vt
currentTipPos = 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
Unity下实现弹簧骨骼(Spring Bone)的更多相关文章
- Unity下的开发框架--适应web和微端游戏异步资源请求的框架
一. 内容简介: 1. 框架对Web与微端游戏特性的支持: Web和微端游戏最重要的特性是,资源是持续从服务器上即时下载下来的.而保证体验流畅的关键就是保证资源下载分散到持续的体验过程中,并保 ...
- Myeclipse下使用Maven搭建spring boot项目
开发环境:Myeclipse2017.JDK1.6.Tomcat 8.0.Myeclipse下使用Maven搭建spring boot项目,详细过程如下: 1. New -> Project.. ...
- Unity下XLua方案的各值类型GC优化深度剖析
转自:http://gad.qq.com/article/detail/25645 前言 Unity下的C#GC Alloc(下面简称gc)是个大问题,而嵌入一个动态类型的Lua后,它们之间的交互很容 ...
- eclipse下的,maven+spring+springMVC+mabatis+mysql.创建
环境:window系统,64位工具:eclipse:下载地址: 链接:http://pan.baidu.com/s/1hr73LE8 密码:vcsa tomcat: ...
- 下一个系列学习列表Spring.net+NHibernate+MVC
开源框架完美组合之Spring.NET + NHibernate + ASP.NET MVC + jQuery + easyUI 中英文双语言小型企业网站Demo 刘冬.NET 2011-08-19 ...
- [原] Unity下的ElectroServer的连接
ES的版本是5.4.1,示例目录下code_examples\ConnectAndLoginManually是Unity的连接和登录代码. 除了host和port需要指定,在连接时需要指定连接方式,如 ...
- 解决ubuntu unity下gvim菜单消失的问题
#问题描述:在终端下用gvim 指令打开 gvim就不显示菜单.在不启用unity的桌面环境下用终端打开gvim是有菜单的.从程序菜单中打开gvim是显示菜单的.用sudo打开gvim也可以显示菜单, ...
- unity下贴图混合(Texture Blending)
在unity制作自定义时,经常会遇到自定义妆容等问题,美术会提供大量的眉毛/胡子/腮红等贴图,来供用户选择. 美术给出的眉毛的小贴图如下: 在用户选用不同的胡子眉毛,可以将选定的小贴图和皮肤base贴 ...
- Unity下一轮最大的变革-Entity Component System & C# Jobs System
ECS+jobs实现的酷炫效果 新一代Entity Component System(ECS)将会彻底改变Unity的底层概念(GameObject-Component 系统)和现有工作方式.Mono ...
随机推荐
- 还原 listagg/wm_concat 后的数据 pack_split_listatt ;
1.创建表并制作测试数据: --创建测试表 : CREATE TABLE split_table ( NAME ), ID ) ); --准备测试数据 : INSERT INTO split_tabl ...
- 知识点总结:Linq和Lambda
基本语法: Linq:var result=from t in table order by sort ascending/descending select t: Lambda:var result ...
- delphi使用SQL的教程4(使用Params属性为参数赋值 )
17.4.1 使用Params属性为参数赋值 TQuery部件具有一个Params属性,它们在设计时不可用,在程序运行过程中可用,并且是动态建立的,当为TQuery部件编写动态SQL 语句时, D ...
- Android内存泄漏第二课--------(集合中对象没清理造成的内存泄漏 )
一.我们通常把一些对象的引用加入到了集合容器(比如ArrayList)中,当我们不需要该对象时,并没有把它的引用从集合中清理掉,这样这个集合就会越来越大.如果这个集合是static的话,那情况就更严重 ...
- 第206天:http协议终极详解---看这一篇就够了
HTTP简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送 ...
- 【EF】Entity Framework实现属性映射约定
Entity Framework Code First属性映射约定中“约定”一词,在原文版中为“Convention”,翻译成约定或许有些不好理解,这也是网上比较大多数的翻译,我们就当这是Entity ...
- 对Spark2.2.0文档的学习1-Cluster Mode Overview
Cluster Mode Overview Link:http://spark.apache.org/docs/2.2.0/cluster-overview.html Spark应用(Applicat ...
- Astronauts UVALive - 3713(2-SAT)
大白书例题 #include <iostream> #include <cstdio> #include <sstream> #include <cstrin ...
- 转:linux命令: tail ,head 显示文件某行内容 与sed在线编辑器
linux 如何显示一个文件的某几行(中间几行) 转:http://www.cnblogs.com/xianghang123/archive/2011/08/03/2125977.html http: ...
- linux内核分析 第二周 操作系统是如何工作的
银雪纯 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.计算机是如何工作的 ...