加入工作室时师兄给了两道测试题,由于第一道是完善师兄的一个houdini项目管理插件,我只是开发了一些小功能,所以不好意思拿出来。

第二道题就完全是由自己开发的一个小插件,功能是把maya里的灯光导入到houdini里面。刚开始拿到测试题的时候有点慌,毕竟没怎么做过插件开发,还好师兄给了足够的时间,而且后面发现也没那么难,不过生了一场病,接连在床上躺了几天,不过后来都做出来了。基本做出来之后我就佛了,一天一天做一点,顺便学东西,到最后期限,刚好就把测试题交了,也算是有惊无险加入工作室。

插件下载下载地址

接下来就开始讲怎么开发插件:

maya刚开始学插件开发,用的都是cmd这个库,因为伟添师兄博客上有很多学习笔记,确实帮了我很大的忙,而且最后发现师兄给的一个教程里面有一个就是讲灯光的,不过我已经基本按自己的思路做完了,也就没改。

而houdini里面就基本使用了hou模块开发。

由于刚开始学,而且参照师兄给的另一个插件,就都是用绝对路径写代码,可能对于用户很不友好,后来在做另一个插件时也研究了一下怎么使用相对路径,就是采用python的os库,但也不想改了,毕竟也可以记录一下自己的学习路径(更大原因还是因为懒)

首先是在qt里面做一些基本的ui界面,如图,我这里是做了好几个,因为有几种灯光,然后就可以实现灯光界面的切换

然后是写maya里面的代码,在编辑器(这里推荐vscode,或者pycharm)里面写上代码:

