HumanIK Effector Ctrl AnimationExporter/importer

HumanIKのコントローラーのRIGアニメーション作成は楽しいので昔のKeyFrameを新しいファイルに入れたいときに使う。

animでもatomでも持っていけなかったのでに作るしかないかーと思った。

どうしてもRigなので引っ張られている分ポーズがまんま持っていけるわけではないので確認と調整が必要、ポーズによってはそのまま使える

OKなポーズ

NGだったポーズ

ほとんどNGやないかい。まあ大体の大枠のポーズはインポートできてる。
膝のまがりとかがダメだった。

腰の位置にキーが入らないというかそこらへんが問題ある
HumanIKのHipはへんな記事があった。
HumanIKヒップエフェクターが壊れています
https://forums.cgsociety.org/t/humanik-hip-effector-broken/1583635/3
によると設定をデフォルトにすると直るとか直らないとか神のみぞ知るとか。。

まあとりあえずソース公開

HumanIK Effecter Ctrl Animation Exporter

import maya.cmds as cmds

class HumanIK_Effecter_Ctrl_AnimationExporter:
	def MainWay(self):

		selects=cmds.ls(sl=True)
		selectRef=selects[0]
		print("selectRef= "+selectRef)

		_CtrlIndex=selectRef.find("_Ctrl")
		print("_CtrlIndex= "+str(_CtrlIndex))

		SkeletonName=selectRef[0:_CtrlIndex]
		print("SkeletonName= "+SkeletonName)

		HipsCtrlName=SkeletonName+"_Ctrl_Hips"
		print("HipsCtrlName= "+HipsCtrlName)
		
		startFrame=185
		endFrame=206


		self.keyAllLineStr=""
		
		self.NodeAllLoop(selectRef,HipsCtrlName,startFrame,endFrame)
	
	def key_to_add_line(self,CtrlNode,Way,key_arr):
		if(str(key_arr)=="None"):
			pass
		else:
			 key_arr.insert(0, Way)
			 key_arr.insert(0, CtrlNode)
			 key_str_arr=[]
			 #1度数値を文字列に変換する
			 for v in key_arr:
				str_v=str(v)
				key_str_arr.append(str_v)
			 key_arr_str=",".join(key_str_arr)
			 
			 print("key_arr_str= "+key_arr_str)
			 self.keyAllLineStr=self.keyAllLineStr+key_arr_str+"\n"

	def NodeAllLoop(self,selectRef,HipsCtrlName,startFrame,endFrame):
		
		# 指定したノード以下全てを検索
		CtrlNodeAll=cmds.ls(HipsCtrlName,dag=1)
		#CtrlNodeAll=cmds.ls(selectRef,dag=1)
		print("CtrlNodeAll= "+str(CtrlNodeAll))
		
		CtrlNodeAll.insert(0,selectRef)
		
		for CtrlNode in CtrlNodeAll:
			keyFrameData=""
			#0〜20の時間範囲内のオブジェクト「surface1」のすべてのキーフレームをクエリします。
			#
			keyFrames_rx = cmds.keyframe( CtrlNode,at='rx', time=(startFrame,endFrame), query=True, valueChange=True, timeChange=True);
			keyFrames_ry = cmds.keyframe( CtrlNode,at='ry', time=(startFrame,endFrame), query=True, valueChange=True, timeChange=True);
			keyFrames_rz = cmds.keyframe( CtrlNode,at='rz', time=(startFrame,endFrame), query=True, valueChange=True, timeChange=True);
			
			self.key_to_add_line(CtrlNode,"rx",keyFrames_rx)
			self.key_to_add_line(CtrlNode,"ry",keyFrames_ry)
			self.key_to_add_line(CtrlNode,"rz",keyFrames_rz)
			#print("keyFrames_rx= "+str(keyFrames_rx))
			#print("keyFrames_ry= "+str(keyFrames_ry))
			#print("keyFrames_rz= "+str(keyFrames_rz))

			keyFrames_tx = cmds.keyframe( CtrlNode,at='tx', time=(startFrame,endFrame), query=True, valueChange=True, timeChange=True);
			keyFrames_ty = cmds.keyframe( CtrlNode,at='ty', time=(startFrame,endFrame), query=True, valueChange=True, timeChange=True);
			keyFrames_tz = cmds.keyframe( CtrlNode,at='tz', time=(startFrame,endFrame), query=True, valueChange=True, timeChange=True);
			#keyFrames=cmds.keyframe( sel、time =(185,206)、query = True、valueChange = True、timeChange = True);

			self.key_to_add_line(CtrlNode,"tx",keyFrames_tx)
			self.key_to_add_line(CtrlNode,"ty",keyFrames_ty)
			self.key_to_add_line(CtrlNode,"tz",keyFrames_tz)

			#print("keyFrames_tx= "+str(keyFrames_tx))
			#print("keyFrames_ty= "+str(keyFrames_ty))
			#print("keyFrames_tz= "+str(keyFrames_tz))
			
			keyFrames_sx = cmds.keyframe( CtrlNode,at='sx', time=(startFrame,endFrame), query=True, valueChange=True, timeChange=True);
			keyFrames_sy = cmds.keyframe( CtrlNode,at='sy', time=(startFrame,endFrame), query=True, valueChange=True, timeChange=True);
			keyFrames_sz = cmds.keyframe( CtrlNode,at='sz', time=(startFrame,endFrame), query=True, valueChange=True, timeChange=True);
			
			self.key_to_add_line(CtrlNode,"sx",keyFrames_sx)
			self.key_to_add_line(CtrlNode,"sy",keyFrames_sy)
			self.key_to_add_line(CtrlNode,"sz",keyFrames_sz)
			
		print("self.keyAllLineStr ="+ self.keyAllLineStr)
		self.fileWrite()
		
	def fileWrite(self):
		
		import codecs

		fout = codecs.open('C:/Users/whaison/Documents/maya/2016/ja_JP/scripts/python/MotionMerge/p030motionbuilder_chimera_0_Start/HumanIK_Effecter_Ctrl_AnimationExporter_keyFrameData.csv', 'w', 'utf_8')
		fout.write(self.keyAllLineStr)




