1
0
mirror of https://github.com/LearnOpenGL-CN/LearnOpenGL-CN.git synced 2025-08-23 04:35:28 +08:00

Fix all the titles

This commit is contained in:
Meow J
2016-07-06 01:42:55 +08:00
parent 5dad4f21d8
commit 3ef7a53627
44 changed files with 512 additions and 527 deletions

View File

@@ -1,4 +1,4 @@
# Assimp开源模型导入库
# Assimp
原文 | [Assimp](http://learnopengl.com/#!Model-Loading/Assimp)
---|---
@@ -33,9 +33,9 @@
!!! Important
**Mesh(网格,或被译为“模型点云”)**
**网格(Mesh)**
用建模工具构建物体时,美工通常不会直接使用单个形状来构建一个完整的模型。一般来说,一个模型会由几个子模型/形状组合拼接而成。而模型中的那些子模型/形状就是我们所说的一个Mesh。例如一个人形模型,美工通常会把头、四肢、衣服、武器这些组件都分别构建出来,然后在把所有的组件拼合在一起,形成最终的完整模型。一个Mesh包含顶点、索引和材质属性是我们在OpenGL中绘制物体的最小单位。一个模型通常有多个Mesh组成。
用建模工具构建物体时,美工通常不会直接使用单个形状来构建一个完整的模型。一般来说,一个模型会由几个子模型/形状组合拼接而成。而模型中的那些子模型/形状就是我们所说的一个网格。例如一个人形模型,美工通常会把头、四肢、衣服、武器这些组件都分别构建出来,然后在把所有的组件拼合在一起,形成最终的完整模型。一个网格包含顶点、索引和材质属性是我们在OpenGL中绘制物体的最小单位。一个模型通常有多个网格组成。
下一节教程中我们将用上述描述的数据结构来创建我们自己的Model类和Mesh类用于加载和保存那些导入的模型。如果我们想要绘制一个模型我们不会去渲染整个模型而是去渲染这个模型所包含的所有独立的Mesh。不管怎样我们开始导入模型之前我们需要先把Assimp导入到我们的工程中。
@@ -67,4 +67,4 @@ Required library DirectX not found! Install the library (including dev packages)
如果你想要让Assimp使用多线程支持来提高性能你可以使用<b>Boost</b>库来编译 Assimp。在[Boost安装页面](http://assimp.sourceforge.net/lib_html/install.html)你能找到关于Boost的完整安装介绍。
现在你应该已经能够编译Assimp库并链接Assimp到你的工程里去了。下一节内容[导入完美的3D物件](http://learnopengl-cn.readthedocs.org/zh/latest/03%20Model%20Loading/02%20Mesh/)
现在你应该已经能够编译Assimp库并链接Assimp到你的工程里去了。下一[导入完美的3D物件](http://learnopengl-cn.readthedocs.org/zh/latest/03%20Model%20Loading/02%20Mesh/)

View File

@@ -1,4 +1,4 @@
# 网格(Mesh)
# 网格
原文 | [Mesh](http://learnopengl.com/#!Model-Loading/Mesh)
---|---

View File

@@ -1,4 +1,4 @@
# 模型(Model)
# 模型
原文 | [Model](http://learnopengl.com/#!Model-Loading/Model)
---|---
@@ -6,7 +6,7 @@
翻译 | [Django](http://bullteacher.com/)
校对 | [Geequlim](http://geequlim.com)
现在是时候着手启用Assimp并开始创建实际的加载和转换代码了。本教程的目标是创建另一个类这个类可以表达模型的全部。更确切的说一个模型包含多个网格(Mesh)一个网格可能带有多个对象。一个别墅包含一个木制阳台一个尖顶或许也有一个游泳池它仍然被加载为一个单一模型。我们通过Assimp加载模型把它们转变为多个网格(Mesh对象,这些对象是是先前教程里创建的。
现在是时候着手启用Assimp并开始创建实际的加载和转换代码了。本教程的目标是创建另一个类这个类可以表达模型(Model)的全部。更确切的说,一个模型包含多个网格(Mesh)一个网格可能带有多个对象。一个别墅包含一个木制阳台一个尖顶或许也有一个游泳池它仍然被加载为一个单一模型。我们通过Assimp加载模型把它们转变为多个`Mesh`对象,这些对象是是上一节教程里创建的。
闲话少说我把Model类的结构呈现给你
@@ -46,7 +46,7 @@ void Draw(Shader shader)
}
```
## 把一个3D模型导入到OpenGL
## 导入3D模型到OpenGL
为了导入一个模型并把它转换为我们自己的数据结构第一件需要做的事是包含合适的Assimp头文件这样编译器就不会对我们抱怨了。
@@ -133,7 +133,7 @@ void processNode(aiNode* node, const aiScene* scene)
下一步是用上个教程创建的`Mesh`类开始真正处理Assimp的数据。
## 从Assimp到网格
### 从Assimp到网格
把一个`aiMesh`对象转换为一个我们自己定义的网格对象并不难。我们所要做的全部是获取每个网格相关的属性并把这些属性储存到我们自己的对象。通常`processMesh`函数的结构会是这样:
@@ -210,7 +210,7 @@ else
`Vertex`结构体现在完全被所需的顶点属性填充了,我们能把它添加到`vertices`向量的尾部。要对每个网格的顶点做相同的处理。
## 顶点
### 顶点
Assimp的接口定义每个网格有一个以面faces为单位的数组每个面代表一个单独的图元在我们的例子中由于`aiProcess_Triangulate`选项)总是三角形,一个面包含索引,这些索引定义我们需要绘制的顶点以在那样的顺序提供给每个图元,所以如果我们遍历所有面,把所有面的索引储存到`indices`向量,我们需要这么做:
@@ -228,7 +228,7 @@ for(GLuint i = 0; i < mesh->mNumFaces; i++)
## 材质
### 材质
如同节点,一个网格只有一个指向材质对象的索引,获取网格实际的材质,我们需要索引场景的`mMaterials`数组。网格的材质索引被设置在`mMaterialIndex`属性中,通过这个属性我们同样能够检验一个网格是否包含一个材质:
@@ -278,7 +278,7 @@ vector<Texture> loadMaterialTextures(aiMaterial* mat, aiTextureType type, string
这就是使用Assimp来导入一个模型的全部了。你可以在这里找到[Model类的代码](http://learnopengl.com/code_viewer.php?code=model_loading/model_unoptimized)。
## 重大优化
# 重大优化
我们现在还没做完。因为我们还想做一个重大的优化(但是不是必须的)。大多数场景重用若干纹理,把它们应用到网格;还是思考那个别墅,它有个花岗岩的纹理作为墙面。这个纹理也可能应用到地板、天花板,楼梯,或者一张桌子、一个附近的小物件。加载纹理需要不少操作,当前的实现中一个新的纹理被加载和生成,来为每个网格使用,即使同样的纹理之前已经被加载了好几次。这会很快转变为你的模型加载实现的瓶颈。
@@ -343,7 +343,7 @@ vector<Texture> loadMaterialTextures(aiMaterial* mat, aiTextureType type, string
你可以从这里获得优化的[Model类的完整源代码](http://learnopengl.com/code_viewer.php?code=model&type=header)。
## 和箱子模型告别!
# 和箱子模型告别
现在给我们导入一个天才艺术家创建的模型看看效果不是我这个天才做的你不得不承认这个箱子也许是你见过的最漂亮的立体图形。因为我不想过于自夸所以我会时不时的给其他艺术家进入这个行列的机会这次我们会加载Crytek原版的孤岛危机游戏中的纳米铠甲。这个模型被输出为obj和mtl文件mtl包含模型的diffuse和specular以及法线贴图后面会讲。你可以下载这个模型注意所有的纹理和模型文件都应该放在同一个目录以便载入纹理。