计算机图形学流体模拟 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[i]
        itemName = need_file_names[i]
        ufilename = path + "\\" + item
        bpy.ops.wm.ply_import(filepath=ufilename)
        cur_obj = bpy.data.objects[itemName]
        if (cur_obj):
            only_link_to_one_collection(cur_obj, fluid_mesh_collection)
            cur_obj.hide_set(False)
            cur_obj.hide_render = True

import_ply(in_dir, filters)

Mesh 预处理

删除没有使用到的材质

import bpy

toRemove = [block for block in bpy.data.materials if block.users == 0]
for block in toRemove:
    bpy.data.materials.remove(block)

添加 Glass BSDF 材质

import bpy

fluid_mat = bpy.data.materials.new("FluidMat")
fluid_mat.use_nodes = True

principled_node = fluid_mat.node_tree.nodes.get("Principled BSDF")
fluid_mat.node_tree.nodes.remove(principled_node)

glass_node = fluid_mat.node_tree.nodes.new("ShaderNodeBsdfGlass")
glass_node.location = (0, 0)

glass_node.inputs[0].default_value = (0.730, 0.927, 1.0, 1.0)
glass_node.inputs[1].default_value = 0.0
glass_node.inputs[2].default_value = 1.333

output_node = fluid_mat.node_tree.nodes.get("Material Output")
output_node.location = (200, 0)

fluid_mat.node_tree.links.new(glass_node.outputs[0], output_node.inputs[0])

for obj in bpy.data.collections['FluidMesh'].all_objects:
    obj.active_material = fluid_mat

重定位 Mesh

具体怎么修改位置和旋转的,是根据你代码里面具体是怎么设置流体域的

import bpy

for obj in bpy.data.collections['FluidMesh'].all_objects:
    obj.rotation_euler[0] = 1.5708  # 90d
    obj.location = (-4, 4, 0)

清理旧的动画

import bpy

for obj in bpy.data.collections['FluidMesh'].all_objects:
    obj.animation_data_clear()

制作动画帧

Hide_Render 动画

import bpy

for obj in bpy.data.collections['FluidMesh'].all_objects:
    mesh_name = obj.name
    i = int(mesh_name)
    
    obj.hide_viewport = True
    obj.hide_render = True
    obj.keyframe_insert("hide_viewport", frame=0)
    obj.keyframe_insert("hide_render", frame=0)
    
    obj.hide_viewport = False
    obj.hide_render = False
    obj.keyframe_insert("hide_viewport", frame=i+1)
    obj.keyframe_insert("hide_render", frame=i+1)
    
    obj.hide_viewport = True
    obj.hide_render = True
    obj.keyframe_insert("hide_viewport", frame=i+2)
    obj.keyframe_insert("hide_render", frame=i+2)

输出渲染动画

地面、天光等创建暂时不写脚本里,手动创建

选择光追渲染,才有好看的效果。选 eevee 的话,光线都没有从玻璃里面折射出来,所以玻璃都是一片黑的

fps 的设置也是根据流体计算时设置的 dt 来的

import bpy
import math

camera = bpy.data.objects['Camera']
camera.location = (20, -20, 20)
camera.rotation_euler = (math.radians(60), 0, math.radians(45))

bpy.context.scene.render.engine = 'CYCLES'
bpy.context.scene.cycles.device = 'GPU'
bpy.context.scene.cycles.samples = 256

bpy.context.scene.render.resolution_x = 1080
bpy.context.scene.render.resolution_y = 720
bpy.context.scene.render.fps = 30

bpy.context.scene.render.filepath = bpy.path.abspath("//fluid_anim.mkv")
bpy.context.scene.render.image_settings.file_format = 'FFMPEG'

bpy.context.scene.frame_start = 1
bpy.context.scene.frame_end = len(bpy.data.collections['FluidMesh'].all_objects)+1

bpy.ops.render.render(animation=True)

效果

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/308602.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Federated Unlearning for On-Device Recommendation

WSDM 2023 CCF-B Federated Unlearning for On-Device Recommendation 本文工作的主要介绍 本文主要介绍了一种名为FRU(Federated Recommendation Unlearning)的联邦学习框架,用于在设备端的推荐系统中实现用户数据的有效擦除和模型重建。…

专业课128分总分400+南京理工大学818信号系统与数字电路南理工考研经验分享

专业课128分总分400南京理工大学818信号系统与数字电路南理工电光院考研经验分享,希望自己的经历对大家有借鉴。 我是在六月底确认自己保不上研然后专心备考的,时间确实比较紧张。虽然之前暑假看了一点高数,但因为抱有保研的期望&#xff0c…

JMeter之Windows安装

JMeter之Windows安装 一、安装JDK二、安装JMeter1、下载JMeter2、配置环境变量3、验证JMeter 三、扩展知识1、汉化 一、安装JDK 略 二、安装JMeter 1、下载JMeter 官网地址:https://jmeter.apache.org/download_jmeter.cgi 放到本地目录下 2、配置环境变量 变量…

探索浏览器的内心世界:渲染机制的奥秘

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

im6ull学习总结(三-4)freetype显示单个字体

矢量字体引入 使用点阵字库显示英文字母、汉字时,大小固定,如果放大缩小则会模糊甚至有锯齿出现,为了解决这个问题,引用矢量字体。 矢量字体形成分三步: 第1步 确定关键点, 第2步 使用数学曲线&#xff08…

