• 【taichi】关于SPH_Taichi的探索与尝试


    【taichi】关于SPH_Taichi的探索与尝试

    这是太极实习生张铭睿同学做的SPH太极库。请看

    https://www.bilibili.com/video/BV1mg411y7i9?p=10&vd_source=e15eb8f98a9dde1c9cc874314025b575

    是作者的讲解。

    我们来探索一下这个库。

    这只是个笔记,写得会比较细碎。

    安装问题

    除了requirements里面的安装,还要安装一些库。其中pyglet如果安装不正确版本会报错。

    pyglet==1.5.27
    
    • 1

    控制流

    为了调试方便,我们指定默认

    由于采用了python,所以走一遍控制流是比较简单的。

    入口和参数解析

    先从run_simulation.py进入

    在这里插入图片描述

    然后采用argparse这个第三方库来进行命令行参数的解析。

    使用json这个第三方库进行场景json文件的解析。这一步放在了SimConfig这个自定义类内。位于config_builder.py

    这时命令行会打印出

    {'Configuration': {'domainStart': [0.0, 0.0, 0.0], 'domainEnd': [5.0, 3.0, 2.0], 'particleRadius': 0.01, 'numberOfStepsPerRenderUpdate': 1, 'density0': 1000, 'simulationMethod': 4, 'gravitation': [0.0, -9.81, 0.0], 'timeStepSize': 0.0004, 'stiffness': 50000, 
    'exponent': 7, 'boundaryHandlingMethod': 0, 'exportFrame': False, 'exportPly': False, 'exportObj': False}, 'RigidBodies': [{'objectId': 1, 'geometryFile': './data/models/Dragon_50k.obj', 'translation': [3.5, 0.05, 1.0], 'rotationAxis': [0, 1, 0], 'rotationAngle': 0, 'scale': [1, 1, 1], 'velocity': [0.0, 0.0, 0.0], 'density': 1000.0, 'color': [255, 255, 255], 'isDynamic': False}], 'FluidBlocks': [{'objectId': 0, 'start': [0.1, 0.1, 0.5], 'end': [1.2, 2.9, 1.6], 'translation': [0.2, 0.0, 0.2], 'scale': [1, 1, 1], 'velocity': [0.0, -1.0, 0.0], 'density': 1000.0, 'color': [50, 100, 200]}]
    
    • 1
    • 2

    这个其实就是读取的json文件。由于下面这个print所打印出来的。

    在这里插入图片描述

    接着output_xxx字样,显然是为了导出结果用的。从这里我们可以看出场景文件的用法。

    所有json的键值对都被读入到config这个对象当中了。从这个对象可以获取任何参数。比如

    substeps = config.get_cfg("numberOfStepsPerRenderUpdate")
    
    • 1

    这句话就是调用config对象的get_cfg方法,读取numberOfStepsPerRenderUpdate这个键,得到的值就是substeps。

    构建粒子系统

    接下来的这三行

    在这里插入图片描述

    是核心步骤,实际上就是实例化对象

    这个对象是ParticleSystem类的。

    把config传给它,就是把场景参数传递给它。

    然后builde_solver是构建流体解算器。然后初始化解算器。

    ParticleSystem init

    让我们从ParticleSystem的 __init__开始

    由于东西太多,我们大多数都略讲。

    注意@ti.data_oriented是taichi的面向对象的用法。因此这是个太极的类。

    在这里插入图片描述

    从上到下依次步骤:

    • 接收config
    • 设定计算域
    • 设定计算方法(DFSPH/WCSPH)
    • 设定材料(流体/固体)
    • 设定粒子半径
    • 设定支撑半径和初始体积
    • 设定粒子数量(可变)
    • 设定网格尺寸、数量、padding
    • 设定碰撞体
    • 设定流体块:设定流体粒子数目(通过计算流体块大小得出、在方块内排排坐)
    • 设定刚体块
    • 设定刚体:通过voxelize实现,定义在load_rigid_body函数内
    • 设定总粒子数(加和得到)和刚体数目
    • 分配内存(TODO)

    体素化采样

    SPH_Taichi采用trimesh体素化采样粒子。每个体素中间放一个粒子

    把这段代码随便拷到一个文件,运行一下(要记得更改模型文件路径哦)

    import taichi as ti   
    import trimesh as tm  # load the triangle mesh
    import numpy as np
    
    
    def main():
        ti.init(arch=ti.cuda)
    
        mesh = tm.load("E:/Dev/SPH_Taichi/data/models/Dragon_50k.obj")
    
        voxelized_mesh = mesh.voxelized(pitch=0.02).fill()
        voxelized_points_np = voxelized_mesh.points 
        num_particles_obj = voxelized_points_np.shape[0]
        voxelized_points = ti.Vector.field(3, ti.f32, num_particles_obj)
        voxelized_points.from_numpy(voxelized_points_np)
    #     np.savetxt("voxelized_points_np.csv",voxelized_points_np)
    
        window = ti.ui.Window("Test voxelize", (768, 768))
        canvas = window.get_canvas()
        scene = ti.ui.Scene()
        camera = ti.ui.make_camera()
        camera.position(5, 2, 2)
        while window.running:
            camera.track_user_inputs(window, movement_speed=0.005, hold_key=ti.ui.LMB)
            scene.set_camera(camera)
            scene.ambient_light((1, 1, 1))
            scene.point_light(pos=(0.5, 1.5, 1.5), color=(1, 1, 1))
    
            scene.particles(voxelized_points, color = (0.68, 0.26, 0.19), radius = 0.01)
            canvas.scene(scene)
            window.show()
    
    if __name__ == "__main__":
        main()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    展示结果
    在这里插入图片描述

  • 相关阅读:
    小白入门深度学习 | 6-6:Inception v3 算法原理
    SAP-FI配置与业务解析之外币清账业务处理
    HttpServletResponse(响应)
    2023届双非计算机硕士算法岗秋招总结
    【Python】Python 序列化
    搭建一个vscode+uni+vue的小程序项目
    设计模式java版本阅读笔记 一结构型
    剑指 Offer II 027 回文链表 c++
    2021年下半年软件设计师下午真题答案及解析(三)
    宠物之家网站大学生网页制作教程 学生HTML静态宠物网页设计作业成品 DIV布局简单动物网页制作代码
  • 原文地址:https://blog.csdn.net/weixin_43940314/article/details/128007487