当前位置: 首页 > news >正文

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

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

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

Blender 版本 4.0

批量导入 ply

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

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

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

import bpy 
import osin_dir = bpy.path.abspath("//")
filters = []  # files to ignore
files_number = 0def 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 + "\\" + itembpy.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 = Trueimport_ply(in_dir, filters)

Mesh 预处理

删除没有使用到的材质

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

添加 Glass BSDF 材质

import bpyfluid_mat = bpy.data.materials.new("FluidMat")
fluid_mat.use_nodes = Trueprincipled_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.333output_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 bpyfor obj in bpy.data.collections['FluidMesh'].all_objects:obj.rotation_euler[0] = 1.5708  # 90dobj.location = (-4, 4, 0)

清理旧的动画

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

制作动画帧

Hide_Render 动画

import bpyfor obj in bpy.data.collections['FluidMesh'].all_objects:mesh_name = obj.namei = int(mesh_name)obj.hide_viewport = Trueobj.hide_render = Trueobj.keyframe_insert("hide_viewport", frame=0)obj.keyframe_insert("hide_render", frame=0)obj.hide_viewport = Falseobj.hide_render = Falseobj.keyframe_insert("hide_viewport", frame=i+1)obj.keyframe_insert("hide_render", frame=i+1)obj.hide_viewport = Trueobj.hide_render = Trueobj.keyframe_insert("hide_viewport", frame=i+2)obj.keyframe_insert("hide_render", frame=i+2)

输出渲染动画

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

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

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

import bpy
import mathcamera = 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 = 256bpy.context.scene.render.resolution_x = 1080
bpy.context.scene.render.resolution_y = 720
bpy.context.scene.render.fps = 30bpy.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)+1bpy.ops.render.render(animation=True)

效果

请添加图片描述

相关文章:

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

做流体模拟的时候,想要复现别人的成果,但是别人的代码都是每帧输出 ply 格式的文件,渲染部分需要自己完成 看了一下,似乎用 blender 是最简单的,于是记录一下过程中用到的代码 Blender 版本 4.0 批量导入 ply 假设…...

二分图带权最大匹配-KM算法详解

文章目录 零、前言一、红娘再牵线二、二分图带权最大完备匹配2.1二分图带权最大匹配2.2概念2.3KM算法2.3.1交错树2.3.2顶标2.3.3相等子图2.3.4算法原理2.3.5算法实现 三、OJ练习3.1奔小康赚大钱3.2Ants 零、前言 关于二分图:二分图及染色法判定-CSDN博客 关于二分…...

Redis命令 - Sets命令组常用命令

Set集合,无序,一堆不重复值的组合。利用redis提供的set数据结构,可以存储一些集合性的数据。 使用场景:例如,实现如共同关注、共同喜好、二度好友等 1、SADD key member [member …] 向集合中添加一个或者多个成员 …...

DA14531-外设驱动篇-I2C通信应用

文章目录 1.I2C通信应用相关文件2.宏定义列表3.主要函数接口4.应用代码实例1.I2C通信应用相关文件 1)i2c.c和i2c.h(SDK文件) 2)app_I2cProtocol.c和app_I2cProtocol.h(用户应用文件) 2.宏定义列表 宏定义注解I2C_ADDRESSING_7B7-bit 地址I2C_ADDRESSING_10B10-bit 地址…...

Git仓库管理笔记

问题: hint: the same ref. If you want to integrate the remote changes, use Done 解决: 解决方法: 1、先使用pull命令: git pull --rebase origin master 2、再使用push命令: git push -u origin master...

[嵌入式软件][入门篇] 搭建在线仿真平台(STM32)

文章目录 一、注册平台二、创建首个项目三、硬件介绍 一、注册平台 进入官方,进行注册: 在线仿真地址 二、创建首个项目 ① 新建项目 ② 搭建一个电路 ③ 用STM32F103搭建一个简单电路 ④ 进入编码界面 三、硬件介绍 红框是必看文档&#xff…...

设置5台SSH互免的虚拟机服务器配置

