Skip to content

顶点、索引与三角网格 ​

一个表面最终经常由三角形逼近。顶点(vertex)保存位置及其他属性;索引(index)说明哪些顶点连接成图元。一个四边形通常用四个顶点与两个三角形表达,共享顶点减少重复数据,但顶点共享也意味着其属性必须能被相邻三角形共同使用。

法线和三角面方向可以从向量与叉积理解;大尺度位置中的舍入问题见精度与误差。

四顶点网格的索引连接、绕序与属性插值

数组里的顺序具有几何含义 ​

以下对象构造片段假设已执行 import * as Cesium from 'cesium';显示对象还需要前后文说明的场景装配步骤。

js
const positions = Cesium.Cartesian3.fromDegreesArrayHeights([
  110, 20, 10000,
  114, 20, 10000,
  114, 24, 10000,
  110, 24, 10000,
]);
const packed = new Float64Array(Cesium.Cartesian3.packArray(positions));
const geometry = new Cesium.Geometry({
  attributes: {
    position: new Cesium.GeometryAttribute({
      componentDatatype: Cesium.ComponentDatatype.DOUBLE,
      componentsPerAttribute: 3,
      values: packed,
    }),
  },
  indices: new Uint16Array([0, 1, 2, 0, 2, 3]),
  primitiveType: Cesium.PrimitiveType.TRIANGLES,
  boundingSphere: Cesium.BoundingSphere.fromPoints(positions),
});

这段创建的是几何数据,还需匹配的 Appearance 与 Primitive 才能显示。索引每三个组成一个三角形;重复零和二表示两个三角形共用对角线。顶点数超过十六位索引可表示的范围时,需要更宽索引或分块,不能让数值静默截断。

平面三角形如何逼近地球 ​

上面四个顶点有相同椭球高,但连接它们的是三维空间中的平面三角形。三角形内部不会自动保持相同地理高度。范围越大,弦面与曲面的偏离越明显;需要细分网格或使用适合地球表面的几何生成方式。

绕序(winding order)是按索引访问三角形三个顶点的顺序;指定一侧看过去,顺时针与逆时针对应不同面向。背面剔除(back-face culling)会让被判为背面的三角形不参与绘制。法线(normal)是垂直于表面的向量,常取长度为 1,主要参与光照等计算,它与绕序相关,但不是“改了法线就改了拓扑”。网格上出现尖刺时,应先检查索引、跨日界线连接与坐标转换,而不是先改变光照。

包围体(bounding volume)用一个简单球或盒包住复杂几何,用于快速判断是否值得进一步绘制。顶点已经移到新位置、包围体却仍留在旧位置时,可能出现对象随相机移动突然消失。因此几何、索引和空间范围必须共同更新。

对象如何被画出EXPERIMENT 05 · CESIUM 1.145.0

对象如何被画出

比较 Entity 与 Primitive,查看几何与材质的边界。

在浏览器本地运行 · 无需账号 · 鼠标拖动旋转,滚轮缩放

底图:Natural Earth II(公共领域);其余几何和地形为教学合成。 数据说明
查看运行源码

此代码直接读取实际运行的实验模块。按 kind 分支定位当前实验,也可查看数据公式和 GLSL。

读取源码…

观察任务: 将“几何数量”调到 1,倾斜观察盒子的面与棱。可见棱边并不展示所有三角形连接;设想把其中一张四边形用同样少量顶点铺到半个地球上,会贴合球面吗?

展开解释

不会。只有顶点在球面上,并不能保证三角形内部也在球面上。需要更合理的细分、分区与映射策略。这个问题同样出现在气压面、全球天气填色和弯曲轨迹中。

官方延伸:Geometry 数据结构、GeometryAttribute 属性定义。

气象学 · 数学基础 · 地理可视化