from PySide2 import QtWidgets, QtCore, QtGui
import pymel.core as pm
import PySide2.QtUiTools as QLoader
import maya.cmds as cmds
import json main_ui = r"C:\Users\huangPeiXin\Desktop\sendLights\src\main.ui"
amibientLight_ui = r"C:\Users\huangPeiXin\Desktop\sendLights\src\amibientLight.ui"
areaLight_ui = r"C:\Users\huangPeiXin\Desktop\sendLights\src\areaLight.ui"
spotLight_ui = r"C:\Users\huangPeiXin\Desktop\sendLights\src\spotLight.ui"
pointLight_ui = r"C:\Users\huangPeiXin\Desktop\sendLights\src\pointLight.ui"
volumeLight_ui = r"C:\Users\huangPeiXin\Desktop\sendLights\src\volumeLight.ui"
directionalLight_ui = r"C:\Users\huangPeiXin\Desktop\sendLights\src\directionalLight.ui"
light_json = r"C:\Users\huangPeiXin\Desktop\sendLights\src\light_json.json" def getLightAttr(light):
#获取灯光属性 #保存灯光名称
lightName = str(light.getTransform()) #用于保存每一盏灯光的属性
lightChild = {} #根据灯光类型加载对应灯光属性
if pm.objectType(light) == "ambientLight":
lightChild["lightType"] = "ambientLight"
lightChild["translate"] = cmds.getAttr(lightName + ".translate")
lightChild["rotate"] = cmds.getAttr(lightName + ".rotate")
lightChild["scale"] = cmds.getAttr(lightName + ".scale")
lightChild["visibility"] = cmds.getAttr(lightName + ".visibility")
lightChild["color"] = cmds.getAttr(lightName + ".color")
lightChild["intensity"] = cmds.getAttr(lightName + ".intensity")
lightChild["useRayTraceShadows"] = cmds.getAttr(lightName + ".useRayTraceShadows")
lightChild["shadColor"] = [cmds.getAttr(lightName + ".shadColorR"),
cmds.getAttr(lightName + ".shadColorG"),cmds.getAttr(lightName + ".shadColorB"),] elif pm.objectType(light) == "pointLight":
lightChild["lightType"] = "pointLight"
lightChild["translate"] = cmds.getAttr(lightName + ".translate")
lightChild["rotate"] = cmds.getAttr(lightName + ".rotate")
lightChild["scale"] = cmds.getAttr(lightName + ".scale")
lightChild["visibility"] = cmds.getAttr(lightName + ".visibility")
lightChild["color"] = cmds.getAttr(lightName + ".color")
lightChild["intensity"] = cmds.getAttr(lightName + ".intensity")
lightChild["useRayTraceShadows"] = cmds.getAttr(lightName + ".useRayTraceShadows")
lightChild["shadColor"] = [cmds.getAttr(lightName + ".shadColorR"),
cmds.getAttr(lightName + ".shadColorG"),cmds.getAttr(lightName + ".shadColorB"),]
lightChild["useDepthMapShadows"] = cmds.getAttr(lightName + ".useDepthMapShadows")
lightChild["dmapBias"] = cmds.getAttr(lightName + ".dmapBias")
lightChild["aiExposure"] = cmds.getAttr(lightName + ".aiExposure")
lightChild["aiRadius"] = cmds.getAttr(lightName + ".aiRadius") elif pm.objectType(light) == "spotLight":
lightChild["lightType"] = "spotLight"
lightChild["translate"] = cmds.getAttr(lightName + ".translate")
lightChild["rotate"] = cmds.getAttr(lightName + ".rotate")
lightChild["scale"] = cmds.getAttr(lightName + ".scale")
lightChild["visibility"] = cmds.getAttr(lightName + ".visibility")
lightChild["color"] = cmds.getAttr(lightName + ".color")
lightChild["intensity"] = cmds.getAttr(lightName + ".intensity")
lightChild["useRayTraceShadows"] = cmds.getAttr(lightName + ".useRayTraceShadows")
lightChild["shadColor"] = [cmds.getAttr(lightName + ".shadColorR"),
cmds.getAttr(lightName + ".shadColorG"),cmds.getAttr(lightName + ".shadColorB"),]
lightChild["useDepthMapShadows"] = cmds.getAttr(lightName + ".useDepthMapShadows")
lightChild["dmapBias"] = cmds.getAttr(lightName + ".dmapBias")
lightChild["aiExposure"] = cmds.getAttr(lightName + ".aiExposure")
lightChild["aiRadius"] = cmds.getAttr(lightName + ".aiRadius")
lightChild["coneAngle"] = cmds.getAttr(lightName + ".coneAngle")
lightChild["penumbraAngle"] = cmds.getAttr(lightName + ".penumbraAngle")
lightChild["dropoff"] = cmds.getAttr(lightName + ".dropoff") elif pm.objectType(light) == "directionalLight":
lightChild["lightType"] = "directionalLight"
lightChild["translate"] = cmds.getAttr(lightName + ".translate")
lightChild["rotate"] = cmds.getAttr(lightName + ".rotate")
lightChild["scale"] = cmds.getAttr(lightName + ".scale")
lightChild["visibility"] = cmds.getAttr(lightName + ".visibility")
lightChild["color"] = cmds.getAttr(lightName + ".color")
lightChild["intensity"] = cmds.getAttr(lightName + ".intensity")
lightChild["useRayTraceShadows"] = cmds.getAttr(lightName + ".useRayTraceShadows")
lightChild["shadColor"] = [cmds.getAttr(lightName + ".shadColorR"),
cmds.getAttr(lightName + ".shadColorG"),cmds.getAttr(lightName + ".shadColorB"),]
lightChild["useDepthMapShadows"] = cmds.getAttr(lightName + ".useDepthMapShadows")
lightChild["dmapBias"] = cmds.getAttr(lightName + ".dmapBias")
lightChild["aiExposure"] = cmds.getAttr(lightName + ".aiExposure")
lightChild["aiAngle"] = cmds.getAttr(lightName + ".aiAngle") elif pm.objectType(light) == "areaLight":
lightChild["lightType"] = "areaLight"
lightChild["translate"] = cmds.getAttr(lightName + ".translate")
lightChild["rotate"] = cmds.getAttr(lightName + ".rotate")
lightChild["scale"] = cmds.getAttr(lightName + ".scale")
lightChild["visibility"] = cmds.getAttr(lightName + ".visibility")
lightChild["color"] = cmds.getAttr(lightName + ".color")
lightChild["intensity"] = cmds.getAttr(lightName + ".intensity")
lightChild["useRayTraceShadows"] = cmds.getAttr(lightName + ".useRayTraceShadows")
lightChild["shadColor"] = [cmds.getAttr(lightName + ".shadColorR"),
cmds.getAttr(lightName + ".shadColorG"),cmds.getAttr(lightName + ".shadColorB"),]
lightChild["useDepthMapShadows"] = cmds.getAttr(lightName + ".useDepthMapShadows")
lightChild["dmapBias"] = cmds.getAttr(lightName + ".dmapBias")
lightChild["aiExposure"] = cmds.getAttr(lightName + ".aiExposure")
lightChild["aiSpread"] = cmds.getAttr(lightName + ".aiSpread")
lightChild["aiRoundness"] = cmds.getAttr(lightName + ".aiRoundness")
lightChild["aiSoftEdge"] = cmds.getAttr(lightName + ".aiSoftEdge") elif pm.objectType(light) == "volumeLight":
lightChild["lightType"] = "volumeLight"
lightChild["translate"] = cmds.getAttr(lightName + ".translate")
lightChild["rotate"] = cmds.getAttr(lightName + ".rotate")
lightChild["scale"] = cmds.getAttr(lightName + ".scale")
lightChild["visibility"] = cmds.getAttr(lightName + ".visibility")
lightChild["color"] = cmds.getAttr(lightName + ".color")
lightChild["intensity"] = cmds.getAttr(lightName + ".intensity")
lightChild["useRayTraceShadows"] = cmds.getAttr(lightName + ".useRayTraceShadows")
lightChild["shadColor"] = [cmds.getAttr(lightName + ".shadColorR"),
cmds.getAttr(lightName + ".shadColorG"),cmds.getAttr(lightName + ".shadColorB"),]
lightChild["useDepthMapShadows"] = cmds.getAttr(lightName + ".useDepthMapShadows")
lightChild["dmapBias"] = cmds.getAttr(lightName + ".dmapBias")
lightChild["aiExposure"] = cmds.getAttr(lightName + ".aiExposure")
lightChild["aiRadius"] = cmds.getAttr(lightName + ".aiRadius") return lightChild class LightManager(QtWidgets.QWidget):
#灯光管理器
def __init__(self):
super(LightManager, self).__init__()
self.setObjectName("project_manager") #加载初始界面
loader = QLoader.QUiLoader()
self.ui = loader.load(main_ui)
self.ui.setParent(self)
self.setMaximumSize(450, 700)
self.setMinimumSize(450, 700) #获取初始界面控件
self.comboBox = self.ui.findChild(QtWidgets.QComboBox, "comboBox")
self.widget = self.ui.findChild(QtWidgets.QWidget, "widget")
self.btn_loadAttr = self.ui.findChild(QtWidgets.QPushButton, "btn_loadAttr")
self.btn_sendAttr = self.ui.findChild(QtWidgets.QPushButton, "btn_sendAttr") #获取灯光列表
self.light_list = self.getLight() #加载灯光
self.creatChild() #如果场景中没有灯光,弹出提示没有灯光,如果有,加载第一盏灯光
if self.light_list == []:
msg = QtWidgets.QMessageBox()
msg.setParent(self)
msg.setText("There is no light") else: self.layout = QtWidgets.QVBoxLayout()
self.widget.setLayout(self.layout)
self.childWin = LightWidget(self.light_list[0],self.light_list,0)
self.childWin.setMaximumSize(600, 800)
self.childWin.setMinimumSize(600, 800)
self.layout.addWidget(self.childWin) self.comboBox.currentIndexChanged.connect(lambda: self.creatChildWin(self.comboBox.currentIndex()))
self.btn_sendAttr.clicked.connect(self.exportLight)
self.btn_loadAttr.clicked.connect(self.changeLight) def creatChildWin(self,index):
#创建子窗口 self.layout.removeWidget(self.childWin)
print pm.objectType(self.light_list[index])
print self.light_list[index]
self.childWin = LightWidget(self.light_list[index],self.light_list,index)
self.childWin.setMaximumSize(420, 530)
self.childWin.setMinimumSize(420, 530)
self.layout.addWidget(self.childWin) def creatChild(self):
#根据灯光的多少为comboBox添加子项目 for light in self.light_list:
self.comboBox.addItem(str(light.getTransform())) def getLight(self):
#获取场景中所有的灯光 light_list = []
for light in pm.ls(type=["ambientLight","areaLight","spotLight","pointLight","directionalLight","volumeLight"]):
light_list.append(light) return light_list def changeLight(self):
#重新加载灯光属性 #移除原有列表
self.comboBox.clear()
#重新加载灯光列表
self.light_list = self.getLight()
self.creatChild() #判断场景是否还有灯光
if self.light_list == []:
return 0 else: self.layout.removeWidget(self.childWin)
self.childWin = LightWidget(self.light_list[0],self.light_list,0)
self.childWin.setMaximumSize(420, 530)
self.childWin.setMinimumSize(420, 530)
self.layout.addWidget(self.childWin) def exportLight(self):
#导出灯光属性到json文件
light_dir = {} #获取场景中所有的灯光
self.light_list = self.getLight() for light in self.light_list: #获取保存灯光名称
lightName = str(light.getTransform()) light_dir[lightName] = getLightAttr(light) #写入到json文件中
with open(light_json,'w') as f:
json.dump(light_dir, f, indent=4) class LightWidget(QtWidgets.QWidget): #灯光界面基类,用于获取灯光的基础属性,
def __init__(self,light,light_list,index): super(LightWidget, self).__init__() # #获取属性
self.light = light
self.light_list = light_list
self.lightAttr = getLightAttr(light) #根据灯光类型,加载不同灯光界面
if pm.objectType(self.light_list[index])=="ambientLight": loader = QLoader.QUiLoader()
self.ui = loader.load(amibientLight_ui)
self.ui.setParent(self)
self.lineEdit_type = self.ui.findChild(QtWidgets.QLineEdit, "LineEdit_type")
self.lineEdit_type.setText(pm.objectType(self.light_list[index])) elif pm.objectType(self.light_list[index])=="areaLight": loader = QLoader.QUiLoader()
self.ui = loader.load(areaLight_ui)
self.ui.setParent(self) self.lineEdit_type = self.ui.findChild(QtWidgets.QLineEdit, "LineEdit_type")
self.lineEdit_udms = self.ui.findChild(QtWidgets.QLineEdit, "LineEdit_udms")
self.lineEdit_db = self.ui.findChild(QtWidgets.QLineEdit, "LineEdit_db")
self.lineEdit_ae = self.ui.findChild(QtWidgets.QLineEdit, "LineEdit_ae")
self.lineEdit_as = self.ui.findChild(QtWidgets.QLineEdit, "LineEdit_as")
self.lineEdit_ar = self.ui.findChild(QtWidgets.QLineEdit, "LineEdit_ar")
self.lineEdit_ase = self.ui.findChild(QtWidgets.QLineEdit,"LineEdit_ase") self.lineEdit_type.setText(pm.objectType(self.light_list[index]))
self.lineEdit_udms.setText(str(self.lightAttr["useDepthMapShadows"]))
self.lineEdit_db.setText(str(self.lightAttr["dmapBias"]))
self.lineEdit_ae.setText(str(self.lightAttr["aiExposure"]))
self.lineEdit_as.setText(str(self.lightAttr["aiSpread"]))
self.lineEdit_ar.setText(str(self.lightAttr["aiRoundness"]))
self.lineEdit_ase.setText(str(self.lightAttr["aiSoftEdge"])) elif pm.objectType(self.light_list[index])=="spotLight": loader = QLoader.QUiLoader()
self.ui = loader.load(spotLight_ui)
self.ui.setParent(self) self.lineEdit_type = self.ui.findChild(QtWidgets.QLineEdit, "LineEdit_type")
self.lineEdit_udms = self.ui.findChild(QtWidgets.QLineEdit, "LineEdit_udms")
self.lineEdit_db = self.ui.findChild(QtWidgets.QLineEdit, "LineEdit_db")
self.lineEdit_ae = self.ui.findChild(QtWidgets.QLineEdit, "LineEdit_ae")
self.lineEdit_ca = self.ui.findChild(QtWidgets.QLineEdit, "LineEdit_ca")
self.lineEdit_pa = self.ui.findChild(QtWidgets.QLineEdit, "LineEdit_pa")
self.lineEdit_do = self.ui.findChild(QtWidgets.QLineEdit,"LineEdit_do")
self.lineEdit_ar = self.ui.findChild(QtWidgets.QLineEdit,"LineEdit_ar") self.lineEdit_type.setText(pm.objectType(self.light_list[index]))
self.lineEdit_udms.setText(str(self.lightAttr["useDepthMapShadows"]))
self.lineEdit_db.setText(str(self.lightAttr["dmapBias"]))
self.lineEdit_ae.setText(str(self.lightAttr["aiExposure"]))
self.lineEdit_ca.setText(str(self.lightAttr["coneAngle"]))
self.lineEdit_pa.setText(str(self.lightAttr["penumbraAngle"]))
self.lineEdit_do.setText(str(self.lightAttr["dropoff"]))
self.lineEdit_ar.setText(str(self.lightAttr["aiRadius"])) elif pm.objectType(self.light_list[index])=="pointLight":
loader = QLoader.QUiLoader()
self.ui = loader.load(pointLight_ui)
self.ui.setParent(self) self.lineEdit_type = self.ui.findChild(QtWidgets.QLineEdit, "LineEdit_type")
self.lineEdit_udms = self.ui.findChild(QtWidgets.QLineEdit, "LineEdit_udms")
self.lineEdit_db = self.ui.findChild(QtWidgets.QLineEdit, "LineEdit_db")
self.lineEdit_ae = self.ui.findChild(QtWidgets.QLineEdit, "LineEdit_ae")
self.lineEdit_ar = self.ui.findChild(QtWidgets.QLineEdit,"LineEdit_ar") self.lineEdit_type.setText(pm.objectType(self.light_list[index]))
self.lineEdit_udms.setText(str(self.lightAttr["useDepthMapShadows"]))
self.lineEdit_db.setText(str(self.lightAttr["dmapBias"]))
self.lineEdit_ae.setText(str(self.lightAttr["aiExposure"]))
self.lineEdit_ar.setText(str(self.lightAttr["aiRadius"])) elif pm.objectType(self.light_list[index])=="directionalLight":
loader = QLoader.QUiLoader()
self.ui = loader.load(directionalLight_ui)
self.ui.setParent(self) self.lineEdit_type = self.ui.findChild(QtWidgets.QLineEdit, "LineEdit_type")
self.lineEdit_udms = self.ui.findChild(QtWidgets.QLineEdit, "LineEdit_udms")
self.lineEdit_db = self.ui.findChild(QtWidgets.QLineEdit, "LineEdit_db")
self.lineEdit_ae = self.ui.findChild(QtWidgets.QLineEdit, "LineEdit_ae")
self.lineEdit_aa = self.ui.findChild(QtWidgets.QLineEdit,"LineEdit_aa") self.lineEdit_type.setText(pm.objectType(self.light_list[index]))
self.lineEdit_udms.setText(str(self.lightAttr["useDepthMapShadows"]))
self.lineEdit_db.setText(str(self.lightAttr["dmapBias"]))
self.lineEdit_ae.setText(str(self.lightAttr["aiExposure"]))
self.lineEdit_aa.setText(str(self.lightAttr["aiAngle"])) elif pm.objectType(self.light_list[index])=="volumeLight":
loader = QLoader.QUiLoader()
self.ui = loader.load(volumeLight_ui)
self.ui.setParent(self) self.lineEdit_type = self.ui.findChild(QtWidgets.QLineEdit, "LineEdit_type")
self.lineEdit_udms = self.ui.findChild(QtWidgets.QLineEdit, "LineEdit_udms")
self.lineEdit_db = self.ui.findChild(QtWidgets.QLineEdit, "LineEdit_db")
self.lineEdit_ae = self.ui.findChild(QtWidgets.QLineEdit, "LineEdit_ae")
self.lineEdit_ar = self.ui.findChild(QtWidgets.QLineEdit,"LineEdit_ar") self.lineEdit_type.setText(pm.objectType(self.light_list[index]))
self.lineEdit_udms.setText(str(self.lightAttr["useDepthMapShadows"]))
self.lineEdit_db.setText(str(self.lightAttr["dmapBias"]))
self.lineEdit_ae.setText(str(self.lightAttr["aiExposure"]))
self.lineEdit_ar.setText(str(self.lightAttr["aiRadius"])) #获取界面共有子控件
self.lineEdit_tr_X = self.ui.findChild(QtWidgets.QLineEdit, "LineEdit_tr_X")
self.lineEdit_tr_Y = self.ui.findChild(QtWidgets.QLineEdit, "LineEdit_tr_Y")
self.lineEdit_tr_Z = self.ui.findChild(QtWidgets.QLineEdit, "LineEdit_tr_Z")
self.lineEdit_rt_X = self.ui.findChild(QtWidgets.QLineEdit, "LineEdit_rt_X")
self.lineEdit_rt_Y = self.ui.findChild(QtWidgets.QLineEdit, "LineEdit_rt_Y")
self.lineEdit_rt_Z = self.ui.findChild(QtWidgets.QLineEdit, "LineEdit_rt_Z")
self.lineEdit_sc_X = self.ui.findChild(QtWidgets.QLineEdit, "LineEdit_sc_X")
self.lineEdit_sc_Y = self.ui.findChild(QtWidgets.QLineEdit, "LineEdit_sc_Y")
self.lineEdit_sc_Z = self.ui.findChild(QtWidgets.QLineEdit, "LineEdit_sc_Z")
self.lineEdit_sco_X = self.ui.findChild(QtWidgets.QLineEdit, "LineEdit_sco_X")
self.lineEdit_sco_Y = self.ui.findChild(QtWidgets.QLineEdit, "LineEdit_sco_Y")
self.lineEdit_sco_Z = self.ui.findChild(QtWidgets.QLineEdit, "LineEdit_sco_Z")
self.lineEdit_int = self.ui.findChild(QtWidgets.QLineEdit, "LineEdit_int")
self.lineEdit_urt = self.ui.findChild(QtWidgets.QLineEdit, "LineEdit_urt")
self.lineEdit_vis = self.ui.findChild(QtWidgets.QLineEdit, "LineEdit_vis") self.setValue() def setValue(self):
#设置控件的值 self.lineEdit_tr_X.setText(str(self.lightAttr["translate"][0][0]))
self.lineEdit_tr_Y.setText(str(self.lightAttr["translate"][0][1]))
self.lineEdit_tr_Z.setText(str(self.lightAttr["translate"][0][2]))
self.lineEdit_rt_X.setText(str(self.lightAttr["rotate"][0][0]))
self.lineEdit_rt_Y.setText(str(self.lightAttr["rotate"][0][1]))
self.lineEdit_rt_Z.setText(str(self.lightAttr["rotate"][0][2]))
self.lineEdit_sc_X.setText(str(self.lightAttr["scale"][0][0]))
self.lineEdit_sc_Y.setText(str(self.lightAttr["scale"][0][1]))
self.lineEdit_sc_Z.setText(str(self.lightAttr["scale"][0][2]))
self.lineEdit_sco_X.setText(str(self.lightAttr["shadColor"][0]))
self.lineEdit_sco_Y.setText(str(self.lightAttr["shadColor"][1]))
self.lineEdit_sco_Z.setText(str(self.lightAttr["shadColor"][2]))
self.lineEdit_int.setText(str(self.lightAttr["intensity"]))
self.lineEdit_vis.setText(str(self.lightAttr["visibility"]))
self.lineEdit_urt.setText(str(self.lightAttr["useRayTraceShadows"])) #创建窗口
win = LightManager() win.show()