ClassIns = HumanIK_Effecter_Ctrl_AnimationExporter()
ClassIns.MainWay()

HumanIK Effecter Ctrl Animation Importer

import maya.cmds as cmds

class HumanIK_Effecter_Ctrl_AnimationImporter:
	def MainWay(self):

		selects=cmds.ls(sl=True)
		selectRef=selects[0]
		print("selectRef= "+selectRef)

		_CtrlIndex=selectRef.find("_Ctrl")
		print("_CtrlIndex= "+str(_CtrlIndex))

		SkeletonName=selectRef[0:_CtrlIndex]
		print("SkeletonName= "+SkeletonName)

		HipsCtrlName=SkeletonName+"_Ctrl_Hips"
		print("HipsCtrlName= "+HipsCtrlName)
		
		startFrame=185
		endFrame=206


		self.keyAllLineStr=""
		
		#self.NodeAllLoop(HipsCtrlName,startFrame,endFrame,)
		
		self.fileReader()
		
		
	def fileReader(self):
		
		import codecs
		fin = codecs.open('C:/Users/whaison/Documents/maya/2016/ja_JP/scripts/python/MotionMerge/p030motionbuilder_chimera_0_Start/HumanIK_Effecter_Ctrl_AnimationExporter_keyFrameData.csv', 'r', 'utf_8')
		for line in fin:
			print("line= "+line)
			if(line==""):
				pass
			else:
				self.line_to_setkeyframe(line)
			
	
	def line_to_setkeyframe(self,line):
		key_arr=line.split(",")
		CtrlName=key_arr[0]
		print("CtrlName= "+CtrlName)
		Way=key_arr[1]
		print("Way= "+Way)
		key_arr_len=len(key_arr)
		frameStr=""
		valueStr=""
		for i in range(2,key_arr_len):
			val=key_arr[i]
			
			if i % 2 == 0:
				print('frame= '+val)
				frameStr=val
				framefloat=float(frameStr)
			else:
				print('Value= '+val)
				valueStr=val
				valuefloat=float(valueStr)
				print('cmds.setKeyframe( '+CtrlName+","+Way+",t="+str(framefloat)+",v="+str(valuefloat)+")")
				try:
					cmds.setKeyframe( CtrlName, attribute=Way, t=framefloat,v=valuefloat)
				except OSError as err:
					print("OS error: {0}".format(err))
				except ValueError:
					print("Could not convert data to an integer.")
				except:
					print("Unexpected error:", sys.exc_info()[0])
					raise
				
	
	def NodeAllLoop(self,HipsCtrlNam,startFrame,endFramee):
		
		# 指定したノード以下全てを検索
		CtrlNodeAll=cmds.ls(HipsCtrlName,dag=1)
		print("CtrlNodeAll= "+str(CtrlNodeAll))
		
		for CtrlNode in CtrlNodeAll:
			pass
