问题描述
创意来自
Instagram @sennepldn
Fluffy ball demo (from Instagram)
Fluffy ball demo (If you can't access Instagram Link)
三天前看到这个例子的时候,我很惊讶,所以想挑战一下自己,尝试做出这个效果。
三天后,我尝试了很多方法,例如使用顶点着色器或GPUComputationRenderer,但仍然没有做出正确的模拟。所以我终于决定上来问问大家。
我的解决方案
步骤 1
首先用下面两个看起来有硬尖的球来模拟Demo中的Fluffy Ball。
从第一帧到第二帧,球顺时针旋转了大约30度(我随机假设了一个角度)
步骤 2
将上面的球简化成下图。
图中黑线代表上图中最长的尖峰。
A1,a2,b1,b2 (Vector3) 代表点 a 和 b 在不同时间的位置。
但是在最后的模拟中,这是软毛而不是硬刺,所以Frame2 b点的位置应该是b3。
步骤 3
所以我打算用下面的方法来模拟。
FAKE CODE(在顶点着色器中)(b1、b2、b3 表示在 vec3 中的位置)
b3 = mix(b1,b2,0.9);
为了读取上一帧b(b1)点的位置,我保存了上一帧的modelMatrix,作为uniform传给下一帧。
在下一帧中,我们可以通过modelMatrix * vec4(position,1.0)得到b1世界位置,但是这种方法是不正确的。
比如在第3帧,如果我们要读取最后一帧b点的位置。这种方法会得到b2而不是b3,但实际模拟需要b3。
有什么办法可以正确获取最后一帧b点的位置吗?
我也试过用GPUComputationRenderer来保存上一帧的位置,放到一个Texture中。
但可能是因为我对GPGPU的理解还不够透彻,不知道怎么把上一帧的世界坐标放到纹理中让下一帧读取,所以这个方法没有成功。
总结我的问题
-
如何在 THREE.js GPGpu 中读取最后一帧的世界位置?步骤是什么?
-
有没有更好的方法来进行这种模拟?即使这与我的想法无关。例如,模拟真实世界的力量。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)