然后再写houdini里的脚本:

import json
import hou
#加载json文件
with open(r"C:\Users\Administrator\Desktop\sendLights\src\light_json.json") as js:
data = json.load(js) class Light():
""" 灯光基类"""
def __init__(self, key): self.obj = hou.node("obj")
self.key = key #创建灯光
def createLight(self):
print self.key
self.light = self.obj.createNode("hlight")
self.light.setName(self.key) #设置灯光位置
def setPostition(self):
self.posX = self.light.parm("tx")
self.posY = self.light.parm("ty")
self.posZ = self.light.parm("tz")
self.posX.set(data[self.key]["translate"][0][0])
self.posY.set(data[self.key]["translate"][0][1])
self.posZ.set(data[self.key]["translate"][0][2]) #设置灯光旋转
def setRotate(self):
self.posX = self.light.parm("rx")
self.posY = self.light.parm("ry")
self.posZ = self.light.parm("rz")
self.posX.set(data[self.key]["rotate"][0][0])
self.posY.set(data[self.key]["rotate"][0][1])
self.posZ.set(data[self.key]["rotate"][0][2]) #设置投影
def setShadow(self): self.st = self.light.parm("shadow_type") if data[self.key]["useDepthMapShadows"]:
self.st.set(2)
self.bias = self.light.parm("shadow_bias")
self.bias.set(data[self.key]["dmapBias"]) elif data[self.key]["useRayTraceShadows"]:
self.st.set(1) self.scr = self.light.parm("shadow_colorr")
self.scg = self.light.parm("shadow_colorg")
self.scb = self.light.parm("shadow_colorb")
self.scr.set(data[self.key]["shadColor"][0])
self.scg.set(data[self.key]["shadColor"][1])
self.scb.set(data[self.key]["shadColor"][2]) #设置显示模式
def setDisplay(self): self.tdis = self.light.parm("tdisplay") self.tdis.set(True)
self.dis = self.light.parm("display")
if data[self.key]["visibility"]:
self.dis.set(1)
else:
self.dis.set(0) #设置扩散
def setExposure(self):
self.le = self.light.parm("light_exposure")
self.le.set(data[self.key]["aiExposure"]) #设置颜色属性
def setColor(self): self.colX = self.light.parm("light_colorr")
self.colY = self.light.parm("light_colorg")
self.colZ = self.light.parm("light_colorb")
self.colX.set(data[self.key]["color"][0][0])
self.colY.set(data[self.key]["color"][0][1])
self.colZ.set(data[self.key]["color"][0][2]) #灯光强度
def setIntensity(self): self.inte = self.light.parm("light_intensity")
self.inte.set(data[self.key]["intensity"]) class AmbientLight(Light):
"""环境光类,继承自灯光基类"""
def __init__(self,key):
Light.__init__(self,key) self.createLight()
self.setPostition()
self.setRotate()
self.setScale()
self.setColor()
self.setIntensity()
self.setDisplay() #重写创建灯光
def createLight(self):
print self.key #创建节点,并且重命名
self.light = self.obj.createNode("ambient")
self.light.setName(self.key)
self.file = self.light.children()[0]
self.transform = self.light.createNode("xform") #连接节点
self.transform.setFirstInput(self.file) #按下L键
self.light.layoutChildren() #设置显示模式
self.transform.setDisplayFlag(True)
self.transform.setRenderFlag(True) #重写位置属性
def setPostition(self): self.posX = self.transform.parm("tx")
self.posY = self.transform.parm("ty")
self.posZ = self.transform.parm("tz")
self.posX.set(data[self.key]["translate"][0][0])
self.posY.set(data[self.key]["translate"][0][1])
self.posZ.set(data[self.key]["translate"][0][2]) #重写旋转属性
def setRotate(self): self.rotX = self.transform.parm("rx")
self.rotY = self.transform.parm("ry")
self.rotZ = self.transform.parm("rz")
self.rotX.set(data[self.key]["rotate"][0][0])
self.rotY.set(data[self.key]["rotate"][0][1])
self.rotZ.set(data[self.key]["rotate"][0][2]) #设置大小属性
def setScale(self):
self.rotX = self.transform.parm("sx")
self.rotY = self.transform.parm("sy")
self.rotZ = self.transform.parm("sz")
self.rotX.set(data[self.key]["scale"][0][0])
self.rotY.set(data[self.key]["scale"][0][1])
self.rotZ.set(data[self.key]["scale"][0][2]) #重写显示属性
def setDisplay(self):
self.dis = self.light.parm("l_tdisplay")
self.dis.set(True)
self.disd = self.light.parm("l_display")
if data[self.key]["visibility"]:
self.disd.set(1)
else:
self.disd.set(0) class DirectionalLight(Light):
"""平行光,继承自灯光基类"""
def __init__(self,key):
Light.__init__(self,key) self.createLight()
self.setPostition()
self.setRotate()
self.setColor()
self.setIntensity()
self.setDisplay()
self.setShadow()
self.setExposure() #重写创建灯光
def createLight(self):
print self.key
self.light = self.obj.createNode("hlight")
self.light.setName(self.key)
self.lightType = self.light.parm("light_type")
self.lightType.set(7) #scale aiAngle class PointLight(Light):
"""点光源,继承自灯光基类"""
def __init__(self,key):
Light.__init__(self,key) self.createLight()
self.setPostition()
self.setRotate()
self.setColor()
self.setIntensity()
self.setDisplay()
self.setShadow()
self.setExposure() #scale aiRadius class SpotLight(Light):
"""聚光灯,继承自灯光基类"""
def __init__(self,key):
Light.__init__(self,key) self.createLight()
self.setPostition()
self.setRotate()
self.setColor()
self.setIntensity()
self.setDisplay()
self.setShadow()
self.setExposure()
self.setAngle()
self.setDropoff()
#重写创建灯光
def createLight(self):
print self.key
self.light = self.obj.createNode("hlight")
self.light.setName(self.key)
#设置为聚光灯
self.coneenable = self.light.parm("coneenable")
self.coneenable.set(True) #设置灯光角度
def setAngle(self):
self.angle = self.light.parm("coneangle")
self.angle.set(data[self.key]["coneAngle"]) #设置灯光衰减
def setDropoff(self):
self.coneroll = self.light.parm("coneroll")
self.coneroll.set(data[self.key]["dropoff"]) #scale aiRadius penumbraAngle class AreaLight(Light):
"""平面光,继承自灯光基类"""
def __init__(self,key):
Light.__init__(self,key) self.createLight()
self.setPostition()
self.setRotate()
self.setColor()
self.setIntensity()
self.setDisplay()
self.setShadow()
self.setExposure()
self.setSize() #重写创建灯光
def createLight(self):
print self.key
self.light = self.obj.createNode("hlight")
self.light.setName(self.key)
#设置为平面光
self.lightType = self.light.parm("light_type")
self.lightType.set(2) #设置灯光角度
def setAngle(self):
self.angle = self.light.parm("coneangle")
self.angle.set(data[self.key]["coneAngle"]) #设置灯光衰减
def setDropoff(self):
self.coneroll = self.light.parm("coneroll")
self.coneroll.set(data[self.key]["dropoff"]) #设置大小
def setSize(self):
self.areasize1 = self.light.parm("areasize1")
self.areasize1.set(data[self.key]["scale"][0][0])
self.areasize2 = self.light.parm("areasize2")
self.areasize2.set(data[self.key]["scale"][0][1]) # aiSpread aiRoundness aiSoftEdge class VolumeLight(Light):
"""体积光,继承自灯光基类"""
def __init__(self,key):
Light.__init__(self,key) self.createLight()
self.setPostition()
self.setRotate()
self.setColor()
self.setIntensity()
self.setDisplay()
self.setShadow()
self.setExposure() #重写创建灯光
def createLight(self):
print self.key
self.geo = self.obj.createNode("geo")
self.geo.setName(self.key + "_sphere") self.light = self.obj.createNode("hlight")
self.lightType = self.light.parm("light_type")
self.lightType.set(6) self.areageometry = self.light.parm("areageometry")
self.areageometry.set("./" + self.key + "_sphere") self.light.setName(self.key) # airadius def createLight():
#遍历字典,创建灯光
for key in data:
#根据灯光类型创建灯光
if data[key]["lightType"]=="ambientLight":
light = AmbientLight(key)
elif data[key]["lightType"] == "directionalLight":
light = DirectionalLight(key)
elif data[key]["lightType"] == "pointLight":
light = PointLight(key)
elif data[key]["lightType"] == "spotLight":
light = SpotLight(key)
elif data[key]["lightType"] == "areaLight":
light = AreaLight(key)
elif data[key]["lightType"] == "volumeLight":
light = VolumeLight(key) obj = hou.node("obj")
#排列节点
obj.layoutChildren()

