问题描述
前两三个月,程序那边自动生了一些blendshape,然后让绑定这边整理下看下效果。文件拿过来后有点傻了眼,394个obj文件,而且每一个obj文件导进Maya命名都是“Mesh”,这就有点难受了
解决方法
没办法,只能批量导出obj文件了,然后批量命名,命名的话就根据文件的名字
#coding=utf-8
import pymel.core as pm
import maya.cmds as mc
import os,time
path=r"F:\work\s2a_tensor\s2a_tensor"
def importObjFile(path,pre=None):
file=[i for i in [os.path.join(path,file) for file in os.listdir(path) if file.endswith(".obj")] if os.path.isfile(i)]
if len(file)>0:
for file_name in file:
obj_name=file_name.split('\\')[-1].split('.')[0]
if pre==None:
if obj_name.isdigit():
pm.error("Please add a prefix")
mc.file(file_name,i=1,type="OBJ",ignoreVersion=1,ra=True,mergeNamespacesOnClash=True,namespace=":",options="mo=1",pr=1,importTimeRange="combine")
if pm.objExists("Mesh"):
pm.rename("Mesh",obj_name)
else:
mc.file(file_name,i=1,type="OBJ",ignoreVersion=1,ra=True,mergeNamespacesOnClash=True,namespace=":",options="mo=1",pr=1,importTimeRange="combine")
if pm.objExists("Mesh"):
pm.rename("Mesh",(pre+obj_name))
else:
pm.warning("don't have obj File to import")
return True
importObjFile(path,"obj_")
值得注意的是以纯数字命名的obj文件名在maya重命名会出错,需要加前缀
追加问题
如果导入进来的obj文件不是命名Mesh呢?我就牵扯到一个问题,我需要获取每次导入的模型,然后按文件名进行重命名。获取导入模型的方法是检索导入前和导入后两个list的区别,为了保险起见,我对obj文件按照命名进行重新排序,然后再进行导入,代码如下:
#coding=utf-8
import pymel.core as pm
import maya.cmds as mc
import os,time
def importObjFile(path):
file_list=[i.split('\\')[-1] for i in [os.path.join(path,file) for file in os.listdir(path) if file.endswith(".obj")] if os.path.isfile(i)]
#文件名按数字排序
file_list.sort(key= lambda x:int(re.split('(\D+)', x)[0]))
if len(file)>0:
for file_name in file_list:
old_list=mc.ls(assemblies = True)
obj_name="_".join(file_name.split('.')[0].split('_')[1:])
aa=mc.file(file_name,i=1,type="OBJ",ignoreVersion=1,ra=True,mergeNamespacesOnClash=True,namespace=":",options="mo=1",pr=1,importTimeRange="combine")
new_list=mc.ls(assemblies = True)
mesh_list=list(set(new_list).difference(set(old_list)))
if mesh_list:
pm.rename(mesh_list[0],obj_name)
else:
pm.warning("don't have obj File to import")
path=r'D:\aa\bb'
importObjFile(path)
问题扩展
为什么模型或者程序那边以obj文件给的blendshape导进maya,有时候会命名成"Mesh",有时候又是原本名称呢。顺着这个问题,研究了下obj文件格式。在maya里创建一个"pCube1",并导出obj文件,用记事本打开
参数说明
1. mtllib
此前缀后指定了此OBJ文件所使用的材质库文件(*.mtl)的文件路径
2. v
指定一个顶点的坐标
3. vt
指定一个顶点的纹理坐标
4. nt
指定一个顶点的发现向量
5. f
表示一个面
f 1 2 3
这样的行表示以第1、2、3号顶点组成一个三角形。
f 1/3 2/5 3/4
这样的行表示以第1、2、3号顶点组成一个三角形,其中第一个顶点的纹理坐标的索引值为3。
f 1/3/4 2/5/6 3/4/2
这样的行表示以第1、2、3号顶点组成一个三角形,其中第一个顶点的纹理坐标的索引值为3,其法线的索引值是4。
f 1//4 2//6 3//2
这样的行表示以第1、2、3号顶点组成一个三角形,且忽略纹理坐标。其中第一个顶点的法线的索引值是4;
需要注意的是文件中的索引值是以1作为起点的
6. g
组名称
7. s
光滑组
也就是说,我把obj文件中的这行"g initialShadingGroup pCube1"
改成"g myobj"
,再用maya导入,物体的名称就会变为"myobj"