Houdini学习 —— 使用音频驱动几何体变换之信号处理
2017-06-14 21:12
381 查看
这篇博客介绍了如何在Houdini中使用音频来驱动几何体的变换。
整个过程大致可以分成三大部分 —— 第一部分是针对于音频进行处理,从而将连续的杂乱无章的信号转化为规律的值为0或1的Trigger鼓点信号;第二部分是将0/1的Trigger信号转化为驱动的连续信号,最后一部分则是针对于鼓点信号的输入来驱动几何体。
可以看到波形中有绿色和黄色两个声道,实际上我们只需要针对一个声道的鼓点进行处理即可,因此选择删掉左声道:
实现方法也很简单,使用
通过试听能够得到比较清晰的鼓点,但是发现查看波形属性后发现整个波形的信息还是太多,而且采样频率是44100HZ,有点太高了,因此使用envelop节点来进行一次处理并且重新采样一下,从而得到一个比较……额……清爽的波形:
这里我将
然后就是针对于输入的波形来产生Trigger信号了,简单的使用
可以看到这样以来就产生了纯净的0/1的Trigger信号。
首先添加噪声信号,使用noise节点,并且将
我们将其作为一个与原信号值相乘的数值,因此我们需要0/1值,因此使用logic节点,
需要针对信号产生多个集群,则需要使用一个
另外,每个信号的噪声Seed需要针对每个信号而不同,所以在
此后,将
由于我预备使用这些信号来驱动几何体的旋转,因此需要使用
之后就是解决尖锐的跳跃了,这个简单,使用
暂时先写到这里,几何体变换应该是很简单的处理了,篇幅所限,下篇博客再讲吧……
<全文完>
背景
Houdini是我个人非常喜欢的DCC工具,节点式的操作与过程化的思想简直是天生一对。这篇博客介绍了如何以.wav音频文件作为输入,从而根据音频中的鼓点来驱动几何体进行规律性的变换的方法。整个过程大致可以分成三大部分 —— 第一部分是针对于音频进行处理,从而将连续的杂乱无章的信号转化为规律的值为0或1的Trigger鼓点信号;第二部分是将0/1的Trigger信号转化为驱动的连续信号,最后一部分则是针对于鼓点信号的输入来驱动几何体。
音频处理
音频导入及预处理
首先是进行音频的导入,这个应该不用细说,使用File节点即可,在Channel File中选择对应的.wav文件即可,输入的波形如下:
可以看到波形中有绿色和黄色两个声道,实际上我们只需要针对一个声道的鼓点进行处理即可,因此选择删掉左声道:
实现方法也很简单,使用
Delete节点即可,将
Select Channels设定为
By Channel Name,并且将
Channel Names设定为
chan1,输出波形如下:
音频滤波
首先是进行简单的滤波,毕竟原来的波形中的噪声实在太多,因此使用Parametric EQ节点进行一次滤波,使用默认设置即可,输出波形如下:
通过试听能够得到比较清晰的鼓点,但是发现查看波形属性后发现整个波形的信息还是太多,而且采样频率是44100HZ,有点太高了,因此使用envelop节点来进行一次处理并且重新采样一下,从而得到一个比较……额……清爽的波形:
这里我将
Envelop Width设定为2,并且采样频率设为96,启用重采样,得到的波形如下:
然后就是针对于输入的波形来产生Trigger信号了,简单的使用
Trigger节点,并且设定好对应的
Trigger Threshold值,我这里设定为0.042,输出波形如下:
可以看到这样以来就产生了纯净的0/1的Trigger信号。
随机Trigger
然而如果需要针对Trigger信号来驱动几何体集群,那么我们需要产生随机的多重Trigger信号,因此这里对其做一些额外处理:首先添加噪声信号,使用noise节点,并且将
type设定为
Random,随后调用hold节点,输入Trigger信号,从而产生随Trigger信号触发的随机值,如下图:
我们将其作为一个与原信号值相乘的数值,因此我们需要0/1值,因此使用logic节点,
Convert Input节点设定为
Off When Zero Or Less,接着使用Math节点将其做一个乘法,从而得到一个具有随机性的0/1信号:
信号集群
有的时候可能需要产生多个随机信号来驱动多个几何体信息(或者几何体的多个信息),因此有必要使用copy节点来产生信号集群。
需要针对信号产生多个集群,则需要使用一个
constant节点作为template,这里设定为
chan[0-9],并且去掉Single Frame,将End frame设定为1000,这样一来就产生了10个对应的信号。
另外,每个信号的噪声Seed需要针对每个信号而不同,所以在
copy节点的
variable中,添加对应的seed值,让其使用
rand()函数而生成(我这里使用了
rand($C + 23)作为seed的variable值),勾选
Cook Each Copy。
此后,将
noise节点的
Seed值改为表达式
stamp("../copy1", seed, 0)后,便已经产生了不同的信号:
由于我预备使用这些信号来驱动几何体的旋转,因此需要使用
count节点来获得其旋转的角度,可以看到得到了一个比较不错的信号集群:
之后就是解决尖锐的跳跃了,这个简单,使用
filter节点即可,我将
Filter Width节点设定为0.6,最后再将值乘以90即可,得到的信号如下:
暂时先写到这里,几何体变换应该是很简单的处理了,篇幅所限,下篇博客再讲吧……
<全文完>
相关文章推荐
- 科学音频处理(二):如何使用 Octave 对音频文件进行基本数学信号处理
- Android音视频学习第8章:使用fmod对音频进行变调处理
- 使用Octave音频处理(二):基本数学信号处理
- 使用Octave音频处理(二):基本数学信号处理
- [离散时间信号处理学习笔记] 10. z变换与LTI系统
- Android学习之——图形图像处理(使用Matrix控制变换)(二)
- 使用Octave音频处理(二):基本数学信号处理
- [离散时间信号处理学习笔记] 7. z变换
- 使用Octave音频处理(二):基本数学信号处理
- 科学音频处理(二):如何使用 Octave 对音频文件进行基本数学信号处理
- Android学习之——图形图像处理(使用Matrix控制变换)(二)
- Unix信号处理学习笔记
- .NET使用一般处理程序生成验证码(网摘学习)
- [Python学习]使用minidom来处理XML的示例 (一)–XML的读取
- Wince驱动开发学习:寄存器、DMA、中断使用
- 学习笔记--- 使用客户端脚本以自定义错误处理
- MongoDB学习之树结构例子(使用NORM驱动)
- 学习信号处理的一个例子
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】Linux信号机制分析
- [Python学习]使用minidom来处理XML的示例 (三)–XML的美化