3D粒子寿命

嗨! 我决定与读者分享我在三维空间中粒子系统的小型实验。 我以Habré上有关2D空间中粒子实验的出版物为基础。



让我们从指向促使我采取行动的文章的链接开始。 但是还有另一个原因,自从最近我在实验中越来越多地转移到Ubuntu以来,自从免费安装OS以来,很多事情都变得不错了。 有一些缺点,我为非标准操作系统安装的驱动程序而苦恼,例如两个视频卡和多个监视器。


我以C ++为基础,增加了对CUDA作为计算平台的支持,其中有很多粒子,中央处理器显然无法实时应对此类负载,而Ogre3D图形引擎则在公司中提供。 他们制作了粥,我将在2D版本的模拟中使用动画和引述来对Gif叙述进行调味。


“首先,我跟随“生命”游戏的脚步:每个粒子都有一个“人口过剩”计数器,该计数器等于到其他粒子的距离的平方的平方和。如果此计数器小于某个极限,即邻居很少,则该粒子被其他粒子吸引,并且如果有很多邻居,它会排斥,如果粒子相交,则它们在任何情况下都会排斥,以免彼此穿过。


我们将粒子随机散布在磁场周围,看看会发生什么。”



进阶影片
现在介绍一下程序中发生的逻辑。 创建具有特定参数的粒子数组。 一些参数负责物理属性:半径,质量,速度等,用于在粒子之间创建键的部分,例如:粒子的类型,与其他粒子的粒子连接数等。 在仿真中,平均而言,我要使用700到3000个粒子,因为我想实时计数,因此,由于计算量增加,较大的值导致图像无法显示。 然后,所有这些东西都转移到视频卡的内存中,在GPU的强并行化模式下,GPU处理三个主要子程序:粒子运动的模拟,粒子碰撞(碰撞)的处理以及粒子之间键的形成和破坏。


“我们正在改变游戏规则。我们将不再计算邻居。让粒子根据其类型简单地吸引或排斥。如果所有粒子属于同一类型,则只有两种选择:它们全部排斥或全部吸引。”


我尝试了几种选择,分别用于吸引力排斥力,与粒子之间距离的线性相关性,与距离成反比等。 取决于二次方的逆相关性,但对作用半径有限制,例如45粒子半径。



“我们不会改变太多规则。相反,我们将添加一个新功能。现在粒子将在很短的距离内形成键。如果粒子相互连接,它们将不断相互吸引。这种吸引力不会随着距离的增加而减弱。但是,如果距离超过某个阈值,则连接断开。”


在这里,规则发生了一点变化,引入了键形成的距离,它是键破坏的距离和键中粒子的静止距离,也就是说,粒子不断地试图占据静止位置附近的位置,因此,在离散时间,粒子在零位置附近振荡。 这在所有视频上都可见。 在形成诸如弹性之类的键时,可以应用更复杂的定律,但是现在我已经对其进行了简化,但是我们有“主要汤”而不是固体。



进阶影片


或作为图片



然后,反复试验过程开始。 首先,在GPU上进行编程需要格外小心,即所谓的“共享数据的读-修改-写竞赛”,这意味着当多个线程同时尝试更改变量时可能会出现问题。 不稳定的产生如下:



然后有必要限制进行实验的空间区域,首先想到的是一个立方体。 但是由于该程序第一版的错误,粒子大胆地爬出了它,形成了类似于70年代小说中的空间站的东西。



视频的扩展版


俗话说,如果不是立方体,那就放一个球:



这里的逻辑是,在离开粒子中心之后,力开始与粒子的运动相反,甚至看起来像重力。


__device__ static int Links[3][3] = {{1,0,1},{1,0,0},{1,1,0}}; __device__ static int LinksField[3][3] = {{0,0,0},{0,0,1},{0,0,0}}; __device__ static int LinkTypeSize[3] = {3,8,2}; __device__ static int LinkTypePP[3][3] = {{0,1,1},{8,1,6},{0,1,1}}; 

他按原样带来了一段代码,它们是三种类型的粒子彼此相互作用的矩阵。
-第一行是键形成的原理:1有机会与另一个粒子建立连接,0则没有。
-第二行是粒子排斥的吸引力定律。 实际上,在该实施例中,除了第二种类型的粒子对第三种的吸引之外,所有的彼此排斥。 您当然可以镜像矩阵,但是在这种情况下。
第三行是按类型划分的常见粒子键的数量。
-第四是与每种类型的粒子的粒子键数量,例如,第一类型不能与自身形成键。


我们以强布朗运动得到粒子:



视频的扩展版


我不得不在碰撞中引入能量损失。



视频的扩展版


一切都变得太静态了,我们减小了粒子相互作用的力。



视频的扩展版


如果您观看视频,则可以看到框架的构建方式。 然后它仍然保持静态。


我们更改有关矩阵系数的规则。



视频的扩展版
我们看到了有机分子相似的形成。 甚至有苯环。



另一个视频演示了如果您更改动力学中粒子之间的键的长度会发生什么,从视频的第二分钟开始,这一点特别明显。



但是,我们必须尝试重复2D作者的版本,其引用在本文的正文中。 这种“生活”有一个变体:



或这样



可以添加什么? 首先,该程序的来源 。 其次,在中心上有几篇文章描述了细胞自动机或自由系统(理论上,细胞自动机相当于图灵机 ),其标题包含“生命”一词,因此,我决定也使用它,有点像传统。 尽管它只是一个万花筒,但简单的规则却会引起复杂的行为,例如儿童玩具中的颗粒和镜子系统。


视频中还添加了一个令人着迷的图片,它看起来像是分子,然后是神经网络,但生命还不存在。 作为一种发展选择,需要添加遗传学,但是尚不清楚这些“生物”的适应度函数是什么。



我希望有人会喜欢它,并且随着作者从2D过渡到3D,它将进一步远离3D。 对我自己而言,最主要的是重复在Ubuntu下使用CUDA和Ogre3D的课程。



会有想法写出来,也许我们会提出一些有趣的东西:)

Source: https://habr.com/ru/post/zh-CN454430/


All Articles