python - 需要帮助将着色器应用于场景中的选定对象 (Maya)
问题描述
我正在从文件选择中创建着色器,并且需要将着色器应用于我在场景中选择的任何单个对象。我在下面显示的完整工具中注释掉了分组。问题出在 def apply_texture()
这是我的旧代码,我不希望它对所有内容进行分组,因为这会将纹理应用于所有选定的对象。:
def apply_texture(self, *args):
object = cmds.ls(sl=True)
selectedMenuItem = cmds.optionMenu('optionMenu', q=True, value=True)
cmds.sets(name='iG', renderable=True, empty=True)
shader=cmds.shadingNode("blinn", name='shaderNode', asShader=True)
file_node=cmds.shadingNode("file",asTexture=True)
cmds.setAttr('.fileTextureName', self.myDir[0]+'/'+selectedMenuItem, type="string")
shading_group= cmds.sets(renderable=True,noSurfaceShader=True,empty=True)
cmds.connectAttr('%s.outColor' %shader ,'%s.surfaceShader' %shading_group)
cmds.connectAttr('%s.outColor' %file_node, '%s.color' %shader)
cmds.surfaceShaderList(shader, add='iG')
cmds.sets(object, e=True, forceElement='iG')
新代码:
import maya.cmds as cmds
from os import listdir
class TextureImport():
def __init__(self):
if cmds.window(TextureImport, q=True, exists=True):
cmds.deleteUI(TextureImport)
GUI=cmds.window(title="Texture Import Tool", widthHeight=(250,160), s=True, tlb=True)
cmds.rowColumnLayout(numberOfColumns=1, columnAlign=(1, 'center'), columnAttach=(1, 'both', 0), cw=(1,250))
cmds.button(label="Select Directory", command=self.select_dir)
cmds.separator(style='in', h=20)
cmds.optionMenu('optionMenu', label="File List")
cmds.button(label="Clear List", command=self.clear_list)
cmds.separator(style='in', h=20)
cmds.text('Select your object, then:', h=25)
cmds.button(label="Apply Texture", command=self.apply_texture)
cmds.setParent('..')
cmds.showWindow()
def select_dir(self, *args):
basicFilter = "Image Files (*.jpg *.jpeg *.tga *.png *.tiff *.bmp *.psd)"
self.myDir = cmds.fileDialog2 (fileFilter=basicFilter, dialogStyle=2, fm=3)
myFiles = listdir(self.myDir[0])
for items in myFiles:
fileEndings = ('.psd','.PSD','.jpg','JPG','.jpeg','.JPEG','.tga','.TGA','.png','.PNG','.tiff','.TIFF','.bmp','.BMP')
if items.endswith(fileEndings):
cmds.menuItem(items)
else:
cmds.warning(items + 'This is not a valid image type, you fool.')
print myFiles
def clear_list(self, *args):
fileList = cmds.optionMenu('optionMenu', q=True, itemListLong=True)
if fileList:
cmds.deleteUI(fileList)
def apply_texture(self, *args):
object = cmds.ls(sl=True)
selectedMenuItem = cmds.optionMenu('optionMenu', q=True, value=True)
#cmds.sets(name='iG', renderable=True, empty=True)
shader=cmds.shadingNode("blinn", name='shaderNode', asShader=True)
file_node=cmds.shadingNode("file",asTexture=True)
cmds.setAttr('.fileTextureName', self.myDir[0]+'/'+selectedMenuItem, type="string")
shading_group= cmds.sets(renderable=True,noSurfaceShader=True,empty=True)
cmds.connectAttr('%s.outColor' %shader ,'%s.surfaceShader' %shading_group)
cmds.connectAttr('%s.outColor' %file_node, '%s.color' %shader)
#cmds.surfaceShaderList(shader, add='iG')
#cmds.sets(object, e=True, forceElement='iG')
TextureImport()
我应该能够选择一个对象并将着色器应用于它,而无需将其他选定的对象添加到组中。如果我选择另一个对象,我应该能够对该对象应用不同的着色器并且没有原始更改。
解决方案
您是否尝试过: cmds.sets(*object , e=True, forceElement=shading_group) – DrWeeny 18 小时前归功于这个人!
推荐阅读
- html - 如何使用键盘输入在 WebGL 中创建具有 n 边的 2D 形状?
- jekyll - 试图从 Front Matter 值中获取集合
- java - 无法设置我的 RecyclerView 以显示来自 API 回调的全部数据
- reactjs - Engagespot Bell 图标在 React 应用程序中不起作用
- python - Graphen Django 动态查询
- python - 如何将 Pandas Dataframe 中的字符串转换为列表或字符数组?
- javascript - 如何从 npm 构建日志中消除资金和广告噪音?
- python - 有没有办法在 matplotlib 箱线图图例中标记平均值和中位数?
- phpstorm - 如何在 PhpStorm 中的“Find in path”对话框中选择在活动文件的目录中搜索?
- flutter - 如何让我的 Android 应用程序用户下载 WebView 以供以后使用 dart|Flutter