搭建一套集群虚拟机,往往都需要互免设置,过程很简单,避免以后再搭建还得网上搜索,我直接将这一个步骤写成笔记,记录下来,方便后续查阅。 步骤如下—— 1、准备五台机器 服务器名字服务器IPhadoop1192.16…...

深信服技术认证“SCCA-C”划重点:交付和运维体系

为帮助大家更加系统化地学习云计算知识,高效通过云计算工程师认证,深信服特推出“SCCA-C认证备考秘笈”,共十期内容。“考试重点”内容框架,帮助大家快速get重点知识。 划重点来啦 *点击图片放大展示 深信服云计算认证&#xff…...

xlua源码分析(五) struct类型优化

xlua源码分析(五) struct类型优化 上一节我们分析了xlua是如何实现lua层访问C#值类型的,其中我们重点提到了xlua默认实现方式下,struct访问的效率问题。实际上,xlua还提供了两种优化的方式,可以大大提高str…...

iptables TEE模块测试小记

概述 因为公司项目需求,需要对服务器特定端口进行流量镜像,各种百度之后,发现TEE的模块,后来一番折腾,发现被转发的机器死活收不到数据,最后tcpdump一通了解到根源,博文记录,用以备…...

[IDE]vscode显示文件路径

...

facebook广告怎么设置受众人群

在设置Facebook广告受众人群时,你可以遵循以下步骤: 打开广告创建工具,点击页面右上角的箭头并选择“创建广告”。选择广告目标,根据想要实现的目标创建广告。例如,想要让更多用户谈论你的主页和帖子,或者…...

MySQL夯实之路-MVCC机制深入浅出

多版本并发控制(MVCC,multiversion concurrency control) MVCC用更加灵活的方式处理并发,实现了读不加锁,读写不冲突。保证了事务的隔离性(可重复读),避免了不可重复读问题。 数据…...

Java线上问题堆栈排查分析

最近线上出现类似内存溢出问题,需要排查具体原因,记录过程,方便备查。 一、数据抓取 在启动参数中添加参数,可参照以下设置。 参数的作用是在程序发生内存溢出 OutOfMemory 时打印日志,dump下来,方便用工…...

C语言代码 计算1!+2!+3!+4!+5!+6!+7!+8!+9!+10!

计算1!2!3!4!5!6!7!8!9!10! 代码示例&#xff1a; #include <stdio.h> int main() {int i 0;int n 0;int ret 1;int sum 0;for (n 1; n < 10; n){ret 1;for (i 1; i < n; i){ret ret * i;}sum sum ret;}printf("%d\n", sum);return 0; } 运…...

【RTOS】快速体验FreeRTOS所有常用API(4)队列

目录 四、队列2.1 概念2.2 创建队列2.3 写队列2.4 读队列2.5 队列集&#xff08;可跳过&#xff09; 四、队列 该部分在上份代码基础上修改得来&#xff0c;代码下载链接&#xff1a; https://wwzr.lanzout.com/iBNAS1l75bvc 密码:7xy2 该代码尽量做到最简&#xff0c;不添加多…...

【开题报告】基于SpringBoot的美食制作学习网站的设计设计与实现

1.选题背景 随着人们生活水平的提高&#xff0c;对美食的追求也越来越高。越来越多的人希望能够在家里制作出各种美味的菜肴。然而&#xff0c;对于许多人来说&#xff0c;缺乏专业的指导和实践经验是一个挑战。另外&#xff0c;互联网的普及与发展&#xff0c;为人们提供了更…...

Rosalind Java|Speeding Up Motif Finding

Rosalind编程问题之计算错误矩阵&#xff08;failure array&#xff09;输出前后缀检索匹配。 Speeding Up Motif Finding Problem&#xff1a; A prefix of a length n string s is a substring s[1:j]; a suffix of s is a substring s[k:n]. The failure array of s is a…...

打印的前后顺序

面试题经常会有 <script>console.log(1)setTimeout(function(){console.log(2)})console.log(3)let pnew Promise((resolve,reject) >{console.log(4)resloved(hhhhhh)})p.then(res >{console.log(res)console.log(5)},res >{console.log(7)})console.log(6)&l…...

Android Retrofit使用详情

