问题

问题的来源是我想导出一个布料的顶点动画,并让他循环播放。

但问题是,直接模拟出的结果不能保证在我想导出那一段的首帧与末帧一致,这样动画是不循环的,连续播放会看到明显的跳变。

我在这里找到了一种简单又直接的方法:

它的思路很简单:让最末几帧逐渐接近首帧(即逐渐插值到首帧)。
数学化表示的话,就是设定一个 过渡帧数,则:
当前帧到末尾的距离{⩾过渡帧数:原来的形状<过渡帧数:lerp(原来的形状,首帧形状,alpha)当前帧到末尾的距离 \begin{cases} \geqslant 过渡帧数: & 原来的形状\\ <过渡帧数: & lerp(原来的形状,首帧形状,alpha)\\ \end{cases} 当前帧到末尾的距离{⩾过渡帧数:<过渡帧数:​原来的形状lerp(原来的形状,首帧形状,alpha)​

其中:lerp 就是插值函数,alpha 是系数,其值为:
alpha=1.0−当前帧到末尾的距离过渡帧数alpha=1.0-\frac{当前帧到末尾的距离}{过渡帧数} alpha=1.0−过渡帧数当前帧到末尾的距离​

这样,可以保证末帧一定和首帧一样,而在末帧之前的过渡帧数内会逐渐接近首帧。

节点实现

首先,我创建了一个文件夹节点用来封装操作并暴露出接口:

其中 start 代表首帧,end 代表末帧,transition 代表过渡帧数。

在此节点内部,创建一个 Time Shift 节点,用来获取首帧的状态:

最后,就可以创建一个针对于Point的 Attribute Wrangle 节点用来做lerp运算了。

它的vex代码如下:

int transition = chi("../transition");//过渡帧数
int d = chi("../end") - @Frame;//当前帧到末尾的距离
float alpha = 1.0 - 1.0*d/transition;//插值系数
alpha = clamp(alpha,0,1);//夹定在0到1之间
@P = lerp(@P,@opinput1_P,alpha);

其中的@opinput1_P是个缩略的写法,即获取1号输入(即第二个引脚所连接的输入节点,这里是 shape_of_start)的P属性(即位置)。

效果

可以看到 90 帧与 130 帧的内容一样,循环播放是没有跳变的。

注意

  • 为了降低过渡的瑕疵,截取动画的部分本来就应该有循环的倾向。
  • “过渡帧数”的最佳值应该经过多次尝试判断出。

另外,这种简单的方法虽然比较直接,但是也有些粗暴。也许在比较复杂的场合中效果不会理想,之后如有机会可以做更多的尝试。

一种在Houdini中让顶点动画循环的简单方法相关推荐

  1. 小结两种在Python中导入C语言扩展库的方法

    小结两种在Python中导入C语言扩展库的方法 分类: Pythoner2009-08-18 20:44 2563人阅读 评论(1) 收藏 举报 python扩展c语言importstring 一种是 ...

  2. 两种在QGIS中制作高德铁路线型符号的方法

    1. 概述 恰当的地图符号除了可以直观地表达地图上的要素之外,还可以让地图看起来更加美观和更具有耐看性. 高德地图作为常用的地图之一,其许多的配色和样式方案值得我们在制图的时候参考,所以这里以铁路线型 ...

  3. 我的世界服务器自动被踢怎么可以进去,我的世界中国版服务器中如何解决玩家作弊的简单方法...

    原标题:我的世界中国版服务器中如何解决玩家作弊的简单方法 我的世界中国版,作弊是件可耻的行为,可能有很多玩家遇到了其他玩家在游戏中作弊,那么我们应该如何解决这个问题?今天就由超好玩小编来告诉大家我的世 ...

  4. Unity Shaders and Effects Cookbook (7-2) Surface Shader 中实现 顶点动画

    上一节中说了,在 Surface Shader 中,添加顶点函数,我们可以在 顶点函数中获取到 顶点数据,比如顶点颜色.顶点坐标等. 这一节学习获取顶点坐标,并且修改顶点坐标,来实现顶点动画. 简单介 ...

  5. 刚性仿射变换算法_一种视觉定位中的点集仿射变换算法的制作方法

    本发明涉及相机标定 技术领域: ,具体涉及一种视觉定位中的点集仿射变换算法. 背景技术: :随着工业自动化技术的推进,越来越多的产线工件组装.检测.测量等工作正在由机器人或自动化设备逐步替代,而这些技 ...

  6. 两种在CAD中加载在线卫星影像的方法

    概述 经常使用CAD的朋友应该会有这样的一个烦恼,就是当加载卫星图到CAD中进行绘图的时候,由于CAD本身的限制和电脑性能等原因,往往不能加载太大的地图图片到CAD内,这里给大家介绍两种在CAD内加载 ...

  7. Java中跳出多层循环的简单方法

    在Java程序中可能使用多层循环来处理复杂的逻辑.但如果要从最内层循环跳出最外层循环是比较麻烦.下面的代码是一个三层循环的例子: String[]arr=newString[]{"a&quo ...

  8. Unity Shader - 顶点动画 - Sin 模拟简单的波浪

    创建一个shader,贴下下面code 创建一个material,设置Shader:Custom/Wave 纹理百度随便下载一个水贴图,设置到meterial中的Tex,(不设置也可以,默认white ...

  9. 在mysql表中如何变换列和行_在SQL中转换列和行的简单方法?

    有几种方法可以转换这些数据.在你最初的帖子中,你说PIVOT对于这个场景来说似乎太复杂了,但是可以很容易地使用UNPIVOT和PIVOTSQL Server中的函数. 但是,如果您无法访问这些函数,则 ...

最新文章

  1. 解决GitHub加载和下载慢问题
  2. 神策数据保险行业解决方案,正式上线官网!
  3. devenv.exe启动版本
  4. SQL语句,统计一段时间内有多少个工作日
  5. git拉取分支报错:fatal:‘XXX' is not a commit and a branch ‘XXX' cannot be created from
  6. Educational Codeforces Round 73 (Rated for Div. 2)
  7. java学生奖学金管理系统_EasyUI+JavaWeb奖助学金管理系统[6]-登录功能实现
  8. 前端面试js-手写事件委托(一点小改进)
  9. QTP引用外部脚本路径的设定(二)left函数的使用
  10. 抖音下拉词推广是什么?
  11. python交互式程序设计导论第三周小测验答案,2020学堂云Python 交互式程序设计导论答案第五章节答案...
  12. Jenkins指定maven打包命令
  13. python实现GPS经纬度转换
  14. 如何利用matlab循环读取文件夹中的文件
  15. 【网易2017春招】赶去公司 解题报告
  16. 智能优化算法之灰狼优化算法(GWO)的实现(Python附源码)
  17. 解决华擎J3455主板DSM兼容性问题
  18. VS 2012 Dotfuscator and Analytics 'j8' 类型初始值设定项引发异常 解决方法
  19. 安全帽识别系统-智慧船舶的守夜人
  20. ftp登录工具,你所不知道的三款ftp登录工具

热门文章

  1. MATLAB入门实例——绘制伯德图
  2. Android 新手引导添加View的方法
  3. 软件开发测试男友花束,心理测试:4款花束,你最喜欢哪款?测出你最近最需要什么...
  4. SpringBoot实现zip文件下载
  5. QuickBooks qbo api transactionlist 获取数据不全的问题
  6. 《奇点来临》——镜子测试与认知
  7. iconfont阿里巴巴矢量图标库本地下载的使用
  8. 新突破!德国MPQ证实光子是量子比特载波的优选
  9. agv ti 毫米波雷达_自动驾驶之——毫米波雷达概述
  10. 计算机在英语写作中应用,信息化背景下计算机反馈技术在英语写作中应用.doc...