一个导出3dmax场景模型数据的简单案列。这里用二进制文件的方式进行数据储存。导出模型最基本的顶点相关数据。(3dmax版本以9.0为例)
首先得设计一个简单的模型文件结构储存顶点与面索引
Data:0x5FD size:4 ===== 这是一个整数标识,代表一个顶点数据区开头,可以随便取,数据必须占用规定的字节,这里是用4字节分配。
Data:numVerts size:4 ==== 到这里就是开始放顶点相关的数据,这个是储存模型顶点数量。
接下来就是存放顶点坐标值,以一个float为单位,每一个顶点有xyz三个浮点值表示。
所有顶点整齐排列下去。上面已经保存了顶点个数,所以读出了顶点个数 ,然后numVerts * 3 * 4的值便是该数据区的大小了。
储存完顶点后就是面信息了,面储存的是顶点编号索引。三角面为单位,构成该面的三个顶点编号采用unsigned int 类型储存。
首先还是一样先定义一个值 0X0C8E 表示接下来就是模型面的信息区了。标识很重要,可以检测该文件是否自己想要读取的,或者上一个数据区是否读取正确,如果读取不正确,哪怕有一个bit的偏差,接下来的值肯定就不是预料中的值,即可以断定读取文件出错,退出读取。
Data:0x0C8E size:4
Data:numFaces size:4 ==== 三角面的个数4字节存放
接下来就是依次储存每一个面的三个顶点索引值了,每一个索引值是unsigned int 四字节。
到这里这些数据已经可以描述一个模型的轮廓了。
下面是Maxscript中对文件的操作函数介绍:
fopen -- 打开一个文件,接受两个参数,参数1是文件储存的地址字符串。参数2<mode>是读取的类型 用二进制还是文本(跟C语言的fopen类似),读取完成返回<BinStream>类型,可以把它当做类似于C语言的FILE* fp文件指针,之后的读写函数需要用到它。
Fclose -- 与fopen成对的操作,结束文件操作
WriteLong -- 写入一个占四字节的整形,2个参数是必须的,参数1是要操作的文件流,就是fopen的返回值,参数2是要写入的值,如果要写入无符号整形,则加入第三个参数(#unsigned)即可。类似的函数有 WriteShort、WriteByte 分别写入2字节和单字节的整型值。
WriteFloat -- 写入4字节的浮点型
接下来写出上面的文件结构maxscript脚本代码:
--定义一个GL_OutPutData的函数,参数个数定为2个,第一个是要导出的模型,第二个是文件保存的地址字符串
fn GL_OutPutData iobj fileadr = ( if( superclassof iobj != GeometryClass )then( return false ) -- 检查需要导出的物体是否为网格物体 local fp = fopen fileadr "wb" --二进制打开创建文件 if( fp == undefine )then ( print "Open file fails!" return false ) local numVerts = GetNumVerts iobj.mesh --取得顶点数量 local numFaces = GetNumFaces iobj.mesh --取得面的数量 writelong fp 1533 --写入顶点数据标识 writeLong fp numVerts #unsigned --写入顶点数量到文件 for i in 1 to numverts do --遍历所有顶点 ( local vd = getVert iobj.mesh i --取得顶点坐标 writefloat fp vd[1] writefloat fp vd[2] writefloat fp vd[3] ) writelong fp 3214 --写入面数据标识 writelong fp numFaces --写入面的数量 for i in 1 to numFaces do --遍历每一个三角面 ( local fd = getface iobj.mesh i --取得面的顶点索引 writelong fp (fd[1]-1) #unsigned --写入面的索引,注意maxscript顶点编号是从1开始的而非从0开始 writelong fp (fd[2]-1) #unsigned writelong fp (fd[3]-1) #unsigned ) fclose fp --关闭文件 )
运行脚本后,只要在脚本输入区敲入一个函数即可导出模型的数据了。如场景中新建一个名字为"tp“的茶壶,在脚本区输入 ( GL_OutPutData $tp "D:\tp.data" )
敲回车运行即可导出模型。在D盘可找到tp.data的文件,只要按照设计的文件结构即可读取出模型的数据,现在在opengl中可以很轻松的利用顶点数组直接套用此数据格式
绘制出模型了。
可以参考maxscript帮助手册,继续写入模型的其它信息。这里只是记录一个非常简单的流程。