一、 Retrofit是什么 Retrofit是Android用来接口请求的网络框架&#xff0c;内部是基于OkHttp实现的&#xff0c;retrofit负责接口请求的封装&#xff0c;retrofit可以直接将接口数据解析为Bean类、List集合等&#xff0c;直接简化了中间繁琐的数据解析过程 二、 Retrofit的简单…...

安全加密算法

常用加密算法 对称加密 加密和解密用到的密钥是相同的&#xff0c;这种加密方式加密速度非常快&#xff0c;适合经常发送数据的场合。缺点是密钥的传输比较麻烦。常用对称加密算法如下&#xff1a; DES&#xff1a;密钥长度8个字节&#xff0c;安全性不足&#xff0c;已被证明…...

软件测试|使用matplotlib绘制多种饼图

简介 Matplotlib是一个强大的数据可视化库&#xff0c;它允许我们创建各种类型的图表&#xff0c;包括饼图。饼图是一种用于显示数据分布的常见图表类型。在本文中&#xff0c;我们将介绍如何使用Matplotlib创建不同类型的饼图&#xff0c;并提供示例代码。 创建标准饼图 首…...

vue3-响应式基础之ref

声明响应式状态 ref() 在组合式 API 中&#xff0c;推荐使用 ref() 函数来声明响应式状态&#xff1a; ref() 接收参数&#xff0c;并将其包裹在一个带有 .value 属性的 ref 对象中返回&#xff1a; import { ref } from vue const count ref(0)console.log(count) // { va…...

华为网络设备 通过路由器子接口 Dot1q终结子接口实现跨VLAN通信

(二层交换机直接跳过三层交换价接入路由器时才使用该配置。推荐使用三层交换机建立VLANIF配置更简洁明了。如果VLAN较少可直接配置&#xff1b;路由器接口&#xff0c;一个物理接口一个VLAN) S1配置 vlan batch 2 to 3interface GigabitEthernet0/0/1port link-type trunkpor…...

代码随想录算法训练48 | 动态规划part09

今天就是打家劫舍的一天&#xff0c;这个系列不算难&#xff0c;大家可以一口气拿下。 198.打家劫舍 视频讲解&#xff1a;动态规划&#xff0c;偷不偷这个房间呢&#xff1f;| LeetCode&#xff1a;198.打家劫舍_哔哩哔哩_bilibili 代码随想录 213.打家劫舍II 视频讲解&am…...

2024最新适用于 Windows 、Mac 的最佳屏幕录制软件

屏幕录制软件可以帮助我们录制 PC 和MacBook的实时屏幕视频。如果您想为 优酷录制视频&#xff0c;或者您正在为您的公司制作基于视频的项目&#xff0c;并且需要捕获屏幕的实时视频录制&#xff0c;那么我们在此列出了 一 款适合您的 Windows 、Mac的 2024 年最佳屏幕录制软件…...

【Docker】概述与安装

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Docker的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一. Docker的概述 1.Docker为什么出现 2…...

衡水学院新人真题百练2022(1-20)修订版

​ 1 重要的话说三遍 分数 5 作者 陈越 单位 浙江大学 这道超级简单的题目没有任何输入。 你只需要把这句很重要的话 —— “I’m gonna WIN!”——连续输出三遍就可以了。 注意每遍占一行&#xff0c;除了每行的回车不能有任何多余字符。 #include<stdio.h> int…...

远程调用(OpenFeign)

远程调用 何为远程调用?例如:单体服务时,A模块的功能涉及到引用B模块的功能,那我们需要在A模块中注入B模块的相关服务类并调用其方法;那么同样的逻辑在微服务体系下,就会变成了A服务的功能需要调用B服务的功能,这就形成了服务间调用,也称为远程调用。 目前来说,微服务…...

智能光栅光片显微成像技术的LabVIEW解决方案

智能光栅光片显微成像技术的LabVIEW解决方案 在生物医学研究中&#xff0c;高效的成像技术对于捕捉细胞内罕见和复杂事件至关重要。智能光栅光片显微技术&#xff08;smartLLSM&#xff09;的出现&#xff0c;代表了LabVIEW软件在高端成像领域的革命性应用&#xff0c;这项技术…...