max面部骨骼镜像脚本
1.问题描述
绑定过程中需要给不同模型搭建面部骨骼,左右两边不能同时操作,所以就想写个脚本实现
2.遇到问题
1.面部骨骼必须要有一定的规则区分左右,比如包含"Face_L_"或者 "Face_R_"等字符串,这是制作脚本的前提。
2.以execute("$'" + "Face_L_" + "*'")
和where classof i ==BoneGeometry
列出场景包含指定字符的Bone骨骼,这种方式获取的骨骼是没有层级关系的。也就是有可能出现先对好子骨骼位置,再对父骨骼位置然后子骨骼位置错乱的情况。因而要对获取的骨骼数组进行父子层级排序。
3.按照指定骨骼层级的方式查找骨骼execute("$" +"'Bip001 Head'.../"+ "Face_L_" + "*'")
,返回的数组会进行一个层级排序,可以解决问题。
3.插件截图
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