Blender Python编程创建发光材质示例详解
作者:ShaderJoy 发布时间:2022-08-20 21:06:19
前言
Blender 并不是唯一一款允许你为场景编程和自动化任务的3D软件; 随着每一个新版本的推出,Blender 正逐渐成为一个可靠的 CG 制作一体化解决方案,从使用油脂铅笔的故事板到基于节点的合成。
事实上,你可以使用 Python 脚本和一些额外的包来批处理你的对象实例化,程序化地生成东西,配置你的渲染设置,甚至获得你当前项目的自定义统计数据,这是非常棒的功能! 这是一种减轻繁琐任务负担的方式,同时也能让开发者参与到这个创造性工具社区中,而不仅仅是美术人员。
在 Blender 中,着色器通常是通过基于节点的图形编辑器(可以在 “Shading” 选项卡中找到)来编辑的,它可以让你根据想要构建或多或少复杂的着色流程来链接和组合尽可能多的内置节点。然而,在本文中,我们将制作一个超级简单的着色器,只有一个节点,所以我们将在 Python 脚本 ?? 中做所有的事情。
创建完材质之后会使用那些着色器,并应用到你的 3D 几何物体上。一个物体可能有几个 材质槽,例如,它可以为几何的不同部分使用不同的着色器,但我们今天不会讨论这种复杂的情况,我们将只考虑 每个物体一个材质槽 的情形。
以 发光材质 为例。你可以把它想象成一个有强度(strength
参数)和颜色的大灯泡。它将使你的 3D 对象发光(所以你的对象将成为你场景中的光源,将与其余的网格交互!) ??
PS: 选择 Shader 类型对于这个项目,我使用的 EEVEE 引擎,其也可以与着色器节点工作,即使它与 Cycles 引擎并不是所有节点类型都相同。
在 Python 脚本中创建一个着色器
为了完全通过脚本创建和分配一个着色器,我们必须:
使用
bpy.data
子模块创建一个新的着色器资源“编辑” 这个着色器,就像我们使用着色器节点编辑器一样: 我们将删除一些节点,添加其他节点,设置它们的属性并将它们链接在一起
对新创建材质的引用进行检索
最后,将其添加到我们对象的材质数据(即槽)中
让我们一步一步来做这件事。我们将从创建一个名为 create_emission_shader()
的新函数开始
它将接收一些 强度(Strength
) 和 颜色(Color
) 参数,并使用这些参数来设置一个基本的 2 节点图,其中有一个发光(Emission
)节点和一个输出(Output
)节点。
我们的想法
从基本节点模板开始,清除所有初始节点
然后,可以添加我们的 发光 节点和 输出 节点,通过更新其输入字段的值来配置 发光 节点
并在两个节点之间创建一个链接
具体代码与注释
创建发光材质
def create_emission_shader(color, strength, mat_name):
# create a new material resource (with its
# associated shader)
mat = bpy.data.materials.new(mat_name)
# enable the node-graph edition mode
mat.use_nodes = True
# clear all starter nodes
nodes = mat.node_tree.nodes
nodes.clear()
# add the Emission node
node_emission = nodes.new(type="ShaderNodeEmission")
# (input[0] is the color)
node_emission.inputs[0].default_value = color
# (input[1] is the strength)
node_emission.inputs[1].default_value = strength
# add the Output node
node_output = nodes.new(type="ShaderNodeOutputMaterial")
# link the two nodes
links = mat.node_tree.links
link = links.new(node_emission.outputs[0], node_output.inputs[0])
# return the material reference
return mat
现在很容易使用这个方法来创建我们的材质资源,并将它们应用到我们的对象上。
例如,我们将需要一个白色的发光材质为光环,一个黄色的发光材质为太阳,为每个行星创建一个随机颜色的发光材质(尽管我将添加更多的蓝色,以更好的整体颜色平衡 ??):
具体调用代码
# ...
N_PLANETS = 6
ring_mat = create_emission_shader(
(1, 1, 1, 1), 1, "RingMat"
)
for n in range(N_PLANETS):
# ...
planet = create_sphere(r, d, "Planet-{:02d}".format(n))
planet.data.materials.append(
create_emission_shader(
(random(), random(), 1, 1),
2,
"PlanetMat-{:02d}".format(n)
)
)
# add the radius ring display
ring = create_torus(d, "Radius-{:02d}".format(n))
ring.data.materials.append(ring_mat)
# add the sun sphere
sun = create_sphere(12, 0, "Sun")
sun.data.materials.append(
create_emission_shader(
(1, 0.66, 0.08, 1), 10, "SunMat"
)
)
如果你在 3D 视图中将阴影模式改为 “rendering”,并删除当前场景中的所有对象,然后运行以上脚本,你会看到它们现在有了漂亮的发光材质!
应用材质前
应用材质后
注意,在运行脚本后,你甚至可以进入 “Shading” 选项卡,选择一个带有着色器的对象并查看其着色器图。
它看起来像预期的那样: 两个节点,一个 Emission
和一个 Output
,两者之间的链接,以及一些Strength
和 Color
属性的自定义值。
来源:https://juejin.cn/post/7128250956000526349
猜你喜欢
- 一 代码编排1 缩进4个空格的缩进(编辑器都可以完成此功能),不要使用Tap,更不能混合使用Tap和空格。2 每行最大长度79,换行可以使用
- 记得有一期ucdchina书友会里面,聊过一次大家的工作习惯问题,现在回想起来很有意思,特整理这篇文章分享给大家。关于photoshop1
- 本文主要是关于matplotlib的一些基本用法。Demoimport matplotlib.pyplot as pltimport num
- 微信(WeChat)是腾讯公司于2011年1月21日推出的一款社交软件,8年时间微信做到日活10亿,日消息量450亿。在此期间微信也推出了不
- 索引 经常要查询的语句,则给它建一个索引 表连接 select T_Oders as o join T_Customers as C on
- 前言在上一篇文章PyG搭建GCN前的准备:了解PyG中的数据格式中,大致了解了PyG中的数据格式,这篇文章主要是简单搭建GCN来实现节点分类
- 起步走 #! /usr/bin/python a=2 b=3 c="test" c=a+b print "ex
- 本文实例讲述了python求众数问题的方法,是一个比较典型的应用。分享给大家供大家参考。具体如下:问题描述:多重集中重数最大的元素称为众数.
- 之前想爬取一些淘宝的数据,后来发现需要登录,找了很多的资料,有个使用request的sessions加上cookie来登录的,cookie的
- 今天研究了下Python中的传值问题,通常在C、C++中有按值传递和按引用传递两种情况,按值传递时会拷贝实参,而按引用传递时只是给形参赋了一
- 本文实例讲述了PHP实现的DES加密解密类定义与用法。分享给大家供大家参考,具体如下:今天写App接口的时候需要传递加密数据给APP端,于是
- 1. 在猜年龄的基础上编写登录、注册方法,并且把猜年龄游戏分函数处理,如2. 登录函数3. 注册函数4. 猜年龄函数5. 选择奖品函数代码如
- **截止文章发布chinese_calendar版本为1.8.0,大约在每年的11月份更新次年的节假日新版本import datetimef
- 本文实例讲述了python使用pymongo与MongoDB基本交互操作。分享给大家供大家参考,具体如下:本文内容:pymongo的使用:安
- 在 CodeBit.cn 的论坛中,有人问 Javascript 中如何截取小数位并实现四舍五入,这是一个很常用的 js 技术,帖子中也有网
- 1、django的model转json对象。1.1、单个modle转换,返回json对象:sqlOrder = get_object_or_
- 在win7 64位,Anaconda安装的Python3.6.1下安装的TensorFlow与Keras,Keras的backend为Ten
- 1. 用Dreamweaver 4.0轻松设计会自动弹性调整的网页 首先需要保证的是你的页面内容采用了表格的格式,然后打开你要编辑的页面,按
- 本文实例讲述了Python从序列中移除重复项且保持元素间顺序不变的方法。分享给大家供大家参考,具体如下:问题:从序列中移除重复的元素,但仍然
- 想弄个截屏工具,整理一下学生错题什么的,原来用的方法是:先运行QQ,再监听键盘热键(“ctrl+alt+a”)。后来发现有些问题:需要先上Q