【问题标题】:How to Import models from 3D software, like Maya into OpenGL? [closed]如何将模型从 3D 软件(如 Maya)导入 OpenGL? [关闭]
【发布时间】:2017-02-19 21:57:34
【问题描述】:

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

【问题讨论】:

  • 感谢大家的贡献!我得到了 Brad Larson 给出的解决方案。非常感谢他……! :) 好吧,我为错误地将这个先前提出的问题发布到论坛而道歉。再次感谢所有在这里回复的人。

标签: opengl 3d maya


【解决方案1】:

也许这会让您感到惊讶,但 OpenGL 没有“模型”这样的东西。 OpenGL 所做的是,它接受一堆数据,然后由您让 OpenGL 访问这些数据,以便它对这些数据执行的操作会在屏幕上生成漂亮的图像。

所以在介绍之后,假设你有一个模型,比如一个立方体。一个立方体由 6 个面组成,每个面有 4 个角。虽然每个角位置由 3 个面共享,但面方向(即所谓的法线)在该角上非常不同,具体取决于您正在查看的面。位置、法线和其他一些属性构成了所谓的顶点。因此对于一个立方体,我们有 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
…

等等,我希望你明白。每条线形成一个顶点向量。这个向量的格式是任意的。您可以将这些属性(Position、Normal 等)放置在一个通用的 interleaved 数组中,或者在其自己的数组中为每个属性使用多个数组。不过,交错数组通常效率更高。

除了顶点列表之外,您还有一个面列表,即顶点索引的元组,对于一个面来说,在立方体的情况下,这些元组指定的四边形将是

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

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

然后您将此数据提供给 OpenGL。有两种选择:将数据保存在程序的进程地址空间(客户端顶点数组)中,或者将数据上传到 OpenGL 缓冲区对象(顶点缓冲区对象)中。

然后你告诉 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);

}

您可以自己实现模型加载器,或者使用一些第三方库来完成此任务。

【讨论】:

  • 非常感谢!听起来不错。
【解决方案2】:

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,这也是常用的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 2015-08-06
    相关资源
    最近更新 更多