Skip to content

简介

SandMod 中的 网格(Mesh)由网格的 顶点数据(Vertex Data)、拓扑结构(Topology)和 索引数据(Index data)所定义,蒙皮网格(Skinned Mesh)还会储存 绑定姿势(Bind Poses)信息,网格的这些信息都将储存在 网格资产(Mesh Asset)或缓存中。

顶点数据

顶点数据(Vertex Data)是 3D 空间中网格所有顶点及其属性的集合,顶点数据包含的子数据集合称为顶点属性,每个顶点可以具有以下属性:

属性描述是否必须动态访问、设置方法
位置(Position)顶点位置定义顶点在 3D 空间中的位置,系统使用该值来确定网格的 3D 形状。必须具备可使用 Mesh 类中的Mesh.vertices,从脚本访问、设置该数组。
法线(Normal)顶点法线以 三维向量(Vector 3)的方式定义在顶点位置处从表面向外指向的方向。系统使用此值来计算光线从网格表面反射的方式。非必须可使用 Mesh 类中的Mesh.normals,从脚本访问、设置该数组。
切线(Tangent)顶点切线以 四维向量(Vector 4)的方式定义沿顶点位置处表面的纹理贴图 U 轴指向的方向。
其中向量的 X、Y、Z 分量定义切线在 3D 空间的方向。虽然 SandMod 可以根据切线和法线的叉积计算出 副切线(Bitangent,即纹理贴图的 V 轴)的朝向,但是无法确定副法线的正负朝向,所以需要定义切线向量的 W 分量以定义副法线方向,因此 W 分量的值通常为 1 或者 -1。
image.png
非必须可使用 Mesh 类中的Mesh.tangents,从脚本访问、设置该数组。
纹理坐标(UV)SandMod 支持一个网格最多可以包含 8 组纹理坐标。纹理坐标通常称为 UV,纹理坐标集合称为通道。SandMod 在渲染网格时使用纹理坐标确定网格上每个面上贴哪一块纹理。 UV 定义纹理的哪一部分与顶点位置处的网格表面对齐。
image.png

默认情况下:
· 第一个通道 (UV1) 存储常规纹理,如漫反射贴图和镜面反射贴图的 UV。
· 第二个通道 (UV2) 存储烘焙的 光照贴图(Lightmap)UV。
· 第三个通道 (UV3) 存储实时光照贴图 UV 的输入数据。
非必须可使用 Mesh 类中的Mesh.uv1Mesh.uv2Mesh.uv3 等,直至 Mesh.uv8,从脚本访问、设置该系列数组。
颜色(Color)顶点颜色表示顶点的基色,该颜色会与网格所使用的任何纹理共同影响网格的最终渲染效果。非必须可使用 Mesh 类中的Mesh.colors,从脚本访问、设置该数组。
骨骼权重(Bone Weights)在蒙皮网格中,骨骼权重定义了每个顶点受到哪些骨骼的影响以及对应的影响程度。
SandMod 会使用骨骼权重根据骨骼的运动来使蒙皮网格变形。有关更多信息,请参阅 蒙皮网格渲染器 章节。
蒙皮网格必须具备,且仅蒙皮网格包含此属性可使用 Mesh 类中的Mesh.boneWeights,从脚本访问、设置该数组。

在系统中,所有顶点数据都存储在相同长度的独立数组中,即网格数据中储存顶点位置的数组包含多少个顶点,则该网格的每个其他顶点属性的数组也包含相同元素数量。

拓扑结构

拓扑结构(Topology)定义了网格所具有的面的类型。网格的拓扑定义了顶点之间如何组合成面。每种类型的拓扑都使用索引数组中不同数量的元素来定义单个面。SandMod 支持以下网格拓扑结构:

  • 三角形列表(Triangles),每三个顶点表示一个面(三角形的面),顶点之间按顺序依次形成三角形。

image.png

  • 带状三角形列表(TriangleStrips),顶点之间依次相连形成一个连续的三角形带。

image.png

  • 四边形列表(Quads),每四个顶点表示一个四边形,顶点之间按顺序依次形成四边形。

image.png

  • 线段列表(Lines),每两个顶点表示一条线段,顶点之间按顺序依次相连。
  • 带状线段列表(LineStrips),顶点之间依次相连形成一条连续的曲线。
  • 点列表(Points),每个顶点表示一个点。

点列表拓扑结构的网格不会创建面,SandMod 会在每个顶点的位置渲染一个点。所有其他网格拓扑都使用多个索引来创建面或线段。

NOTE

您必须将使用如 NURBS 等方式建模技术的网格转换为建模软件中支持的格式,才能在 SandMod 中使用这些拓扑结构的网格。

索引数据

索引数据(Index data)的索引指的是顶点位置数组中引用对应元素的整数。SandMod 在解析 网格(Mesh)的数据时会根据索引将对应位置的顶点连接成面片。同一个顶点可以绑定多个面片,这意味着同一个顶点可以多次出现在索引数组中。组成每个面片的索引数量取决于网格的 拓扑结构(Topology)。

如果需要动态编辑或者自定义新的网格,SandMod 目前仅支持查看和编辑 三角形列表(Triangles)拓扑结构的网格的索引数据,具体查看和编辑方法请查看 API 文档关于 Mesh 类中的 Mesh.triangles 相关内容。

--------------
例如网格中包含了 6 个顶点的顶点数据,根据顶点数据中的 位置(Position)将顶点描绘至 3D 空间时效果如下图,其中顶点中的文字代表顶点在位置属性数组的索引。值得注意的是 Type Script 的索引是从 0 开始的。
image.png

假设网格本身就是 三角形列表(Triangles)拓扑结构,则前三个元素 0,1,2 定义 1 号三角形,后面的三个元素 2,1,3 定义 2 号三角形如此类推。
image.png
--------------

读取顺序

索引数据的数组中每组三角形顶点的读取顺序用于确定该三角面是面向摄像机还是背对摄像机,进而确定是否应该渲染面或剔除它(将其从渲染中排除)。SandMod 的渲染机制是渲染面向摄像机的面片并剔除背对摄像机的面片。 SandMod 的渲染机制中,摄像机方向读取三角形顶点在索引数组中的顺序是 顺时针(CW)方向,系统会认为该面会面向摄像机,相反,摄像机方向读取三角形顶点在索引数组中的顺序是 逆时针(CCW)方向,系统会认为该面会背对摄像机。

image.png

上图演示了 SandMod 在渲染网格面片时如何根据读取顺序确定面片是否面向摄像机的。较近的三角形的顶点索引读取顺序为 1, 2, 3,相对于当前摄像机为顺时针方向读取,因此该三角形是面向摄像机的,面片也会正常渲染。另一个三角形的顶点索引读取顺序是 4, 5, 6,从这个角度来看是逆时针方向,因此渲染过程中认为该面片是背对摄像机,该面片在当前帧不渲染。

绑定姿势

在 蒙皮网格(Skinned Mesh)中,骨骼的 绑定姿势(Bind Pose)定义了骨骼处于默认位置时的位置(也称为绑定姿势或静止姿势)。蒙皮网格必须具备绑定姿势的数据。

您可以使用 Mesh 类中的 Mesh.bindPoses 获取和设置蒙皮网格的绑定姿势数据。每个元素都包含具有相同索引的骨骼的数据。