有关obj文件的那些事儿

问题描述

前两三个月,程序那边自动生了一些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"

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值