当前位置:   article > 正文

生成缩略图_[SD]用Python脚本生成缩略图

脚本缩率图

最近学习研究了一下sd 的python脚本,做了个小练习,将sbs或者sbsar文件渲染成一张缩略图。

经查阅,Substance Automation Toolkit工具好像可以实现离线的方式创建出缩略图,但是我没有这个工具包····,遂在论坛上逛了逛,发现了一个节点:PBR Render。通过下图所示,就可以得到一张材质的缩略图,就按照这个思路,开始我们的脚本。

87b94010703743e686b738a8f0ecf00a.png

具体流程如下:

751dd433eb49f1f4f615d44557977aec.png

我们一步一步看具体实现步骤:

获取当前的Graph,和package

  1. ctx = sd.getContext()
  2. app = ctx.getSDApplication()
  3. UIMgr = app.getQtForPythonUIMgr()
  4. currentGraph = UIMgr.getCurrentGraph()
  5. pkgMgr = app.getPackageMgr()
  6. currentpackage = pkgMgr.getUserPackages().getItem(0)

接下来创建PBR Render Node:

  1. def createPBRRenderNode(app, pkgMgr, currentGraph):
  2. # create PBR Rendoer Node
  3. resourcePath = app.getPath(SDApplicationPath.DefaultResourcesDir)
  4. package = pkgMgr.loadUserPackage(os.path.join(resourcePath, 'packages', 'pbr_render_ortho.sbs'))
  5. packageName = 'PBR_render_ortho'
  6. instanceNode = currentGraph.newInstanceNode(package.findResourceFromUrl(packageName))
  7. instanceNode.setInputPropertyValueFromId('shape', SDValueInt.sNew(1))
  8. instanceNode.setInputPropertyValueFromId('envrionment_horizontal_rotation', SDValueFloat.sNew(0.06))
  9. instanceNode.setInputPropertyValueFromId('background_color', SDValueColorRGBA.sNew(ColorRGBA(0, 0, 0, 0)))
  10. return instanceNode

因为PBR Render 节点是SD官方的,所以先获取到默认的资源路径,可以在ATTRIBUTES下看到,Package位置和名字:

5582f8a0d557e81b02470cb49a7b3017.png

通过loadUserPackage将包导入,newInstanceNode函数将该节点添加到当前Graph。因为PBR Render节点默认的shape是正方形,而且背景是黑色的,所以这里我又设置了三个属性,将shape设置为sphere,水平旋转0.06,背景改成透明。

我将创建环境图和连接写在了一起:(通过仔细观察,法线galazed这张环境图就是painter shelf中basematerial所采用的环境图)

  1. def linkEnvironmentMap(app, pbrRenderNode, package, currentGraph):
  2. resourcePath = app.getPath(SDApplicationPath.DefaultResourcesDir)
  3. envMapPath = resourcePath + '/view3d/maps/glazed_patio.exr'
  4. envMap = SDResourceBitmap.sNewFromFile(package, envMapPath, EmbedMethod.Linked)
  5. envMapNode = currentGraph.newInstanceNode(envMap)
  6. envMapNode.newPropertyConnectionFromId('unique_filter_output', pbrRenderNode, 'environment_map')

创建过程和之前基本一样,用newPropertyConnectionFromId()将两个节点连接起来,这个函数以后还会用到。

newPropertyConnectionFromId(sdOutputPropertyId,sdInputPropertyNode,sdInputPropertyId)

这里可能比较麻烦的就是需要知道要连接两端的id。官方文档中有方法,这里我就不再重复写了。

https://docs.substance3d.com/sddoc/nodes-and-properties-172825056.html​docs.substance3d.com

做到这里我们就得到了一个最基础的“模板”:

9b91137cdbecfa49b14eba5fbedfe666.png

接下来的内容暂时与SD API无关,我们需要获取需要处理的材质的列表。

拿出我最常用的遍历文件的函数:

  1. MaterialPathList = []
  2. def getMaterialList(rootpath):
  3. for i in os.listdir(rootpath):
  4. path = os.path.join(rootpath, i)
  5. if path.split('')[-1] == '.autosave' or path.split('')[-1] == 'dependencies':
  6. continue
  7. filename = path.split('')[-1]
  8. if filename.split('.&#
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/265258?site
推荐阅读
相关标签
  

闽ICP备14008679号