最近希望用 Blender 生成 Instance 的能力,将生成的导入游戏引擎中来渲染。Instance Rendering 是个好东西,特别是针对大场景,渲染成批的基本相同的物体的时候非常有用。

希望能用 Blender 做一些模板出来,通过改变输入的参数,来得到 Blender 给我们计算出来的结果。

这里我拿 Geometry nodes 来做实验,我新建了一个 Geometry Graph 如下图所示:

很简单的功能,就是在 Curve 上采样一些点,来生成几何体,这些几何体都是相同的 Mesh,所以用 Instance 生成最好不过了。目前的数据还比较简单,我们想要的其实就是这些几何体的位置。我们可以写如下脚本来控制参数(采样数量 count)以及输出 Instance 的 Transform Matrix 。

有几个 Tips

  1. 如果是在 Blender 的 GUI 内部运行 Python 脚本,那么在脚本中 print 的信息是没法在 Blender 的 GUI 上输出的。一个比较简单的方法是,从命令行运行 Blender,这样print的信息就会输出在这个控制台上,比如 Mac:
./Applications/Blender.app/Contents/MacOS/Blender
  1. 如果需要写 Blender 脚本,强烈建议打开 PythonTooltips,(Edit->Preference->Interface->PythonTooltips) 这个功能可以在 Blender 的 GUI 界面上显示某个属性对应的 Python 接口,非常方便,只需要将光标悬停在上面即可,如下图所示:

下面是脚本部分,主要做了两件事情:

  1. 从控制台获取参数,修改 Geometry Nodes 里 node 的参数
  2. 获取生成的 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 的信息的更多相关文章

  1. AppUtils【获取手机的信息和应用版本号、安装apk】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 一个获取设备的系统版本号.设备的型号.应用版本号code值.应用版本号name值.包名.是否更新.安装apk的工具类. 其实这个工具 ...

  2. 通过runtime获取对象相关信息

    通过runtime获取对象相关信息 在这里,本人给大家提供一个runtime关于NSObject的扩展,用来显示各种NSObject中的信息,这有助于你来分析类的组成:) 先准备以下类供测试: Mod ...

  3. 反射01 Class类的使用、动态加载类、类类型说明、获取类的信息

    0 Java反射机制 反射(Reflection)是 Java 的高级特性之一,是框架实现的基础. 0.1 定义 Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对 ...

  4. Eureka Instance实例信息配置

    Eureka包含四个部分的配置 instance:当前Eureka Instance实例信息配置 client:Eureka Client客户端特性配置 server:Eureka Server注册中 ...

  5. sql 2012中获取表的信息,包含字段的描述

    1.获取数据库中的表 select name from sysobjects where type='U' 2.获取表字段(此处是Route表) Select name from syscolumns ...

  6. ThinPHP命名空间,连接数据库是要修改的配置文件,Model数据模型层,跨控制器调用,如何获取系统常量信息,

    一.命名空间(主要是为了实现自动加载类) *命名空间(相当于虚拟的目录),为了让类有一个统一的文件夹来管理(可以自动加载'类'),每个文件都要有命名空间*tp如何做命名空间:*TP框架下有一个初始命名 ...

  7. 获取应用程序信息.h

    ////  获取应用程序信息.h//  IOS笔记// 一般会用来判断是否有新版本.是否需要强制更新 iOS的版本号,一个叫做Version,一个叫做Build,这两个值都可以在Xcode 中选中ta ...

  8. PHP获取当前服务器信息的基本语句

    下面是PHP获取当前服务器信息的基本语句. PHP程式版本: <?PHP echo PHP_VERSION; ?> ZEND版本: <?PHP echo zend_version() ...

  9. C# 获取 mp3文件信息

    C# 获取 mp3文件信息[包括:文件大小.歌曲长度.歌手.专辑] 第一种方式:[代码已验证] // http://bbs.csdn.net/topics/390392612   string fil ...

随机推荐

  1. 重载overload 、重写override

    观点:重载和重写完全没有关系要联系到一起,唯一的联系就是他们都带有个'重'字,所以鄙人也随大流把他们放在了一起 注意:下面可复制的代码是正确的,错误的只会上传图片,不上传可复制的代码 重载 1.在同一 ...

  2. 大功率超远距离lora无线数传电台,多级中继功能

    一.在无线通信领域,LoRa是目前市场最被看好的技术之一.随着新一代LoRa调制技术的升级,市场对LoRa技术的认知.认可逐步提高,基于LoRa调制技术开发的产品得到更广泛的应用.受益于其超低的接收灵 ...

  3. electron vue

    vue create project vue add vue-cli-plugin-electron-builder node_modules\@vue\cli-service\lib\config\ ...

  4. SSMS设置为深色模式

    更新记录 2022年4月16日:本文迁移自Panda666原博客,原发布时间:2022年2月8日. 2022年4月16日:SSMS很好用,但现在我更多使用DataGrip了. 2022年6月11日:S ...

  5. Jmeter(五十四) - 从入门到精通高级篇 - 如何在linux系统下运行jmeter脚本 - 上篇(详解教程)

    1.简介 上一篇宏哥已经介绍了如何在Linux系统中安装Jmeter,想必各位小伙伴都已经在Linux服务器或者虚拟机上已经实践并且都已经成功安装好了,那么今天宏哥就来介绍一下如何在Linux系统下运 ...

  6. DevStream 成为 CNCF Sandbox 项目啦!- 锣鼓喧天、鞭炮齐鸣、红旗招展、忘词了。

    开局两张图,内容全靠"编" 来,有图有真相! DevStream ️ CNCF DevStream joins CNCF Sandbox CNCF Cloud Native Int ...

  7. Vue路由的模块自动化与统一加载

    首先呢,我们来看看一般项目路由是怎么划分的. 为什么这么划分呢?如果大项目业务非常多,单纯的单页面很难维护,我们只有这样规范化,才能高效率. 模块自动化与统一加载的好处: 规范化命名(模块名.业务名. ...

  8. js 表面使用 表面学习 -输出

    JavaScript 能够以不同方式"显示"数据: 使用 window.alert() 写入警告框 使用 document.write() 写入 HTML 输出 使用 innerH ...

  9. 业务可视化-让你的流程图"Run"起来

    前言 最近在研究业务可视化的问题,在日常的工作中,流程图和代码往往是分开管理的. 一个被维护多次的系统,到最后流程图和代码是否匹配这个都很难说. 于是一直有一个想法,让程序直接读流程图,根据流程图的配 ...

  10. STC8H开发(十二): I2C驱动AT24C08,AT24C32系列EEPROM存储

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...