1、顶点数据(Vertex data):v 几何体顶点 (Geometric vertices) vt 贴图坐标点 (Texture vertices) vn 顶点法线 (Vertex normals) vp 参数空格顶点 (Parameter space vertices) 自由形态曲线(Free-form curve)/表面属性(surface attributes):deg 度 (Degree) bmat 基础矩阵 (Basis matrix) step 步尺寸 (Step size) cstype 曲线或表面类型 (Curve or surface type) 元素(Elements):p
2、 点 (Point) l 线 (Line) f 面 (Face) curv 曲线 (Curve) curv2 2D曲线 (2D curve) surf 表面 (Surface) 自由形态曲线(Free-form curve)/表面主体陈述(surface body statements):parm 参数值 (Parameter values ) trim 外部修剪循环 (Outer trimming loop) hole 内部整修循环 (Inner trimming loop) scrv 特殊曲线 (Special curve) sp 特殊的点 (Special point) end 结束陈述
3、 (End statement) 自由形态表面之间的连接(Connectivity between free-form surfaces):con 连接 (Connect) 成组(Grouping):g 组名称 (Group name) s 光滑组 (Smoothing group) mg 合并组 (Merging group) o 对象名称 (Object name) 显示(Display)/渲染属性(render attributes):bevel 导角插值 (Bevel interpolation) c_interp 颜色插值 (Color interpolation) d_interp
4、 溶解插值 (Dissolve interpolation) lod 细节层次 (Level of detail) usemtl 材质名称 (Material name) mtllib 材质库 (Material library) shadow_obj 投射阴影 (Shadow casting) trace_obj 光线跟踪 (Ray tracing) ctech 曲线近似技术 (Curve approximation technique) stech 表面近似技术 (Surface approximation technique) *Maya导出的OBJ文件:在Maya中创建一个多边形立方体
5、,选中这个立方体,导出格式为OBJ,文件名为cube.obj.(如果没有此格式,请在Plug-in Manager中载入objExport.mll) 用写字板打开。可以看到如下代码:# The units used in this file are centimeters. g default v -0.500000 -0.500000 0.500000 v(几何体顶点)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.
6、500000 v 0.500000 0.500000 -0.500000 v -0.500000 -0.500000 -0.500000 v 0.500000 -0.500000 -0.500000 vt 0.000000 0.000000 vt(贴图坐标点)vt 1.000000 0.000000 vt 0.000000 1.000000 vt 1.000000 1.000000 vt 0.000000 2.000000 vt 1.000000 2.000000 vt 0.000000 3.000000 vt 1.000000 3.000000 vt 0.000000 4.000000 vt
7、 1.000000 4.000000 vt 2.000000 0.000000 vt 2.000000 1.000000 vt -1.000000 0.000000 vt -1.000000 1.000000 vn 0.000000 0.000000 1.000000 vn(顶点法线)vn 0.000000 0.000000 1.000000 vn 0.000000 1.000000 0.000000 vn 0.000000 0.000000 -1.000000 vn 0.000000 -1.000000 0.000000 vn 1.000000 0.000000 0.000000 vn -1
8、.000000 0.000000 0.000000 s off s (光滑组组名称)g pCube1 usemtl initialShadingGroup f 1/1/1 2/2/2 4/4/3 3/3/4 f(面)f 3/3/5 4/4/6 6/6/7 5/5/8 f 5/5/9 6/6/10 8/8/11 7/7/12 f 7/7/13 8/8/14 2/10/15 1/9/16 f 2/2/17 8/11/18 6/12/19 4/4/20 f 7/13/21 1/1/22 3/3/23 5/14/24 这个文件看起来稍复杂一些,用到了许多关键词,你可以对照前面的列表查看一下每个关键词的
9、意思。解释一下:vt 1.000000 0.000000这句vt代表点的贴图坐标。vn 0.000000 0.000000 -1.000000vn代表点的法线。s off表示关闭光滑组。usemtl initialShadingGroup表示使用的材质。f 7/13/21这时在面的数据中多了贴图坐标uv点和法线的索引号,索引号分别用左斜线(/)隔开。格式:f 顶点索引/uv点索引/法线索引g pCube1表示组,这里的成组与Maya中的成组不一样,这里的成组是指把后出现的面都结合到一起,组成一个整的多边形几何体。把文件修改一下就知道成组的意思了。把这句后面的代码替换成以下代码:g pCube_
10、Face1 f 1/1/1 2/2/2 4/4/3 3/3/4 g pCube_Face2 g pCube_Face3 g pCube_Face4 g pCube_Face5 g pCube_Face6 导入Maya后可以看到,立方体的每个面是分离的,每个面的名称分别是pCube_Face(16),可见组的名称其实就是单独几何体的名称。*用中文命名几何体(组)并不总是顺利,把g 立方体面1这行改为g 选择再试试看,这回导入时模型根本无法出现,只会出现如下的错误信息:/ Error: line 1: Your OBJ file contains a line which is too long
11、to be parsed. Please edit your obj file. / Error reading file. / 由此可见,物体命名的不规范也是导致OBJ文件出错的原因之一。关于Maya的物体命名,英文名是很保险的,标点符号中只有下划线(_)可用,数字不能用放到名称的开头,尽量不要用中、日、韩等双字节文字。OBJ文件不支持有孔的多边形面。举个例子: 选择 Maya的创建多边形工具(Polygons - Create Polyon Tool),在视图中画一个四边形,不要按回车,按Ctrl在四边形中间点一下,可以继续在四边形中挖一个洞。把这个有孔的多边形存成OBJ格式,在导入 Ma
12、ya时,会发现多边形少了一块。如果你把这也看成错误,现在至少你已经知道错误的原因了,就是OBJ文件不支持有孔的多边形面。*OBJ文件不包含面的颜色定义信息,不过可以引用材质库,材质库信息储存在一个后缀是.mtl的独立文件中。关键字mtllib即材质库的意思。材质库中包含材质的漫射(diffuse),环境(ambient),光泽(specular)的RGB(红绿蓝)的定义值,以及反射(specularity),折射(refraction),透明度(transparency)等其它特征。usemtl指定了材质之后,以后的面都是使用这一材质,直到遇到下一个来指定新的材质。下面的例子说明了指定材质的方
13、法。Cube with Materials:# This cube has a different material # applied to each of its faces. mtllib master.mtl v 0.000000 2.000000 2.000000 v 0.000000 0.000000 2.000000 v 2.000000 0.000000 2.000000 v 2.000000 2.000000 2.000000 v 0.000000 2.000000 0.000000 v 0.000000 0.000000 0.000000 v 2.000000 0.0000
14、00 0.000000 v 2.000000 2.000000 0.000000 # 8 vertices g front usemtl red f 1 2 3 4 g back usemtl blue f 8 7 6 5 g right usemtl green f 4 3 7 8 g top usemtl gold f 5 1 4 8 g left usemtl orange f 5 6 2 1 g bottom usemtl purple f 2 6 7 3 # 6 elements 贝塞尔片面(Bezier Patch):Maya不能导出OBJ格式的贝塞尔片面,却能够导入它。导入的贝塞
15、尔片面自动转换为Nurbs表面。# 3.0 Bezier patch v -5.000000 -5.000000 0.000000 v -5.000000 -1.666667 0.000000 v -5.000000 1.666667 0.000000 v -5.000000 5.000000 0.000000 v -1.666667 -5.000000 0.000000 v -1.666667 -1.666667 0.000000 v -1.666667 1.666667 0.000000 v -1.666667 5.000000 0.000000 v 1.666667 -5.000000
16、0.000000 v 1.666667 -1.666667 0.000000 v 1.666667 1.666667 0.000000 v 1.666667 5.000000 0.000000 v 5.000000 -5.000000 0.000000 v 5.000000 -1.666667 0.000000 v 5.000000 1.666667 0.000000 v 5.000000 5.000000 0.000000 # 16 vertices cstype bezier deg 3 3 # Example of line continuation surf 0.000000 1.00
17、0000 0.000000 1.000000 13 14 15 16 9 10 11 12 5 6 7 8 1 2 3 4 parm u 0.000000 1.000000 parm v 0.000000 1.000000 end # 1 element 基数曲线(Cardinal Curve):Maya好像不支持OBJ格式的曲线,导入时不会出现错误信息,却也不会出现曲线。# 3.0 Cardinal curve v 0.940000 1.340000 0.000000 v -0.670000 0.820000 0.000000 v -0.770000 -0.940000 0.000000 v
18、 1.030000 -1.350000 0.000000 v 3.070000 -1.310000 0.000000 # 6 vertices cstype cardinal deg 3 curv 0.000000 3.000000 1 2 3 4 5 6 parm u 0.000000 1.000000 2.000000 3.000000 end *贴图映射(Texture-Mapped):# A 2 x 2 square mapped with a 1 x 1 square # texture stretched to fit the square exactly. vt 0.000000
19、 1.000000 0.000000 vt 0.000000 0.000000 0.000000 vt 1.000000 0.000000 0.000000 vt 1.000000 1.000000 0.000000 # 4 vertices usemtl wood # The first number is the point, # then the slash, # and the second is the texture point f 1/1 2/2 3/3 4/4 *说下顶点索引吧。我 们知道,对于每一个三角形,都需要用3个顶点来表示。例如在上面的立方体模型中,一共有623=36个
20、顶点。仔细想想就会知道, 在这36个顶点中,又相当数量的顶点是重合的。如果把这些重合的顶点都一一表示出来,就太浪费存储空间了。于是,我们提出了顶点索引的想法,解决空间占用 问题。顶点索引的思想是建立两个数组,一个数组用于存储模型中所有的顶点坐标值,另一个数组则存储每一个表面所对应的三个顶点在第一个数组中的索引。建立 这样的顶点索引显然更加节约存储空间。假设Indices:array of Integer是顶点索引数组,Vertices:array of TVertex是顶点数组,使用下面的代码段就可以把整个顶点索引对应的所有三角形绘制出来:procedure DrawIndex(Indices:array of Integer;Vertices:array of TVertex);var i :Integer;begin glBegin(GL_TRIANGLES); for i := 0 to (High(Vertices)+1) div 3 -1 do begin glVertex3fv(VerticesInd
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1