GDC2016: Animating With Math

Unity和UE4的Material Editor中都有类似VertexOffset的功能, 可以在VertexShader中驱动顶点, 做一些程序控制的顶点动画

用顶点动画的原因: 骨架是共享的, 骨骼动画是共享的等, 同时节省了骨骼数和动画师的工作量

使用cos三角函数+Time是基本的技巧, 配合顶点色控制每个部分的权重

材质参数暴露出来能够使用程序逻辑进行动态控制

顶点色的RGBA通道可以都用上, 进行不同的权重控制, 配合随时间变化的三角函数值, 可以做出蠕动的效果

其实水面的做法跟这个很类似

自从用了Unreal的MaterialEditor, 都懒得直接写Shader了

另外一个应用就是做头发的动画

同样的, 顶点红色通道可以控制移动动的权重

蓝色通道能够控制移动的时间

模型的运动也可以通过顶点色进行控制

甚至是面部的结节形状也可以通过顶点色进行微调

我觉得口型动画也可以这么做

必要时需要外部控制的材质参数进行配合

比如这个摆动的动画

只用顶点色是不够的

配合关键帧参数进行控制

其实除了摆动之外, 还可以实现旋转的效果

一些自转完全可以使用材质来实现, 免去了程序逻辑驱动或骨骼动画

举个例子

最后是用到的工具

时间: 2024-11-13 07:57:30

GDC2016: Animating With Math的相关文章

Unity3d 实现顶点动画

在今年GDC上发现一个非常有趣的演讲,叫做Animating With Math,遂实现之,是讲述顶点shader动画的,举了几个经典的例子,但是讲者并没有给代码,而是像虚幻引擎那样的节点,这样更加清楚明了之前博主通过顶点着色器实现了水的波动算法: unity3d 制造自己的水体water effect(二) 顶点着色器动画可以减少动画的开销,并减少关节joint的数量开始举的例子都很简单,可以着手一试   关于vertex color是自定义的一个贴图,会控制各种参数下面会说明接下来的例子是一

A Math Problem

A Math Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 237    Accepted Submission(s): 117 Problem Description You are given a positive integer n, please count how many positive integers

数组、Math、JOSN总结

json对象: 1.数组有length属性[尽量使用for循环] 2.而json没有length属性[可以使用for...in...循环] 3.for in 不能遍历页面中的节点对象. for ( var key in json4 ) { alert( key ); alert( json4[key] );}//使用方括号[]取键名,for和for in 可以相互嵌套. delete objName.key : [对象名.要删除的属性名] 在数据传输流程中,json是以文本,即字符串的形式传递的

常用工具类(System,Runtime,Date,Calendar,Math)

一.Sy 一个java.lang包中的静态工具类. 三大字段: static PrintStream err "标准"错误输出流. static InputStream in "标准"输入流. static PrintStream out "标准"输出流. 其他常用方法: 描述系统信息: 获取系统属性信息: static Properties getProperties(): (Properties是Hashtable的子类,也就是Map 的子类

JavaScript中的Math

//math() //Pl document.write(Math.PI+'<br>'); var math=10.1; var math1=10.9; //四舍五入round() document.write(Math.round(math)+'<br>'); //进一法  ceil document.write(Math.ceil(math)+"<br>"); //退一法  floor document.write(Math.floor(math

javascript类型系统——Math对象

× 目录 [1]常量 [2]函数 前面的话 javascript使用算术运算符实现基本的算术运算,如果要实现更加复杂的算术运算,需要通过Math对象定义的常量和函数来实现.和其他对象不同,Math只是一个静态对象,而并没有Math()构造函数.实际上,Math只是一个由Javascript设置的对象命名空间,用于存储数学常量和函数.本文将详细介绍Math对象 new Math();//Uncaught TypeError: Math is not a constructor 常量 Math对象一

LeetCode 50 Pow(x, n)(Math、Binary Search)(*)

翻译 实现pow(x, n). 原文 Implement pow(x, n). 分析 首先给大家推荐维基百科: zh.wikipedia.org/wiki/二元搜尋樹 en.wikipedia.org/wiki/Binary_search_tree 其次,大家也可以看看类似的一道题: LeetCode 69 Sqrt(x)(Math.Binary Search)(*) 然而这题我还是没有解出来,看看别人的解法-- class Solution { private: double myPowHel

Math类

java提供了基本的+,-,*,/算数运算符,同时也提供了更复杂的运算符,比如三角函数,对数元,指数运算 Math是一个工具类.它的构造器被定义为private,因此无法创建Math类的对象,Math类中的所有方法都是 类方法,可以直接通过类名来调用,Math除了提供了大量的静态方法,还提供了两个类变量PI和E public class MathTest{ public static void main(String[] args){ //将弧度转化成角度 System.out.println(

uva 1489 - Math teacher&#39;s homework(数位dp)

题目链接:uva 1489 - Math teacher's homework 题目大意:给定n,k,以及序列m1,m2,-,mn, 要求找到一个长度为n的序列,满足0<=xi<=mi, 并且x1XORx2XOR-XORxn=k 解题思路:数位dp,在网上看了别人的代码,高大上... 假设有二进制数 k : 00001xxxx mi:0001xxxxx, 那么对于xi即可以满足任意的x1XORx2XOR-XORxi?1XORxi+1XOR-XORxn,根据这一点进行数位dp. dp[i][j]