如何在 THREE.js 中为可旋转的蓬松球设置动画? 步骤 1步骤 2步骤 3

问题描述

创意来自

Instagram @sennepldn

Fluffy ball demo (from Instagram)

Fluffy ball demo (If you can't access Instagram Link)

preview

三天前看到这个例子的时候,我很惊讶,所以想挑战一下自己,尝试做出这个效果。

三天后,我尝试了很多方法,例如使用顶点着色器或GPUComputationRenderer,但仍然没有做出正确的模拟。所以我终于决定上来问问大家。


我的解决方案

步骤 1

首先用下面两个看起来有硬尖的球来模拟Demo中的Fluffy Ball。

从第一帧到第二帧,球顺时针旋转了大约30度(我随机假设了一个角度)

Sketch - Frame1 & Frame2

步骤 2

将上面的球简化成下图。

图中黑线代表上图中最长的尖峰。

A1,a2,b1,b2 (Vector3) 代表点 a 和 b 在不同时间的位置。

Sketch - Simplified Frame1 & Frame2 image

但是在最后的模拟中,这是软毛而不是硬刺,所以Frame2 b点的位置应该是b3。

Sketch - Proper Frame2 point b position

步骤 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的理解还不够透彻,不知道怎么把上一帧的世界坐标放到纹理中让下一帧读取,所以这个方法没有成功。


总结我的问题

  1. 如何在 THREE.js GPGpu 中读取最后一帧的世界位置?步骤是什么?

  2. 有没有更好的方法来进行这种模拟?即使这与我的想法无关。例如,模拟真实世界的力量。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)