max面部骨骼镜像脚本

max面部骨骼镜像脚本

1.问题描述

绑定过程中需要给不同模型搭建面部骨骼,左右两边不能同时操作,所以就想写个脚本实现

2.遇到问题

1.面部骨骼必须要有一定的规则区分左右,比如包含"Face_L_"或者 "Face_R_"等字符串,这是制作脚本的前提。

2.以execute("$'" + "Face_L_" + "*'")where classof i ==BoneGeometry列出场景包含指定字符的Bone骨骼,这种方式获取的骨骼是没有层级关系的。也就是有可能出现先对好子骨骼位置,再对父骨骼位置然后子骨骼位置错乱的情况。因而要对获取的骨骼数组进行父子层级排序。

3.按照指定骨骼层级的方式查找骨骼execute("$" +"'Bip001 Head'.../"+ "Face_L_" + "*'"),返回的数组会进行一个层级排序,可以解决问题。

3.插件截图

![在这里插入图片描述](https://img-blog.csdnimg.cn/473dd61703be439caf86a85e0db621e6.png

4.代码如下

--根据物体类型和前缀删选物体
fn getObjectByType prefix_name:  object_type: =
		(
			--execute("$'" + prefix_name + "*'") 类似于$Face_L*
			Face_bone_list=execute("$" +"'Bip001 Head'.../"+ prefix_name + "*'")
			if  Face_bone_list.count!=0 then
			(
				object_array=#()
				for i in Face_bone_list  where  classof i ==object_type  do
				(
					append object_array i
				)
						
				--按命名进行排序
				--object_array=for i in sort(for i in object_array collect i.name) collect getnodebyname i
				return object_array
			)
			else
			(
			return 0
			)
			
		)
--替换字符串
fn replaceString str1 str2 str3=(
		while ((i=findstring str1 str2) != undefined) do
		(
			str1 = replace str1 i str2.count str3
		)
		return str1
	)
	
--窗口
try destroyDialog ::MirrorFaceBone catch() --关闭已有窗口
rollout MirrorFaceBone "MirrorFaceBone"
(
	radiobuttons MirrorFaceBone_rbt "Mirror Direction:" \
	labels:#("L---R", "R---L") columns:2 pos: [40,30] align:#left\
	offsets:#([100,-16], [40,-16])
	
	button mirrorButton "Mirror Face Bone" width:200 height:30 pos: [60,60]
	on mirrorButton pressed do (
			Face_L_Bone=getObjectByType prefix_name:"Face_L_"  object_type:BoneGeometry
			Face_R_Bone=getObjectByType prefix_name:"Face_R_"  object_type:BoneGeometry
		if Face_L_Bone!=0 and Face_R_Bone!=0 then
		(
			if 	Face_L_Bone.count==Face_R_Bone.count then
			(
				if MirrorFaceBone_rbt.state == 1 do
				(
					for i = 1 to Face_R_Bone.count do
						(
						
						Face_R_Bone_name=replaceString Face_L_Bone[i].name "Face_L_" "Face_R_"
						Face_R_Bone=getnodebyname Face_R_Bone_name
						Face_R_Bone.pos.x = -Face_L_Bone[i].pos.x
						Face_R_Bone.pos.y = Face_L_Bone[i].pos.y
						Face_R_Bone.pos.z = Face_L_Bone[i].pos.z

			
						)
				)
				
				if MirrorFaceBone_rbt.state == 2 do
				(
					for i = 1 to Face_R_Bone.count do
						(
						Face_L_Bone_name=replaceString Face_R_Bone[i].name "Face_R_" "Face_L_"
						Face_L_Bone=getnodebyname Face_L_Bone_name
						Face_L_Bone.pos.x = -Face_R_Bone[i].pos.x
						Face_L_Bone.pos.y = Face_R_Bone[i].pos.y
						Face_L_Bone.pos.z = Face_R_Bone[i].pos.z
						)
				)
			)
			else
			(
				messageBox ("捏脸骨骼左右两边骨骼数量不一致")
			)
		)
		else
		(
			messageBox ("Bip001 Head层级下没有子骨骼,请先将捏脸骨骼p给Bip001 Head")
		)
	)
)
createdialog MirrorFaceBone width: 320 height: 115
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值