赞
踩
最近学习研究了一下sd 的python脚本,做了个小练习,将sbs或者sbsar文件渲染成一张缩略图。
经查阅,Substance Automation Toolkit工具好像可以实现离线的方式创建出缩略图,但是我没有这个工具包····,遂在论坛上逛了逛,发现了一个节点:PBR Render。通过下图所示,就可以得到一张材质的缩略图,就按照这个思路,开始我们的脚本。
具体流程如下:
我们一步一步看具体实现步骤:
获取当前的Graph,和package
- ctx = sd.getContext()
- app = ctx.getSDApplication()
- UIMgr = app.getQtForPythonUIMgr()
- currentGraph = UIMgr.getCurrentGraph()
- pkgMgr = app.getPackageMgr()
- currentpackage = pkgMgr.getUserPackages().getItem(0)
接下来创建PBR Render Node:
- def createPBRRenderNode(app, pkgMgr, currentGraph):
-
- # create PBR Rendoer Node
- resourcePath = app.getPath(SDApplicationPath.DefaultResourcesDir)
- package = pkgMgr.loadUserPackage(os.path.join(resourcePath, 'packages', 'pbr_render_ortho.sbs'))
- packageName = 'PBR_render_ortho'
- instanceNode = currentGraph.newInstanceNode(package.findResourceFromUrl(packageName))
- instanceNode.setInputPropertyValueFromId('shape', SDValueInt.sNew(1))
- instanceNode.setInputPropertyValueFromId('envrionment_horizontal_rotation', SDValueFloat.sNew(0.06))
- instanceNode.setInputPropertyValueFromId('background_color', SDValueColorRGBA.sNew(ColorRGBA(0, 0, 0, 0)))
- return instanceNode
因为PBR Render 节点是SD官方的,所以先获取到默认的资源路径,可以在ATTRIBUTES下看到,Package位置和名字:
通过loadUserPackage将包导入,newInstanceNode函数将该节点添加到当前Graph。因为PBR Render节点默认的shape是正方形,而且背景是黑色的,所以这里我又设置了三个属性,将shape设置为sphere,水平旋转0.06,背景改成透明。
我将创建环境图和连接写在了一起:(通过仔细观察,法线galazed这张环境图就是painter shelf中basematerial所采用的环境图)
- def linkEnvironmentMap(app, pbrRenderNode, package, currentGraph):
-
- resourcePath = app.getPath(SDApplicationPath.DefaultResourcesDir)
- envMapPath = resourcePath + '/view3d/maps/glazed_patio.exr'
- envMap = SDResourceBitmap.sNewFromFile(package, envMapPath, EmbedMethod.Linked)
- envMapNode = currentGraph.newInstanceNode(envMap)
- envMapNode.newPropertyConnectionFromId('unique_filter_output', pbrRenderNode, 'environment_map')
创建过程和之前基本一样,用newPropertyConnectionFromId()将两个节点连接起来,这个函数以后还会用到。
newPropertyConnectionFromId
(sdOutputPropertyId,sdInputPropertyNode,sdInputPropertyId)
这里可能比较麻烦的就是需要知道要连接两端的id。官方文档中有方法,这里我就不再重复写了。
https://docs.substance3d.com/sddoc/nodes-and-properties-172825056.htmldocs.substance3d.com做到这里我们就得到了一个最基础的“模板”:
接下来的内容暂时与SD API无关,我们需要获取需要处理的材质的列表。
拿出我最常用的遍历文件的函数:
- MaterialPathList = []
-
- def getMaterialList(rootpath):
- for i in os.listdir(rootpath):
- path = os.path.join(rootpath, i)
- if path.split('')[-1] == '.autosave' or path.split('')[-1] == 'dependencies':
- continue
- filename = path.split('')[-1]
- if filename.split('.&#
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。