我想根据点质量的位置扭曲2D网格。质量的存在,应该如下收缩网格:
但我想用网格上任意数量的粒子扭曲它。
这是因为我可以想象重力对空间的影响:扭曲存在大质量的空间。
到目前为止,我所尝试的是基于其内部的粒子数量迭代地调整单元格的边缘。具有许多颗粒的细胞应缩小其边缘。
然而,由此产生的视觉效果令人失望,并没有真正成为扭曲的2D空间。我认为因为变形应该具有全局效应,而不仅仅是对单个细胞的影响?
我可以使用什么算法来扭曲粒子质量的2D空间?
我将2d平面建模为由一些弹性材料制成,这样你可以使用模拟给定物体重量的力使其变形。
由于您想要想象一些物理效果,我认为基于物理的可视化可能是一个合适的选择。
模拟这种弹性行为的一种相对简单的方法是创建一个质量弹簧系统:
https://en.m.wikipedia.org/wiki/Soft-body_dynamics
然而,应用这种技术需要很好地理解Hookean物理,ODE,集成和更多相关的数学内容。
我创建了一个小提琴,每个粒子根据重力使用的平方规则影响每个网格交点。 https://jsfiddle.net/1nrjcsqa/2/
dx = points[i][0] - x;
dy = points[i][1] - y;
d = Math.sqrt(dx * dx + dy * dy);
f = gravity_force / Math.pow(d, falloff);
由于重力作为距离的平方落下,因此点仅对距离它们最近的网格具有可见效果。您可以通过减少衰减来使点对网格产生更远的影响,但这不会像重力那样。
您可能需要调整重力以使事情看起来适合您。
我现在会发布一些快速建议,然后在我可以的时候再跟进。
虽然您在帖子和评论中明确说过这将在CPU上处理,但在GPU上执行此操作并使用OpenGL进行显示可能会有很大帮助。处理60赫兹(每次通过约16毫秒)的数万个点的效果即使它有八个核心也要求很多CPU。
那说,一些准备性的想法:
考虑到所有这些,我想到了一种快速技术,它将每个质量的引力场定义为一块内存,它或多或少地与其他内存进行“或”运算,以产生最终的场向量图。
然后是绘制它的问题。再次,使用OpenGL创建一个真实的3D表示然后投影到2D显示器将是我的首选方式。 OpenGL可以在集成显卡上运行,这就是我推荐的方式。否则,将2D网格线修改为2D图形的计算可能会很复杂。
除此之外,可能会有额外的调整,作弊和变通方法来产生合理的东西,这将有助于用户可视化正在发生的事情,但不能像某些人那样准确地表示引力场。
从我编写的初始代码仅仅是为了显示解决问题的缓慢且不太理想的方法,这里是一个非常粗略的弯曲网格线样本,将它们视为可以单独拉向每个质量的点。这不是实际处理网格线的方法;代码也有一些错误。