OpenGL ES 学习教程 使用开源库 Assimp 将 Obj 模型 转换成自己的格式

Posted _Captain

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenGL ES 学习教程 使用开源库 Assimp 将 Obj 模型 转换成自己的格式相关的知识,希望对你有一定的参考价值。

前面都是在代码中手写 Cube 的顶点数据、UV坐标。虽然不是很多,但是看得还是肉疼。

在项目开发中可不能这么干,虽然咱们可以手写一个软件,但是要手敲一个模型的几千个顶点数据,这估计得找最强大脑。

模型有专门负责模型制作的人,她们使用3dmax 或者 maya 或者Blende来制作各种精美的模型,然后用QQ发给程序猿。

程序猿就负责把这些模型文件解析出来,从里面读取顶点信息、纹理信息、摄像机、灯光等等。

转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

由于世界上模型格式很多中,如果为每一种模型都去编写相应的解析代码那真是噩耗。幸好已经有对应的开源库供我们使用。这就是 Assimp。


Assimp官网:

http://assimp.sourceforge.net/main_doc.html

Assimp使用CMake 来构建,这样大家需要去了解一下CMake 的简单的使用方式。

Cmake官网

http://www.cmake.org/

转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

需要注意的一点是,需要安装DX 开发包。

http://www.microsoft.com/en-us/download/details.aspx?id=6812

如果不愿意使用CMake,也可以直接下载我打包的Visual Studio 2013版本。

转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

我们并不是要在项目中使用Assimp来读取模型到游戏中渲染,而是使用Assimp来编写工具把别人提供给我们的模型转换成我们自己需要的格式。


在我们使用 Assimp 之前,先来了解 Assimp 加载一个模型之后,会把这个模型中的数据存为怎样的结构。



总结如下:

1、整个模型中的数据都存放在 Scene 中。Scene中有RootNode 引用,以及存放所有真实顶点数据的 mMeshs[] 、存放真实纹理数据的 mMaterials[] 。

2、Rootnode 包含有子节点 mChildren[] 和 Mesh的引用 mMeshes[] 。

3、Mesh 中除了顶点属性之外,也包含有 纹理的引用 mMaterialIndex 。


Tips:

如果美术给我们的模型中,一个 Mesh 包含有多个 Material 引用,那么Assimp 会把Material 拆分。即 复制出来一个Mesh 给 Material 用。确保一个 Mesh 一个 Material。


根据 上面的 Assimp 结构图,我们编写相应的类来存储对应的数据。


例如顶点属性我们用 Vertex 类来存储

#pragma once

#include"glm\\glm.hpp"

class Vertex 

public:
	glm::vec3 Position;
	glm::vec3 Normal;
	glm::vec2 TexCoords;
;

其它还创建了 Mesh 、 Texture 、 Model 来存储对应数据。可以把代码下载查看。

转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

示例工程中,把一个 obj 模型转换成了 model 格式的文件。


转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

如果需要对 Assimp 需要更多的了解,可以参照下面的文章

http://learnopengl.com/#!Model-Loading/Assimp

示例工程下载:

http://pan.baidu.com/s/1pKuZy6f


以上是关于OpenGL ES 学习教程 使用开源库 Assimp 将 Obj 模型 转换成自己的格式的主要内容,如果未能解决你的问题,请参考以下文章

我的OpenGL学习进阶之旅OpenGL ES开发如何引入GLM(OpenGL Mathematics)库?

我的OpenGL学习进阶之旅OpenGL ES开发如何引入GLM(OpenGL Mathematics)库?以及#include< >和#include“ ”的区别

基于OpenGL ES 的深度学习框架编写

OpenGL ES 简单教程

我的OpenGL学习进阶之旅OpenGL ES对Android平台的支持情况

我的OpenGL学习进阶之旅OpenGL ES对Android平台的支持情况