"""
keyFrames_rx= [185.0, 21.089741780299963, 186.0, 21.15808805587963, 187.0, 21.57269253024709, 188.0, 15.651666434240237, 189.0, -27.60824368710669, 190.0, -66.8640151602632, 191.0, -3.6033652533432057, 192.0, -12.976039746033836, 193.0, 21.089741780299963, 206.0, 21.089741780299963]
keyFrames_ry= [185.0, 64.06950181042265, 186.0, -43.06801204369242, 187.0, -42.23534535644165, 188.0, 6.3003207259776, 189.0, -18.619267402281043, 190.0, -46.39726736167605, 191.0, 7.25455667934068, 192.0, 22.112923704038533, 193.0, 64.06950181042265, 206.0, 64.06950181042265]
keyFrames_rz= [185.0, -39.35273351243995, 186.0, -71.88505367073185, 187.0, -71.23919938208138, 188.0, -12.884469861914607, 189.0, -23.728143045065494, 190.0, 1.5441603410596807, 191.0, -29.38106191819622, 192.0, 27.959038658924545, 193.0, -39.35273351243995, 206.0, -39.35273351243995]

#tx
keyFrames_tx= [185.0, -31.063541412353516, 186.0, 13.386266787875757, 187.0, 12.569612782818957, 188.0, -68.13177446430325, 189.0, -14.078931727868042, 190.0, 34.98399964606946, 191.0, -58.035783944634446, 192.0, 38.62583642912938, 193.0, -31.063541412353516, 206.0, -31.063541412353516]
keyFrames_ty= [185.0, 103.91255187988281, 186.0, 160.48102799110984, 187.0, 135.33789404307092, 188.0, 123.42318340077544, 189.0, 143.61781646990772, 190.0, 162.44752777221774, 191.0, 147.59765966522042, 192.0, 149.99067818831213, 193.0, 103.91255187988281, 206.0, 103.91255187988281]
keyFrames_tz= [185.0, -13.255008697509766, 186.0, 126.81360281638925, 187.0, 114.12469622889218, 188.0, 62.25401426920391, 189.0, 116.16546039338427, 190.0, 124.82832123482547, 191.0, 79.97223357269715, 192.0, 43.964009286900165, 193.0, -13.255008697509766, 206.0, -13.255008697509766]

cmds.setKeyframe( 'group_meshHIK_TposeSK_Ctrl_Reference', attribute='translateX', t=186.0,v=-27.940739594423125,)
cmds.setKeyframe( 'group_meshHIK_TposeSK_Ctrl_Reference', attribute='rotationX', t=186.0,v=-27.940739594423125,)
cmds.setKeyframe( 'group_meshHIK_TposeSK_Ctrl_Reference', attribute='rx', t=186.0,v=-27.940739594423125,)

cmds.setKeyframe( 'group_meshHIK_TposeSK_Ctrl_RightArm', attribute='rx', t=185.0,v=21.15808805587963)
cmds.setKeyframe( 'group_meshHIK_TposeSK_Ctrl_RightArm', attribute='ry', t=185.0,v=-43.06801204369242)
cmds.setKeyframe( 'group_meshHIK_TposeSK_Ctrl_RightArm', attribute='rz', t=185.0,v=-71.88505367073185)
#translate
cmds.setKeyframe( 'group_meshHIK_TposeSK_Ctrl_RightWristEffector', attribute='tx', t=186.0,v= 13.386266787875757)
cmds.setKeyframe( 'group_meshHIK_TposeSK_Ctrl_RightWristEffector', attribute='ty', t=186.0,v=160.48102799110984)
cmds.setKeyframe( 'group_meshHIK_TposeSK_Ctrl_RightWristEffector', attribute='tz', t=186.0,v=126.81360281638925)
"""
ClassIns=HumanIK_Effecter_Ctrl_AnimationImporter()
ClassIns.MainWay()

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です