软件测试|Windows系统配置pytest+allure环境教程

前言 allure可以输出非常精美的测试报告,也可以和pytest进行完美结合,不仅可以渲染页面,还可以控制用例的执行。本文我们将介绍Windows系统中如何配置allure环境。 第一步:配置Java环境 因为allure的运行依赖于Java环境&#x…

Java中CompletableFuture 异步编排的基本使用

一、前言 在复杂业务场景中,有些数据需要远程调用,导致查询时间缓慢,影响以下代码逻辑运行,并且这些浪费时间的逻辑与以后的请求并没有关系,这样会大大增加服务的时间。 假如商品详情页的每个查询,需要如下…

2024年3月10日PMI认证考试的报名时间确定!

⏰中国大陆地区2024年第1期PMI认证考试于3月10日举办 ⏰报名时间: 为减少同一时间集中报名造成的网络拥堵,本次报名将采取以下形式分地区、分批次开放报名。👇 1️⃣第1批报名城市:⏰2024年1月11日10:00至1月18日16:00&#xff0c…

【AI之路】使用huggingface_hub通过huggingface镜像站hf-mirror.com下载大模型(附代码,实现大模型自由)

文章目录 前言一、Hugging face是什么?二、huggingface镜像站hf-mirror.com三、大模型一键下载1. 准备工作2. 下载代码 总结后记 前言 要玩AI大模型,Hugging face 不可错过,但资源虽不错,可奈何国内下载速度很慢,动则…

优雅处理并发:Java CompletableFuture最佳实践

第1章:引言 大家好,我是小黑,今天,小黑要和大家聊聊CompletableFuture,这个Java 8引入的强大工具。 在Java传统的Future模式里,咱们都知道,一旦开始了一个异步操作,就只能等它结束…

整形数据在内存中的存储(C语言)

整形数据在内存中的存储 1.整形家族2.(原码、反码、补码)基础知识3.大小端3.1 什么是大小端3.2 为什么有大端和小端3.3 一道关于大小端字节序的面试题3.4 关于整形数据存储的题目(7题)3.4.13.4.23.4.33.4.43.4.53.4.63.4.7 4.总结 1.整形家族 signed可省可不省,一般…

尝试OmniverseFarm的最基础操作

目标 尝试OmniverseFarm的最基础操作。本地机器作为Queue和Agent,同时在本地提交任务。 主要参考了官方文档: Farm Queue — Omniverse Farm latest documentation Farm Agent — Omniverse Farm latest documentation Farm Examples — Omniverse Far…

蜗牛目标检测数据集VOC格式480张

蜗牛,一种缓慢而坚韧的软体动物,以其螺旋形的外壳和黏附力极强的黏液而为人所熟知。 蜗牛体型呈螺旋形,有一个硬壳保护其柔软的身体。壳的形状和纹理因种类而异,有的光滑如玻璃,有的则布满细纹。蜗牛的头部有两对触角…

构建安全可靠的系统:第十一章到第十五章

第三部分:实现系统 原文:Part III. Implementing Systems 译者:飞龙 协议:CC BY-NC-SA 4.0 一旦您分析并设计了您的系统,就该是实现计划的时候了。在某些情况下,实现可能意味着购买现成的解决方案。第十一章…

【AI】CycleGan对抗生成网络遥感影像生成地图效果测试

今天看到一个有趣的项目,CycleGan对抗生成网络把马生成成斑马,还有一个测试用例是用遥感影像生成平面地图的效果,效果如下图所示,我大学是遥感专业,看到遥感影像就触动了我的原神,于是原神启动,…

JavaFx踩坑

github:https://gitee.com/forgot940629/java-fx-demo helloworld 直接用idea即可创建 MANIFEST.MF 没有MANIFEST.MF 直接用idea生成的JavaFX没有MANIFEST.MF这个文件,需要配置 jar包中MANIFEST.MF不一致 target文件中的MANIFEST.MF有Main-Clas…

Beauty algorithm(七)瘦脸

瘦脸的实现采用局部平移法。 一、skills 前瞻 局部平移 二、目标区域定位 左脸: 关键点选择3、5点,基点30 rmax:计算两点5-3间的距离, |x-c|:图像任一点到固定基点c的距离 |m-c|:两固定点距离 右脸: 关键点选择

2024-01-01 K 次取反后最大化的数组和和加油站以及根据身高重建队列

1005. K 次取反后最大化的数组和 思路:每一次取反最小值即可!贪心的思路就是先排序,反转负数的值,后在贪心反转最小值 class Solution:def largestSumAfterKNegations(self, nums: List[int], k: int) -> int:count 0while …

C++ 给父类带参构造函数的赋值

在类的使用中,默认的构造函数不带任何参数,但是也会因为需要而使用带参数的构造函数。 在带参的构造函数中,是如何继承的呢,这里我们通过使用基类,子类,孙类的两重继承来观察,如何给带参构造函数…

谓词-量词、主析取、主和取范式、前束范式、推理证明

这部分内容,主要需要掌握谓词推理,而前提是掌握将自然语言符号化为谓词、用量词来限定辖域,量词的消去、剩下就是推理过程。还需要掌握的是主析取、主和取范式和前束范式。 存在量词∃:至少有一个 全称量词∀:全都是…