首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将模型从3D软件导入到OpenGL中?

如何将模型从3D软件导入到OpenGL中?
EN

Stack Overflow用户
提问于 2011-08-20 18:08:32
回答 2查看 7K关注 0票数 1

如何将3D模型从像MAYA这样的3D建模软件导入到OpenGL中,特别是对于PC而不是Iphone开发?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-20 19:09:18

也许这会让你大吃一惊,但OpenGL没有“模特”这样的东西。OpenGL所做的是,它接受一堆数据,您需要让OpenGL访问这些数据,以便它对这些数据执行的操作将在屏幕上产生漂亮的图像。

在介绍之后,假设你得到了一个模型,就像一个立方体。一个立方体由6个面组成,每个面有4个角。虽然每个角的位置都由3个面共享,但面的方向,即所谓的法线,在那个角上会有很大的不同,这取决于你正在看的是哪一个面。位置、法线和其他一些属性形成了所谓的顶点。因此,对于一个立方体,我们有6*4= 24个顶点(大写位置,下法线)

代码语言:javascript
运行
复制
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
…

以此类推,我希望您能明白这一点。每条线形成一个顶点矢量。此向量的格式是任意的。您可以放置这些属性(位置、法线等)在一个公共的交错数组中,或者在其自己的数组中为每个属性使用多个数组。不过,交错数组通常更有效。

与顶点列表一起,您还有一个面的列表,即顶点索引的元组,对于面,因此在立方体的情况下,这些元组将指定为

代码语言:javascript
运行
复制
0, 1, 2, 3
4, 5, 6, 7
...
20, 21, 22, 23

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

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

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

在客户端顶点数组的情况下,这是通过以下方式完成的

代码语言:javascript
运行
复制
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);

}

你要么自己实现模型加载器,要么使用一些第三方库来完成这项任务。

票数 11
EN

Stack Overflow用户

发布于 2011-08-20 18:44:24

Maya可以导出为各种格式。现在,主要使用FBX,因为它得到了许多艺术包的支持。

如果你正在用c++编写应用程序,有一个FBX可以用来读取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,这也是常用的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7131119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档