網站首頁 編程語言 正文
前言
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
相關推薦
- 2022-04-03 .NET?Core配置連接字符串和獲取數據庫上下文實例_實用技巧
- 2022-05-10 SpringBoot端口已占用解決:配置端口號
- 2022-08-10 C++示例講解friend?static?const關鍵字的用法_C 語言
- 2022-05-01 pytorch中的torch.nn.Conv2d()函數圖文詳解_python
- 2022-04-23 Element UI中table表格組件的居中問題
- 2022-09-15 C語言實現簡單的推箱子小游戲_C 語言
- 2023-06-13 react拖拽組件react-sortable-hoc的使用_React
- 2022-03-01 iview表格中 colums中使用render函數的幾種總結
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支