所以我有一个我用 javascript 和 HTML5 编码的动画(没有库,没有插件,什么都没有,我希望它保持这种状态)。动画使用物理学(基本上是一堆不寻常的弹簧附着在质量上)来模拟一种简单的液体。这部分程序的输出是对象的网格(二维数组),每个对象都有 az 值。这很好用。将数据绘制到 HTML5 Canvas 时出现了我的问题。
这就是它的样子。相信我,动画效果会更好。
对于每个数据点,程序用 z 值确定的颜色绘制一个圆圈。然而,仅仅画出这些点,网格图案就非常明显,很难看到它所代表的流体。为了解决这个问题,我让圆圈更大更透明,使它们相互重叠并且颜色混合,创建一个简单的卷积模糊。结果既快速又漂亮,但有一个小缺陷:
由于圆圈是按顺序绘制的,它们的颜色值不会均匀叠加,因此后来绘制的圆圈会遮盖早期绘制的圆圈。在数学上,渲染器对圆圈的颜色值进行重复加权平均。这适用于两个圆,每个圆的值为 0.5*alpha_n,但对于三个圆,渲染器取最新圆的平均值和其他两个圆的平均值,给最新圆的值 0.5*alpha_n,但是前面的圆圈每个值为 0.25*alpha_n。随着越来越多的圈子重叠,该过程继续进行,从而产生对新圈子和旧圈子的偏见。相反,我想要的是让三个或更多圆圈中的每一个获得 0.33*alpha_n 的值,这样更早的圆圈就不会被遮挡。
这是 alpha 混合的图像。请注意,后面的蓝色圆圈遮住了之前绘制的红色和绿色圆圈:
这是问题在实际中的样子。注意肿块左侧的不同外观。
为了解决这个问题,我尝试了各种方法:
- 使用不同的画布“混合模式”。“乘法”(如上图所示)起到了作用,但造成了不幸的颜色失真。
- 将绘图调用集中在一起。我没有让每个圆圈成为一个单独的画布路径,而是尝试将它们集中在一起。不幸的是,这与使用单独的填充颜色不兼容,而且,路径根本无法与自身融合,从而创建了哑光、单调的轮廓。
- 交错绘图顺序。我没有按 0 到 n 的顺序画圆圈,而是先画了偶数,然后画了赔率。这只是部分解决了这个问题,并创造了一种难看的分层模式,其中赔率似乎漂浮在偶数之上。
- 使用 putImageData 构建我自己的混合模式。我尝试使用 javascript 创建一个手动像素着色器来满足我的需求,但正如预期的那样,它太慢了。
在这一点上,我有点卡住了。我正在寻找解决或绕过这个问题的创造性方法,我欢迎你的想法。我对被告知这是不可能的不是很感兴趣,因为我可以自己解决这个问题。你将如何优雅地从这些数据点中提取流体?