Audio Visualization & Phong Shading & Model Loading

把近期做的Audio Visualization,Phong Shading,Model Loading三者结合了起来。

Repository: Audio-Visualization—Headphones

Video on Youtube:

Video on Youku:

Audio_Visualization_&_Phong_Shading_&_Model_Loading_1


Model Loading

先在网上找了一个Blender的耳机模型,然后用Blender删掉一些多余的东西,导出为OBJ格式,再经程序读取并用OpenGL画出。


Phong Shading

模型如果没有光照效果会看不到细节,只是一个纯色的轮廓,把刚学的Phong Shading用上,效果还不错。图中白色的小耳机是点光源。


Audio Visualization

可视化部分,我的想法是用耳机罩耳朵的两个泡沫来体现左右声道的电平,电平越高,泡沫越厚。想法简单,但是实现起来还是挺麻烦的,因为两个泡沫的初始坐标并不在任一坐标平面上,如果要对其做伸缩变换,必须要先将其变换到坐标平面上,泡沫最外侧(见最后一张截图)是一个平面S,所以目标就是找到将该平面变换到水平坐标面的矩阵M,然后用伸缩矩阵改变其厚度,再用M的逆将泡沫变换到原位置。有两个泡沫,所以要找两个矩阵,方法相同。

如果对Blender够熟悉的话,应该可以很方便地找出S的法向和与X轴的交点,然后经过计算就可得到M(其实怎么算我差不多快忘完了,虽然几何学课上学过……看来这些东西得重新拾起来了),而且原模型文件中其中一个泡沫是经过对称得到的,两个泡沫绑定了一个对称关系,可我就是不知道怎么解除这个关系,所以就没办法只导出一个泡沫的OBJ文件,无奈只能在程序中将两者分开处理。Blender这一软件虽然是开源免费的,但功能也很强大,起码对于我来说肯定够用了,有空就学一点吧,早晚要用到的。

同样为了体现电平值的敏感度和最大值,我加了一个残影,不过问题也就出在这个残影上,虽然用alpha值、glEnable(GL_BLEND)glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)可以使残影透明,但是残影本身的近处和远处在混合时会产生一些三角形,试了好几种混合函数都没有将其消除。一个可能的原因是模型的部分三角形面没有按照逆时针顺序导出,但是如果是这样的话我在开启glEnable(GL_CULL_FACE)时看到就应该是不完整的表面了,可事实并非如此。所以根本原因还是没弄清楚,先不管了,继续学吧,可能是因为一些我尚不知道东西,反正对整体效果影响也不大。


Audio_Visualization_&_Phong_Shading_&_Model_Loading_2
Audio_Visualization_&_Phong_Shading_&_Model_Loading_3
Audio_Visualization_&_Phong_Shading_&_Model_Loading_4