计算机图形学流体模拟 blender 渲染脚本

做流体模拟的时候,想要复现别人的成果,但是别人的代码都是每帧输出 ply 格式的文件,渲染部分需要自己完成

看了一下,似乎用 blender 是最简单的,于是记录一下过程中用到的代码

Blender 版本 4.0

批量导入 ply

假设所有 ply 文件都和 blend 文件位于同一目录

ply 文件的文件名格式是 00001.ply, 00002.ply, 000123.ply 之类,编号表示帧数

希望导入所有 ply 文件,都放在一个 collection 里面,并且只连接到这个 collection

import bpy 
import os

in_dir = bpy.path.abspath("//")
filters = []  # files to ignore
files_number = 0

def only_link_to_one_collection(obj, collection):
    for other_col in obj.users_collection:
        other_col.objects.unlink(obj)
    if obj.name not in collection.objects:
        collection.objects.link(obj)
        
def import_ply(path, filters):
    need_file_items = []
    need_file_names = []

    filterDict = {
   }
    for item in filters:
        filterDict[item] = True;

    file_lst = os.listdir(path)
    
    for item in file_lst:
        fileName, fileExtension = os.path.splitext(item)
        if fileExtension == ".ply" and (not item in filterDict):
            need_file_items.append(item)
            need_file_names.append(fileName)
    
    fluid_mesh_collection = bpy.data.collections.new(name='FluidMesh')
    bpy.context.scene.collection.children.link(fluid_mesh_collection)
    
    files_number = len(need_file_items)
    for i in range(files_number):
        item = need_file_items
### Blender 中的管道水流物理模拟 Blender 的物理引擎支持多种类型的流体模拟,其中包括基于 FLIP 和 MantaFlow 的技术[^1]。为了实现逼真的管道水流效果,可以通过以下方法设置和调整参数: #### 设置流体域 在 Blender 中,流体模拟的核心组件是 **Domain(域)** 对象。这是定义整个流体行为的空间范围。对于管道中的水流模拟,需要确保 Domain 被适当地缩放并覆盖整个管道区域。 ```python import bpy # 创建一个新的立方体作为流体域 bpy.ops.mesh.primitive_cube_add(size=2, location=(0, 0, 0)) domain = bpy.context.object domain.name = "Fluid_Domain" # 将对象转换为流体域 bpy.context.view_layer.objects.active = domain bpy.ops.object.modifier_add(type='FLUID') fluid_mod = domain.modifiers["Fluid"] fluid_mod.fluid_type = 'DOMAIN' ``` 上述脚本会自动创建一个名为 `Fluid_Domain` 的对象,并将其指定为流体域。 #### 配置流体属性 通过修改流体域的属性来增强真实感。例如,在 Blender流体面板中,可以选择不同的预设以匹配现实世界的水特性。 - **Resolution Divisions**: 提高分辨率可以增加细节,但也显著增加了计算时间。 - **Viscosity (粘度)**: 控制液体的流动性。较低的数值表示更稀薄的液体(如水),而较高的数值则适合蜂蜜等浓稠物质。 - **Surface Subdivisions**: 增加表面细分可改善最终渲染的质量。 #### 添加障碍物与引导器 为了让水流遵循特定路径,可以在场景中加入其他几何形状作为障碍物或引导器。这些辅助对象应被标记为 **Obstacle** 类型以便参与仿真过程。 ```python # 添加圆柱形管壁作为障碍物 bpy.ops.mesh.primitive_cylinder_add(radius=0.5, depth=4, location=(0, 0, 0)) obstacle = bpy.context.object obstacle.name = "Pipe_Wall" # 设定该物体为障碍物 bpy.context.view_layer.objects.active = obstacle bpy.ops.object.modifier_add(type='FLUID') fluid_obst_mod = obstacle.modifiers["Fluid"] fluid_obst_mod.fluid_type = 'OBSTACLE' ``` 此代码片段生成了一个简单的圆筒状容器充当虚拟水管的一部分。 尽管 Blender 已具备相当完善的工具集来进行基础级别的流体建模工作,但对于某些极端条件下的高级需求——诸如高度湍急或者大规模破坏性的液态表现形式,则可能仍需借助专门设计的应用程序像 Houdini 这样的解决方案才能达成最佳成果[^2]。 最后值得注意的是,在执行任何大型项目之前,请务必考虑计算机性能因素;因为即使是最先进的个人电脑也可能难以承受过于复杂详尽的体积光线追踪运算负担[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值