HOTSAR官网WebGL互动编程小结&源码

Posted 坏打印机

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HOTSAR官网WebGL互动编程小结&源码相关的知识,希望对你有一定的参考价值。

工作室官网在拖延了数月之后,终于在各位大佬的不满抗议和实习生小刘马不停蹄的敲代码下,成功在七月初上线了。




HOTSAR官网WebGL互动编程小结&源码

官网交互效果


一、从HOTSAR Logo上提取一万个点


还记得去年的时候做一个类似的demo,从一个模型表面上,面积均匀(面积大的三角面随机点多,面积小的随机点少)地生成一定数量的点,当时用的是一个实时解算的算法。具体思路是:
1. 先计算模型上每个三角面的面积,并对每个三角面绑定一个递增排序的索引。

2. 对于均匀分布的N个点,依次利用生成随机数+二分查找法的算法,锁定点所在的三角面,再从该三角面上随机取点。


实时解算的方法体现的是一个程序员对算法的追根究底的执着精神,但是


HOTSAR官网WebGL互动编程小结&源码


怎么简单怎么来,为了不额外消耗CPU的计算时间,我决定把能提前算好的全部算好。


于是,我先使用Houdini的scatter节点,轻松地在模型上scatter 1w个点。然后导出OBJ格式。为了压缩数据大小,写了一个简单的小脚本,对Obj文件进行冗余去除,只保留了position信息和normal信息(normal信息其实可以删去),最后输出一个txt文件。


HOTSAR官网WebGL互动编程小结&源码


二、WebGL Noise


https://github.com/ashima/webgl-noise


大部分的Noise实现都依赖于纹理查找表并且受限于纹理带宽。但是上面给出的这个WebGL Noise 的开源实现库,完全不依赖于外部数据纯代码实现。


在这个互动编程项目里,我使用WebGL Noise库对点的散开运动做一个噪声影响场,让运动更佳随机紊乱,同时噪声场影响点的运动的同时也影响着点的旋转朝向。


三、Polygon-Shredder


https://github.com/spite/polygon-shredder


Polygon-Shredder是谷歌WebGL实验室收录的一个开源项目。


在此次互动编程了,我使用了Polygon-Shredder里一个很巧妙的立方体渲染方式。一个普通的立方体,有12个三角面,36个顶点。但是Polygon-Shredder只需要6个面,18个顶点,就可以完成。


HOTSAR官网WebGL互动编程小结&源码


它利用的原理是:无论什么角度,我们永远只能同时看见一个立方体的三个面!因此它在Vertex Shader里通过对立方体的朝向判断,调整了顶点的Local Position,来实现了以上效果。


这种巧妙的处理方式,让顶点数量从1w个点,即36w个顶点的数据量,减少到了18w个顶点。


四、触摸交互-基本操作


这次的交互也很简单,用户的手指触摸屏幕时,对应位置的Logo上的点会被激活,并四处飘散开,随后变小消失,又回到起始位置。


我计算用户手指触碰位置发射出的光线,和z=500(Logo所在深度)的平面的交叉点,并把该点作为Uniform变量传入PosShader(GPU计算点的位置的FragmentShader)里。在shader中,判断交叉点和当前点位置的距离,当距离小于一个阈值,则激活当前点,并在第四个通道(rgba四个通道:rgb为position的xyz, a为life)设置一个life值,每次计算递减,当life为0,则表示处于非激活状态。





官网首页互动编程部分的源码已经放在Github上,有兴趣的可以下载下来看看:

https://github.com/dayinji/hotsar-logo



以上是关于HOTSAR官网WebGL互动编程小结&源码的主要内容,如果未能解决你的问题,请参考以下文章

体验3D互动!30个使用WEBGL技术的优秀网页设计案例

WebGL关于网页端与U3D互动的传值方法

Three.js(WebGL分支)

超简单的OpenGL & WebGL & Three.js介绍

第1236期探索基于 WebGL 的动画与交互

TensorFire —— 基于 WebGL 的浏览器端神经网络框架 | 软件推介