【问题标题】:How can I create a random simulation?如何创建随机模拟?
【发布时间】:2010-10-04 19:11:22
【问题描述】:
我一直在玩this flash game,在我克服了最初的('lol,fire')反应之后,我开始想知道如何在编程中复制这种接触变异行为。我想这有点像honeypot xkcd。
我正在考虑从粒子相互偏转以及包含墙壁的场景开始。该序列将从一定数量的“突变体”粒子开始,当这些突变体与常规粒子碰撞时,它们本身就会变成突变体。以后我可以做一些更有趣的事情。
我的问题是如何开始。我计划使用 .NET 的绘图元素在 C# 中执行此操作(尽管我对 C# 相当陌生 - 如果 .NET 有不同的部分,我应该使用让我知道)但是如果有任何关于它的一般论文我有兴趣阅读它们(当然,如果它们可以在线获得)。
谢谢,
罗斯
【问题讨论】:
标签:
random
simulation
particles
【解决方案1】:
我认为你的想法是正确的,一些 particles 在一个盒子里会很好。我无法想象你会找到关于这样一个具体而简单的案例的论文,但也许是一些所需的技术,但与渲染器相比,后端的实现应该相对简单。
移动粒子的一个简单方法是Euler iteration,您可以在其中存储位置和速度。位置=位置+速度*dt;其中 dt 是自上一帧以来的时间变化。最好保持 dt 固定,如果可以的话,在渲染器的点之间进行插值...这将减少稳定性问题并使碰撞检测更容易。
要从墙上反射一个粒子,检查它的位置的 x 分量或 y 分量是否会超出边界,然后翻转速度的其他分量的符号,例如
if(Math.Abs(position.x_component + velocity.x_component * dt) > x_bound)
velocity.y_component = -velocity.y_component;
if(Math.Abs(position.y_component + velocity.y_component * dt) > y_bound)
velocity.x_component = -velocity.x_component;
如果你有恒定的 dt,这很有效,但如果它变化,你将需要做一些更复杂的事情。找到与框的碰撞点和reflect 被碰撞的面中框外向量的部分。
为了使粒子相互碰撞,最好进行距离检查,一旦距离太小就会触发反射。即,如果它们靠得太近,它们就会发生碰撞。反射速度分量,就好像粒子是球体一样,所以反射的法线是它们的位置差。
您可能会在 gamedev 上发现 this article 也很有用...
希望这会有所帮助。