转载:https://www.cnblogs.com/Taiwantomzhang/p/3993703.html
.obj文件中,每一行都有表明该行意义的标志符。
"v"--点的坐标,顺序为x, y, z;
"vt"--纹理坐标,顺序为x, y;
"vn"--法向量坐标,顺序为x, y, z;
"f"--面所用到的点坐标/纹理坐标/法向量坐标的索引;
"mtllib"--.obj文件用到的material库文件;
"g"--组group的名称;
"usemtl"--一旦使用了该标志符,则在该标志符后面的"f"全部受影响,直到遇到下一个"usemtl";“usemtl”标志符用到的material都是从material库文件中取出的;group里面的"f"可以使用0-N个"usemtl"对面的显示渲染进行控制,当使用了大于1个“usemtl”标志符,程序处理时对于已经读取的"f"很难控制;同时查看obj读取的源码,有的用到了这个标志符,有的没有使用该标志,有的使用了"usemtl"标志符对所读取的"f"面进行分割,本文的处理是使用"usemtl"标志符将"f"面分割为mesh,但是考虑到不同的group可以使用相同的"usemtl”标志(即不同的group都使用了 usemtl AAA),因此将"g"与"usemtl"结合起来,二者的名称作为mesh的名称。
转载:https://blog.csdn.net/qq_26900671/article/details/81739977
以一个立方体模型的obj文件为例:
# 一些注释 mtllib cube.mtl g default v -0.500000 -0.500000 0.500000 v 0.500000 -0.500000 0.500000 v -0.500000 0.500000 0.500000 v 0.500000 0.500000 0.500000 v -0.500000 0.500000 -0.500000 v 0.500000 0.500000 -0.500000 v -0.500000 -0.500000 -0.500000 v 0.500000 -0.500000 -0.500000 vt 0.001992 0.001992 vt 0.998008 0.001992 vt 0.001992 0.998008 vt 0.998008 0.998008 vt 0.001992 0.001992 vt 0.998008 0.001992 vt 0.001992 0.998008 vt 0.998008 0.998008 vt 0.001992 0.001992 vt 0.998008 0.001992 vt 0.001992 0.998008 vt 0.998008 0.998008 vt 0.001992 0.001992 vt 0.998008 0.001992 vt 0.001992 0.998008 vt 0.998008 0.998008 vt 0.001992 0.001992 vt 0.998008 0.001992 vt 0.001992 0.998008 vt 0.998008 0.998008 vt 0.998008 0.998008 vt 0.001992 0.998008 vt 0.998008 0.001992 vt 0.001992 0.001992 vn 0.000000 0.000000 1.000000 vn 0.000000 0.000000 1.000000 vn 0.000000 0.000000 1.000000 vn 0.000000 0.000000 1.000000 vn 0.000000 1.000000 0.000000 vn 0.000000 1.000000 0.000000 vn 0.000000 1.000000 0.000000 vn 0.000000 1.000000 0.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 -1.000000 0.000000 vn 0.000000 -1.000000 0.000000 vn 0.000000 -1.000000 0.000000 vn 0.000000 -1.000000 0.000000 vn 1.000000 0.000000 0.000000 vn 1.000000 0.000000 0.000000 vn 1.000000 0.000000 0.000000 vn 1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 vn -1.000000 0.000000 0.000000 s 1 g pCube1 usemtl file1SG f 1/1/1 2/2/2 3/3/3 f 3/3/3 2/2/2 4/4/4 s 2 f 3/13/5 4/14/6 5/15/7 f 5/15/7 4/14/6 6/16/8 s 3 f 5/21/9 6/22/10 7/23/11 f 7/23/11 6/22/10 8/24/12 s 4 f 7/17/13 8/18/14 1/19/15 f 1/19/15 8/18/14 2/20/16 s 5 f 2/5/17 8/6/18 4/7/19 f 4/7/19 8/6/18 6/8/20 s 6 f 7/9/21 1/10/22 5/11/23 f 5/11/23 1/10/22 3/12/24
上述文件为一个立方体,总共有8个顶点(v开头的行正好是8行),而对于纹理坐标和法线,相同的顶点在不同三角面片上是不同的,在立方体中,一个顶点为三个面共有,所以纹理坐标和法线的描述应该有8*3=24行(vt,vn开头的行正好各是24行)。
各个顶点的数据都有了,我们还需要索引数据。
对于我们通常写的3D程序来说,一个索引值对应于一个顶点,这个顶点有固定的空间坐标,纹理坐标,法线。
而对于obj文件,一个索引值对应于一个顶点数据的空间坐标,或者纹理坐标,法线,且由1开始计数。
比如说,对于上述的立方体obj文件,
v的行从v开始的第一行直到结束的第八行分别对应于索引1-8,
vt的行从vt开始的第一行直到结束的第二十四行分别对应于索引1-24,
vn的行从vn开始的第一行直到结束的第二十四行分别对应于索引1-24。
然后我们就可以自由组合v 索引/vt索引/vn索引,来得到需要的顶点。
再接着往下看,f开头的行,正如你所想,表示面(face),以3个v索引/vt索引/vn索引描述的顶点组成。
对于其他信息,基本上都可以选择忽略,注意#开头的是注释。