加入工作室时师兄给了两道测试题,由于第一道是完善师兄的一个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插件开发——技术文档

posted on 2019-12-07 22:54  准风璧谈  阅读(505)  评论(0编辑  收藏  举报