前言

完整渲染流程见:https://blog.csdn.net/m0_50003294/article/details/159698237

模型加载

结构总览

这张图展示的是 Assimp (Open Asset Import Library) 的核心数据结构模型

Scene(全局容器)

aiScene 是整个模型文件的根入口。它并不直接存储几何体,而是作为一个总管,持有三张重要的表:

  • mRootNode: 场景的层级起点。

    • 加载模型的起始点

  • mMeshes[]: 存储模型中所有的几何网格数据(顶点、法线等)。

    • 在虚拟世界中用一个又一个的网格来表示模型

  • mMaterials[]: 存储模型中所有的材质信息(贴图路径、颜色属性等)。

    • 例如miku的发饰,服装贴图

Root node/Child node(树结构)

  • mChildren[]: 递归持有子节点,形成父子关系(用于平移、旋转、缩放,并且子物体也跟随改变)。

    • 类似:头-发饰的关系

  • mMeshes[]: 注意,这里存的是 索引。它告诉引擎:当绘制该node的第i个Mesh时,去Scene的第mMeshes[i]个Mesh中去寻找Mesh

Material(外观表现)

Material 存储了如何渲染该物体的描述信息。

  • 它包含各种属性(如环境光、漫反射色)和指向贴图的路径。

    • 环境光:如果你的世界没有光源,那么模型是黑色的,这里的环境光就是模型自带的一种能照射到所有Mesh的光源,来保证模型不是全黑

    • 漫反射色:物体初始的颜色,如miku的绿色头发

  • 图中提到的 GetTexture(type) 是获取特定类型贴图(如漫反射贴图、法线贴图)的方法。

Mesh(网格)

  • mVertices[] (顶点数组)

    • 存储的是 3D 空间中的坐标点。它是最基础的数据,没有它模型就没有形状。

  • mNormals[] (法线数组)

    • 存储每个顶点的朝向。用来后续渲染流程的像素颜色计算。

  • mTextureCoords[] (纹理坐标/UV)

    • 这是一张“展开图”坐标,范围通常在 0 到 1 之间。它决定了贴图上的像素点如何精准地“包裹”在 3D 模型上。

  • mMaterialIndex (材质索引)

    • 这是一个整数。它告诉引擎:“这个网格应该使用Scene的第几号材质包。“

  • mFaces[](组装顶点,法线,纹理成一个三角形)

    暂时无法在飞书文档外展示此内容

    • Face 并不存储坐标数字,它只存储索引(Index)。它的存在是为了告诉 GPU:“请把这几个特定的点连起来,组成一个三角形。”

    • 试着用记事本打开一个.obj文件?


v 0.896930 -0.116701 -1.078061

v 0.736314 -0.076033 1.066762

v -1.052088 -0.064600 0.954513

... vt 0.058285 0.569867

vt 0.082613 0.506661

vt 0.152906 0.498683

...

vn -0.233500 -0.819800 0.522800

vn -0.341800 -0.625700 0.701200

vn -0.276700 -0.937700 0.209800

... f 30/1/1 3/2/2 44/3/3

f 50/4/4 7/5/5 37/6/6

f 35/7/7 6/8/8 31/9/9

f 顶点索引 / 纹理UV索引 / 法线索引 顶点索引 / 纹理UV索引 / 法线索引

... ...

  • v(顶点坐标)、vt(纹理坐标)、vn(法向量)、f(面)数据(包含对应索引)

图元装配

引用

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