物体随机飞溅运动! Cocos Creator!


大量物体以随机初速度的飞溅运动!文章底部附完整代码!

效果预览

像火山喷发、烟花等等运动,都是物体随机飞溅运动。

这个运动其实是抛物运动。

抛物运动也可以看成是匀加速运动。

假设一个物体的初速度为v_0,加速度为a,某一个时刻t的速度公式如下:

v = v_0 + a * t

对这个公式作一次积分,正好是位移。

s = v_0 * t + 0.5 * a * t * t + C

常量C,是物体的初始位置。

我们把物体分成xy两个方向考虑,用上面的公式可以求出在t时刻的物体的位置。为此写个通用的组建控制每个物体的位置控制。主要代码如下。

update(dt) {
    this._time += dt;
    this.node.x = this._initial_position.x + this.initial_velocity.x * this._time + this.acceleration.x * this._time * this._time / 2;
    this.node.y = this._initial_position.y + this.initial_velocity.y * this._time + this.acceleration.y * this._time * this._time / 2;
}

再来看看如何随机初始速度。

当然直接使用Math.random()可以实现。参考代码如下。

// 0-1 均匀分布
const random_a = Math.random();
const random_b = Math.random();


// 均匀分布的初速度
coin.initial_velocity.x = random_a * (V_X_MAX - V_X_MIN) + V_X_MIN;
coin.initial_velocity.y = random_b * (V_Y_MAX - V_Y_MIN) + V_Y_MIN;

生成的结果如下。

这个运行结果可能看起来不太自然。这是为什么呢?

因为自然界中的初速度不是均匀分布的,而是正态分布。

如何生成正态分布的初速度?这里用到Box-Muller算法。这个算法是根据均匀分布的随机数来产生正态分布的随机数算法。

 将这个标准正态分布产生的数值进行一定的转化,可以让飞溅运动的物体的初速度 95% 的概率在我们的速度范围内。有小概率会超出范围,这样效果看起来就更自然了些。

const random_a = Math.random();
const random_b = Math.random();


// box-muller 算法  r1 = sqrt(-2 * ln a) * sin(2*PI*b)    r2 = sqrt(-2 * ln a) * cos(2*PI*b)
const boxMuller_r = Math.sqrt(-2 * Math.log(random_a));
const boxMuller_t = 2 * Math.PI * random_b;
// 标准正态分布 N~(0,1)  68% 的概率 -1~1   95% 的概率 -2~2
const random_normal_x = boxMuller_r * Math.cos(boxMuller_t);
const random_normal_y = boxMuller_r * Math.sin(boxMuller_t);
// random_normal ==除以4==> 95% 的概率 -0.5~0.5  ==加0.5==> 95% 的概率 0~1
coin.initial_velocity.x = (random_normal_x / 4 + 0.5) * (V_X_MAX - V_X_MIN) + V_X_MIN;
coin.initial_velocity.y = (random_normal_y / 4 + 0.5) * (V_Y_MAX - V_Y_MIN) + V_Y_MIN;

以上为白玉无冰使用 Cocos Creator v2.2.2 开发"物体随机飞溅运动!"的技术分享。欢迎留言交流!如果这篇对你有点帮助,欢迎分享给身边的朋友。

转载请保留文末二维码和完整代码获取方式!

完整项目:https://github.com/baiyuwubing/cocos-creator-examples/tree/master/splash

我就知道你“在看”▼

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值