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 ireturn 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:BoneGeometryFace_R_Bone=getObjectByType prefix_name:"Face_R_"  object_type:BoneGeometryif 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_nameFace_R_Bone.pos.x = -Face_L_Bone[i].pos.xFace_R_Bone.pos.y = Face_L_Bone[i].pos.yFace_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_nameFace_L_Bone.pos.x = -Face_R_Bone[i].pos.xFace_L_Bone.pos.y = Face_R_Bone[i].pos.yFace_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


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部