如何将模型从Maya导入到OpenGL中?

时间:2011-08-20 10:08:32

标签: opengl 3d maya

如何从MAYA等3D建模软件中将3D模型导入OpenGL,尤其是PC而不是Iphone开发?

2 个答案:

答案 0 :(得分:11)

也许这让你感到惊讶,但是OpenGL没有像“模特”这样的资格。 OpenGL的作用是什么,它接受一堆数据,你可以让OpenGL访问这些数据,这样它对这些数据执行的操作就能在屏幕上产生漂亮的图像。

所以在介绍之后,让我们说你有一个模型,就像一个立方体。立方体由6个面组成,每个面有4个角。虽然每个角落位置由每个3个面共享,但是面部方向(所谓的“正常”)在该角落上是非常不同的,这取决于您正在查看的面部。 Position,Normal和一些其他属性形成所谓的顶点。因此,对于立方体,我们有6 * 4 = 24个顶点(资本位置,正常值较低)

X,   Y,  Z,  x,  y,  z
-1, -1, -1, -1,  0,  0
-1, -1,  1, -1,  0,  0
-1,  1,  1, -1,  0,  0
-1,  1, -1, -1,  0,  0
 1, -1, -1,  1,  0,  0
 1, -1,  1,  1,  0,  0
 1,  1,  1,  1,  0,  0
 1,  1, -1,  1,  0,  0
…

等等,我希望你明白这个主意。每行形成顶点向量。该向量的格式是任意的。您可以将这些属性(位置,正常等)放在一个公共的 interleaved 数组中,或者为自己的数组中的每个属性使用多个数组。但是,交错阵列通常效率更高。

与顶点列表一起,你还有一个面列表,即顶点索引的元组,对于一个面,所以在多维数据集的情况下那些元组,指定四边形将是

0, 1, 2, 3
4, 5, 6, 7
...
20, 21, 22, 23

加载模型意味着,您编写了一些从模型文件格式读取数据的程序(最好是记录的文件格式,或者您自己想出的一个程序,并为您的建模程序编写导出程序)。然后以上面概述的方式将读取的数据放入存储器中,以便OpenGL可以使用它。

然后,您将此数据提供给OpenGL。有两种选择:将数据保存在程序的进程地址空间(Client Side Vertex Arrays)中,或者将数据上传到OpenGL缓冲区对象(Vertex Buffer Object)。

然后告诉OpenGL获取其几何数据。

对于客户端侧顶点阵列,这可以通过以下方式完成

GLenum primitive_mode;
GLfloat *vertex_data;
GLushort *indices_data;
int face_count;


void load_model(...)
{
    /* ... */
    read_vertex_data_from_file(&vertex_data, 
                               &indices_data, 
                               &face_count, 
                               &primitive_mode, ...);

}

/*...*/

void draw_model()
{
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_NORMAL_ARRAY);

    glVertexPointer(
                    3, /* we're supplying vectors of which the 3 first elements are to be used for vertex position */
                    GL_FLOAT, /* the type of each vector element is GLfloat */
                    sizeof(GLfloat)*6, /* the beginnings of vectors in vertex_data are 6 * sizeof(GLfloat) apart */
                    vertex_data + 0 /* the pointer to the data, positions are offset 0 */
    );

    glNormalPointer( /* normals always have 3 elements, no size given */
                    GL_FLOAT, /* the type of each vector element is GLfloat */
                    sizeof(GLfloat)*6, /* the beginnings of vectors in vertex_data are 6 * sizeof(GLfloat) apart */
                    vertex_data + 3 /* the pointer to the data, normals are offset 3 */
    );

    glDrawElements(primitive_mode, face_count, GL_UNSIGNED_SHORT, indices_data);

}

您可以自己实施模型加载器,也可以使用某些第三方库来完成此任务。

答案 1 :(得分:1)

Maya可以导出为各种格式。如今,主要使用FBX是因为它受到许多艺术包的支持。

如果您正在用c ++编写应用程序,可以使用FBX Api来读取fbx文件: http://usa.autodesk.com/adsk/servlet/index?siteID=123112&id=7478532

我认为XNA在后台的内容管道中使用了这个sdk。 (如果你熟悉xna)

还有一个Python库,可以方便地从fbx文件中提取所需的数据:http://download.autodesk.com/us/fbx/20112/FBX_SDK_HELP/files/WS73099cc142f48755-751de9951262947c01c-6dc7.htm

您也可以使用python在Maya中编写自己的导出脚本,但请注意,这不是一项简单的任务。

我确定你是否有点谷歌,你会发现其他格式的进口商,如.obj,这也是常用的。