需要帮助将粒子系统传播/发散从 2 维扩展到 3 维

Need help expanding particle system spread / divergence from 2 to 3 dimensions

我需要帮助。我已经为此苦苦挣扎了一个星期,但一无所获。我正在构建一个主要用于学习的 3D 粒子系统,目前我正在研究粒子扩散/发散。具体来说,将随机方向引入粒子方向,以创建看起来更像喷泉而不是固体流的东西。

我已经成功地让它在一个轴上工作,但无论我做什么,我都无法让它在 3 个维度上工作。

这是我正在做的事情:

<pre><code> // Compute a random angle between -180 to +180 for velocity angle x, y and z. spreadAmount is a float from 0.0 to 1.0 to control degree of spread. float velangrndx = spreadAmount * ((((double)(rand() % RAND_MAX) / (RAND_MAX)) - 0.5) * 360.0 * 3.14159265359 / 180.0); float velangrndy = spreadAmount * ((((double)(rand() % RAND_MAX) / (RAND_MAX)) - 0.5) * 360.0 * 3.14159265359 / 180.0); float velangrndz = spreadAmount * ((((double)(rand() % RAND_MAX) / (RAND_MAX)) - 0.5) * 360.0 * 3.14159265359 / 180.0); <pre><code>// Compute Angles float vsin_anglex_dir = -PF_SIN(velangrndx); float vcos_anglex_dir = -PF_COS(velangrndx); float vsin_angley_dir = -PF_SIN(velangrndy); float vcos_angley_dir = -PF_COS(velangrndy); float vsin_anglez_dir = -PF_SIN(velangrndz); float vcos_anglez_dir = -PF_COS(velangrndz); // Assign initial velocity to velocity x, y, z. vel is a float ranging from 0.0 - 0.1 specified by user. velx, vely, and velz are also floats. velx = vel; vely = vel; velz = vel;

最后,我们来看看下面的粒子扩散/散度函数。如果我只使用第一个 X 轴(注释掉 Y 和 Z),它可以正常工作(见图片),但如果我使用 Y 和 Z 轴,它就完全不正确。 px0、py0 和 pz0 是临时浮点变量,以保留速度变量。

<pre><code>// X Divergence px0 = (velx * vsin_anglex_dir); py0 = (velx * vcos_anglex_dir); pz0 = velz; velx = px0; vely = py0; velz = pz0; // Y Divergence py0 = (vely * vsin_angley_dir); pz0 = (vely * vcos_angley_dir); px0 = velx; velx = px0; vely = py0; velz = pz0; // Z Divergence pz0 = (velz * vsin_anglez_dir); px0 = (velz * vcos_anglez_dir); py0 = vely; velx = px0; vely = py0; velz = pz0;

然后使用 velx、vely 和 velz 计算粒子屏幕位置。

这是仅 X 轴的粒子散布在 25%、75% 和 100% 时的样子(如果我注释掉 Y 和 Z 代码)。这按它应该的方式工作,理论上,如果我的其余代码工作正常,我应该在 Y 轴和 Z 轴上得到相同的结果。但是我没有。

我真的需要一些帮助。关于我做错了什么以及如何正确地将当前工作的传播函数从 2 维扩展到 3 维有什么建议吗?

谢谢, -理查德

可能是因为 velxvelyvelz 的值在后续计算中被覆盖了。查看以下是否按您期望的方式工作。

// X Divergence
float velxXD = (velx * vsin_anglex_dir);
float velyXD = (velx * vcos_anglex_dir);
float velzXD = velz;

// Y Divergence
float velxYD = velx;
float velyYD = (vely * vsin_angley_dir);
float velzYD = (vely * vcos_angley_dir);

// Z Divergence
float velxZD = (velz * vcos_anglez_dir); 
float velyZD = vely;
float velzZD = (velz * vsin_anglez_dir);

velx=velxXD+velxYD+velxZD;
vely=velyXD+velyYD+velyZD;
velz=velzXD+velzYD+velzZD;