最后在maya与houdini里面加载这些脚本即可,至于怎么加载,可以参考我另外一篇博文maya灯光导入houdini插件开发——技术文档

maya灯光导入houdini插件开发的更多相关文章

  1. 70部MAYA灯光材质渲染教程合集

    MAYA灯光材质渲染教程合集 教程格式:MP4和flv 两种格式 使用版本:教程不是一年出的教程,各个版本都有 (教程软件为英文版) 清晰度:可以看清软件上的文字 语言:部分中文字幕,其他英文(通过看 ...

  2. 从Maya中导入LightMap到unity中

    导入步骤 1.在Maya中为每一个模型烘焙好帖图(tif格式),会发现烘焙好的图和UV是一一对应的 2.把模型和烘焙帖图导入到Unity中 3.选中材质,修改Shader为 Legacy Shader ...

  3. 游戏开发之UDK引擎介绍和模型导入

    2014-09-18 10:01:3 3.7.5" style="border:0px; vertical-align:middle; max-width:100%"&g ...

  4. CG资源网 - Maya教程

    Maya中mentalray灯光渲染终极训练视频教程 http://www.cgtsj.com/cg/f/vx3627/index.html Maya无人机建模制作训练视频教程第一季 http://w ...

  5. Houdini技术体系 基础管线(三) :UE4以选择区域的方式对地形做生成和更新 上篇

    背景     前一节里,解决了Houdini地形无缝导入到UE4的流程问题.但这种方法也有它的局限性,在实际游戏项目里,LA和LD还是偏向在游戏引擎编辑器里工作,他们的一些设计也会影响到地形的信息,那 ...

  6. cg tut

    Gesture Drawing with Alex Woo Gesture Drawing with Alex Woo and Louis Gonzales http://eisneim.com/?p ...

  7. 游戏引擎架构 (Jason Gregory 著)

    第一部分 基础 第1章 导论 (已看) 第2章 专业工具 (已看) 第3章 游戏软件工程基础 (已看) 第4章 游戏所需的三维数学 (已看) 第二部分 低阶引擎系统 第5章 游戏支持系统 (已看) 第 ...

  8. 十三、File Translator怎么写

    ---恢复内容开始--- 1. File Translator可以将信息从maya中导入和导出. 2. 创建一个file translator需要从MPxFileTranslator继承. 3. 函数 ...

  9. OBJ解析

    OBJ文件是Alias|Wavefront公司为它的一套基于工作站的3D建模和动画软件"Advanced Visualizer"开发的一种标准3D模型文件格式,很适合用于3D软件模 ...

  10. Rasterization 学习笔记

    ======================Barycentric interpolation====================================== <1>2d/3d ...

随机推荐

  1. ubuntu系统中NTP服务配置

    首先进行软件的安装:sudo apt-get install ntp sudo apt-get install ntpdate(手动校时软件) 然后修改ntp配置文件:sudo vim /etc/nt ...

  2. Docker学习笔记-01 初步了解

    1. 理念:将应用打成镜像,通过镜像成为运行在Docker容器上面的实例,而 Docker容器在任何操作系统上都是一致的,这就实现了跨平台.跨服务器.只需要一次配置好环境,换到别的机子上就可以一键部署 ...

  3. 三本书带您快速深入掌握Spring Boot应用开发《Spring Boot从零开始学(视频教学版)》

    #好书推荐##好书奇遇季#三本书带您快速深入掌握Spring Boot应用开发<Spring Boot从零开始学(视频教学版)><Spring Boot应用开发实战><深 ...

  4. 什么是axios

    原文: https://blog.csdn.net/qq_40837310/article/details/123028044 1.使用格式和jquery的ajax很相似,和最初的相比可以链式调用,1 ...

  5. gitee 上传远程仓库失败

    1:添加本地id_rsa.pub文件内容到gitee SSH Keys (添加公开密钥) 2:设置本地的邮箱和用户名 git config --global user.name "MARS& ...

  6. Open review Mitigating Propagation Failures in PINNs using Evolutionary Sampling

    与Mitigating Propagation failures in PINNs using Evolutionary Sampling - Orange0005 - 博客园 (cnblogs.co ...

  7. Vue v-once指令 和 v-pre指令

    v-once指令: 1.v-once 所在节点在初始化动态渲染后,就视为静态内容了 2.以后数据的改变不会引起v-once所在结构的更新,可用于优化性能 v-pre指令: 1.跳过其所在节点的编译过程 ...

  8. hutools密码算法库

    hutool密码算法库 一.开发背景 Hutool针对Bouncy Castle做了简化包装,用于实现国密算法中的SM2.SM3.SM4. 国密算法工具封装包括: 非对称加密和签名:SM2 摘要签名算 ...

  9. git通过ssh方式免密克隆代码仓库

    git上添加ssh公钥 略过 终端命令行 格式: git clone ssh://[user@]host.xz[:port]/path/to/repo.git/ 栗子: git clone ssh:/ ...

  10. C++书写的第一个类

    1.建立Student.h头文件 #ifndef STUDENT_H #define STUDENT_H #include <string> using namespace std; cl ...