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

本文介绍了如何使用Python脚本在Substance Designer中创建缩略图。通过PBR Render节点,结合SD API,实现从.sbs或.sbsar文件自动生成缩略图。详细阐述了脚本的实现步骤,包括连接不同节点,处理各种属性ID,以及最终计算和保存缩略图的过程。此外,还提到了解决没有输出图的问题和创建SD插件的方法,以方便日常使用。

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

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

87b94010703743e686b738a8f0ecf00a.png

具体流程如下:

751dd433eb49f1f4f615d44557977aec.png

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

获取当前的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位置和名字:

5582f8a0d557e81b02470cb49a7b3017.png

通过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.html​docs.substance3d.com

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

9b91137cdbecfa49b14eba5fbedfe666.png

接下来的内容暂时与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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值