[Blender] Blender 获取 Instance 的信息
最近希望用 Blender 生成 Instance 的能力,将生成的导入游戏引擎中来渲染。Instance Rendering 是个好东西,特别是针对大场景,渲染成批的基本相同的物体的时候非常有用。
希望能用 Blender 做一些模板出来,通过改变输入的参数,来得到 Blender 给我们计算出来的结果。
这里我拿 Geometry nodes 来做实验,我新建了一个 Geometry Graph 如下图所示:

很简单的功能,就是在 Curve 上采样一些点,来生成几何体,这些几何体都是相同的 Mesh,所以用 Instance 生成最好不过了。目前的数据还比较简单,我们想要的其实就是这些几何体的位置。我们可以写如下脚本来控制参数(采样数量 count)以及输出 Instance 的 Transform Matrix 。
有几个 Tips
- 如果是在 Blender 的 GUI 内部运行 Python 脚本,那么在脚本中 print 的信息是没法在 Blender 的 GUI 上输出的。一个比较简单的方法是,从命令行运行 Blender,这样print的信息就会输出在这个控制台上,比如 Mac:
./Applications/Blender.app/Contents/MacOS/Blender
- 如果需要写 Blender 脚本,强烈建议打开
PythonTooltips,(Edit->Preference->Interface->PythonTooltips) 这个功能可以在 Blender 的 GUI 界面上显示某个属性对应的 Python 接口,非常方便,只需要将光标悬停在上面即可,如下图所示:

