欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

有关obj文件的那些事儿

程序员文章站 2022-03-20 08:21:05
...

问题描述

前两三个月,程序那边自动生了一些blendshape,然后让绑定这边整理下看下效果。文件拿过来后有点傻了眼,394个obj文件,而且每一个obj文件导进Maya命名都是“Mesh”,这就有点难受了
有关obj文件的那些事儿

解决方法

没办法,只能批量导出obj文件了,然后批量命名,命名的话就根据文件的名字
有关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,mergeNamespacesOn*=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,mergeNamespacesOn*=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文件给的blendshape导进maya,有时候会命名成"Mesh",有时候又是原本名称呢。顺着这个问题,研究了下obj文件格式。在maya里创建一个"pCube1",并导出obj文件,用记事本打开
有关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"