先说结果,如果要使用python从houdini导出arnold材质可以使用以下命令
import hou
import htoa
vops = [hou.node("/shop/arnold_vopnet1/")]
htoa.material.materialExport(vops,"D:/mat.mtlx")
以下是在寻找解决方法的过程中记录的流水账日志
- google泛搜索
- 找到arnold库:
import arnold
- help(arnold) -> ai_materialx
- help(arnold.ai_materialx) ->
AiMaterialxWrite(universe, filename, lookname, properties='', relative=True)
- 貌似这个函数就可以实现了.但需要提供的参数有点多,不知道具体universe和lookname指的是什么,再搜索下
- 找到arnold API 文档
a long time later…
好吧,还是走错了,也许应该import htoa
而不是import arnold
,
因为在尝试使用关键词AiMaterialxWrite
搜索本地脚本,有了大发现
可以在houdini arnold安装目录下找到一个名为material的python文件.
(…\htoa-5.5.0.2_r1582e12_houdini-18.5.462\scripts\python\htoa\material.py)
在这个文件内使用了AimaterialxWrite函数,进入文件,找到相关函数段落,可以看到它试图在houdini中调用这个功能,看下以下节选
def materialExport(vopnets, filename):
is_materialx = filename[-5:] == '.mtlx'
universe_is_active = AiUniverseIsActive()
if not universe_is_active:
AiBegin()
AiMsgSetConsoleFlags(AI_LOG_NONE)
AiLoadPlugins(htoa.searchpath.plugin)
# load metadata again for the blocklists
htoa.searchpath.loadMetaData()
# Create new universe
universe = AiUniverse()
# Create a HaMaterial class and generate materials
dummy_session = htoa.utils.DummySession(None, universe)
for vopnet in vopnets:
material = HaMaterial(dummy_session, vopnet.path())
# export volume and surface connections
shader_dict = material.generateMaterial(volumic=True)
shader_dict.update(material.generateMaterial(volumic=False))
# Append to ass file
if is_materialx:
AiMaterialxWriteMaterial(filename, vopnet.path(),
shader_dict.get('surface'), shader_dict.get('volume'), shader_dict.get('disp'))
if not is_materialx:
AiASSWrite(universe, filename, AI_NODE_SHADER, False, False)
if universe:
AiUniverseDestroy(universe)
if not universe_is_active:
AiEnd()
这个函数只需要提供材质节点,和输出的文件路径.更符合我们输出习惯,
尝试调用这个函数,输入节点路径和输出路径有问题(因为函数需要提供的是材质节点的对象而不是材质节点的路径,所有需要用node(“node_path”)函数获取对象.但是仅仅这样还是报错,参数需要传入的是一个数组.需要转数组才行).
题外话
由于那时候尝试了下,报错没有找到原因,然后看到下面类似功能的函数(exportMaterials)调用了这个函数(materialExport),且不需要传入参数.执行发现这不就是我们在houdini界面手动执行导出材质触发的面板操作吗!
def exportMaterials():
# Choose filename
filename = hou.ui.selectFile(title='Export Materials', pattern='*.ass, *.mtlx',
chooser_mode=hou.fileChooserMode.Write)
if not filename:
return
filename = hou.expandString(filename)
nodes = hou.selectedNodes()
vops = filter(lambda n: n.type().name() in ['arnold_materialbuilder', 'arnold_vopnet'], nodes)
materialExport(vops, filename)
后来通过修改了下exportMaterial函数,在materialExport(vops, filename)
语句下面添加了print(materialExport(vops, filename))
将输入函数的参数值打印出来,然后才发现了输入的材质节点不是节点路径而是节点对象.
有空可以多研究htoa这个文件夹内的py文件,简直宝库.
chrees~