下面是脚本部分,主要做了两件事情:
- 从控制台获取参数,修改 Geometry Nodes 里 node 的参数
- 获取生成的 Instance 的 Transform Matrix
这有一个坑,就是在设置完 node 的参数后,需要调用一下bpy.context.view_layer.update,不然在后面获取 Instance Data 的时候没办法获取最新的值。
import sys
import bpy
# get args from console
count = int(sys.argv[-1])
C = bpy.context
depsgraph = C.evaluated_depsgraph_get()
# set geometry node parameter
bpy.data.node_groups["test"].nodes['Resample Curve'].inputs[2].default_value = count
# make sure call this method to update data!!
bpy.context.view_layer.update()
data = []
# if the object is instance, we can record its value of transform matrix
for object_instance in depsgraph.object_instances:
obj = object_instance.object
if object_instance.is_instance:
print(object_instance.matrix_world)
data.append(object_instance.matrix_world)
print("count: ", len(data))
我们尝试运行一下:
export PATH=$PATH:/Applications/Blender.app/Contents/MacOS
Blender instanceData.blend --background --python script.py -- 3
控制台输出为:
<Matrix 4x4 (1.0000, 0.0000, 0.0000, 0.0000)
(0.0000, 1.0000, 0.0000, 0.0000)
(0.0000, 0.0000, 1.0000, 0.0000)
(0.0000, 0.0000, 0.0000, 1.0000)>
<Matrix 4x4 (1.0000, 0.0000, 0.0000, 0.0000)
(0.0000, 1.0000, 0.0000, 0.0000)
(0.0000, 0.0000, 1.0000, 1.7000)
(0.0000, 0.0000, 0.0000, 1.0000)>
<Matrix 4x4 (1.0000, 0.0000, 0.0000, 0.0000)
(0.0000, 1.0000, 0.0000, 0.0000)
(0.0000, 0.0000, 1.0000, 3.4000)
(0.0000, 0.0000, 0.0000, 1.0000)>
count: 3
Blender quit
完整的 project https://github.com/MangoWAY/BlenderDemo
[Blender] Blender 获取 Instance 的信息的更多相关文章
- AppUtils【获取手机的信息和应用版本号、安装apk】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 一个获取设备的系统版本号.设备的型号.应用版本号code值.应用版本号name值.包名.是否更新.安装apk的工具类. 其实这个工具 ...
- 通过runtime获取对象相关信息
通过runtime获取对象相关信息 在这里,本人给大家提供一个runtime关于NSObject的扩展,用来显示各种NSObject中的信息,这有助于你来分析类的组成:) 先准备以下类供测试: Mod ...
- 反射01 Class类的使用、动态加载类、类类型说明、获取类的信息
0 Java反射机制 反射(Reflection)是 Java 的高级特性之一,是框架实现的基础. 0.1 定义 Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对 ...
- Eureka Instance实例信息配置
Eureka包含四个部分的配置 instance:当前Eureka Instance实例信息配置 client:Eureka Client客户端特性配置 server:Eureka Server注册中 ...
- sql 2012中获取表的信息,包含字段的描述
1.获取数据库中的表 select name from sysobjects where type='U' 2.获取表字段(此处是Route表) Select name from syscolumns ...
- ThinPHP命名空间,连接数据库是要修改的配置文件,Model数据模型层,跨控制器调用,如何获取系统常量信息,
一.命名空间(主要是为了实现自动加载类) *命名空间(相当于虚拟的目录),为了让类有一个统一的文件夹来管理(可以自动加载'类'),每个文件都要有命名空间*tp如何做命名空间:*TP框架下有一个初始命名 ...
- 获取应用程序信息.h
//// 获取应用程序信息.h// IOS笔记// 一般会用来判断是否有新版本.是否需要强制更新 iOS的版本号,一个叫做Version,一个叫做Build,这两个值都可以在Xcode 中选中ta ...
- PHP获取当前服务器信息的基本语句
下面是PHP获取当前服务器信息的基本语句. PHP程式版本: <?PHP echo PHP_VERSION; ?> ZEND版本: <?PHP echo zend_version() ...
- C# 获取 mp3文件信息
C# 获取 mp3文件信息[包括:文件大小.歌曲长度.歌手.专辑] 第一种方式:[代码已验证] // http://bbs.csdn.net/topics/390392612 string fil ...
随机推荐
- 重载overload 、重写override
观点:重载和重写完全没有关系要联系到一起,唯一的联系就是他们都带有个'重'字,所以鄙人也随大流把他们放在了一起 注意:下面可复制的代码是正确的,错误的只会上传图片,不上传可复制的代码 重载 1.在同一 ...
- 大功率超远距离lora无线数传电台,多级中继功能
一.在无线通信领域,LoRa是目前市场最被看好的技术之一.随着新一代LoRa调制技术的升级,市场对LoRa技术的认知.认可逐步提高,基于LoRa调制技术开发的产品得到更广泛的应用.受益于其超低的接收灵 ...
- electron vue
vue create project vue add vue-cli-plugin-electron-builder node_modules\@vue\cli-service\lib\config\ ...
- SSMS设置为深色模式
更新记录 2022年4月16日:本文迁移自Panda666原博客,原发布时间:2022年2月8日. 2022年4月16日:SSMS很好用,但现在我更多使用DataGrip了. 2022年6月11日:S ...
- Jmeter(五十四) - 从入门到精通高级篇 - 如何在linux系统下运行jmeter脚本 - 上篇(详解教程)
1.简介 上一篇宏哥已经介绍了如何在Linux系统中安装Jmeter,想必各位小伙伴都已经在Linux服务器或者虚拟机上已经实践并且都已经成功安装好了,那么今天宏哥就来介绍一下如何在Linux系统下运 ...
- DevStream 成为 CNCF Sandbox 项目啦!- 锣鼓喧天、鞭炮齐鸣、红旗招展、忘词了。
开局两张图,内容全靠"编" 来,有图有真相! DevStream ️ CNCF DevStream joins CNCF Sandbox CNCF Cloud Native Int ...
- Vue路由的模块自动化与统一加载
首先呢,我们来看看一般项目路由是怎么划分的. 为什么这么划分呢?如果大项目业务非常多,单纯的单页面很难维护,我们只有这样规范化,才能高效率. 模块自动化与统一加载的好处: 规范化命名(模块名.业务名. ...
- js 表面使用 表面学习 -输出
JavaScript 能够以不同方式"显示"数据: 使用 window.alert() 写入警告框 使用 document.write() 写入 HTML 输出 使用 innerH ...
- 业务可视化-让你的流程图"Run"起来
前言 最近在研究业务可视化的问题,在日常的工作中,流程图和代码往往是分开管理的. 一个被维护多次的系统,到最后流程图和代码是否匹配这个都很难说. 于是一直有一个想法,让程序直接读流程图,根据流程图的配 ...
- STC8H开发(十二): I2C驱动AT24C08,AT24C32系列EEPROM存储
目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...