这篇是英文文档的翻译,便于自己理解,也为了方便读者快速阅读。文中链接和图片还请到原文档中查看。
原文链接:Features and Metadata Technical Reference
Cesium for Unreal 中的要素元数据简介
在虚幻引擎中,3D Tileset 中的要素元数据可以使用多种不同的格式表示。一个模型可以使用 Feature IDs 和 Feature Tables 来存储元数据属性(作为 Feature ID 属性或 Feature ID 纹理),也可以使用Feature Textures。
关于以下相关概念的简短教程,请访问可视化网格要素和元数据教程。
Feature Table 元数据
这种类型的元数据存储在写有属性列的Feature Tables中。Feature Table中的一行属性可以通过Feature ID的索引引用。Feature IDs与瓦片的 geometry 相关联的方式有两种,即Feature ID Attributes和Feature ID Textures。相关术语的定义和示例如下:
Property
元数据属性描述文本值的空间(例如string, bool, integers, enums等)
// Property example 1:
string buildingName;
// Property example 2:
int numberOfFloors;
Class类
一组元数据属性描述。该Class类的对象将为每个描述的属性设置一个值。将该Class类想象成所有对象的一个蓝图。
// Class example:
Building {
string buildingName;
int numberOfFloors;
bool passesFireCode;
bool openToPublic;
}
// Object example:
Building cesiumBuilding {
“Cesium Building”,
5,
true,
false
}
Feature Table
要素表是来自Class类描述的对象列表。Class对象的各个属性分别是表的每列。各行的索引就被称为Feature ID。下面是feature table的示例:
Feature ID
Feature ID 是整数类型,用于索引到对应要素表的特定元数据行。可通过两种方式将 Feature ID 存储在地图切片上:
Feature ID 属性
在这种形式中,地图切片中的每个顶点都有相应的要素 ID。可以假设每个三角形中的三个顶点具有相同的要素 ID。这意味着,在要素表中,由要素 ID 索引的行中的所有元数据都与该顶点(及其三角形)相关联。
要素 ID 属性的常见用途是将建筑物与相应的元数据(如高度、建造年份、经度、纬度等)相关联。每个单独的建筑物中的元数据都是相同的,因此元数据的每个顶点粒度就足够了。
为了从 Feature ID 属性中检索要素 ID,您需要知道要从中检索要素 ID 的三角形的face ID。
Feature ID 纹理
在这种形式中,地图切片上的每个纹素片段都有相应的要素 ID。这意味着由要素 ID 索引的要素表格的行中的所有元数据都与纹素相关联。
Feature ID 纹理的常见用途是,将如地形这样的低多边形几何图形,与如土地覆盖数据这样的高频元数据(如水、沼泽、沙漠等)相关联。在这种情况下,元数据的变化频率高于使用每个顶点要素 ID 可以表示的频率。因此,取而代之的是,我们使用每个像素都包含一个要素 ID的纹理,这个纹理,允许我们即使在单个三角形内,都能改变要素 ID。
要从 Feature ID 纹理中检索要素 ID,您需要知道要从中检索要素 ID 的纹素的 UV 坐标。UV 坐标必须与Feature ID 纹理关联的 UV 坐标集相对应。
Feature Tables and Feature IDs
一旦通过要素 ID 纹理或属性,从地图切片中检索要素 ID 后,可以在要素表中查找相应的行,并可以读出相关的元数据。
Feature Texture 元数据
不要与Feature ID 纹理混淆。
要素纹理可能是每个要素元数据的最直接形式。它们与要素 ID 或要素表无关。
每个 Feature Texture 都有一个 Feature Texture Properties 列表,这些属性只是在其像素中包含元数据值的纹理通道。这对于在地图切片的几何图形的表面上,表达离散化标量场和矢量场(例如,热力图、洋流图、天气图等)非常有用。每个像素将包含一个标量或向量,具体取决于要素纹理所代表的场类型。
元数据蓝图 API 参考
Cesium 的元数据蓝图 API 将在命中的 Primitive 组件的 line trace 的上下文中进行描述。如果存在任何元数据,我们将研究如何从这样的 line trace 中检索基元的元数据。line trace 本身的参数与此参考文档无关。有关设置 line trace 的示例,请参阅可视化每个要素的元数据。
如上一部分所述,有两种类型的要素元数据。一是使用要素 ID 索引到要素表中的元数据,二是更简洁、独立的要素纹理。
BP API: Feature Tables
本部分演示了用于要素表元数据的蓝图 API。为了从 line trace 访问特定的要素元数据,您将需要一个Feature ID 和一个Feature Table,它们可以通过Feature ID Attributes或Feature ID Textures来获取。
从 primitive 中获取 Feature ID Attributes
在下面的蓝图截图中,我们看到有一个从 HitResult→HitComponent 检索的 Cesium Primitive Metadata ,其中包含 Feature ID Attributes 列表。每个属性都有对应的Feature Table Name ,并且每个属性都有其自己的每个顶点 Feature ID 映射。对于由 HitResult→Face Index 给出的特定三角形face ID,我们可以为每个 Feature ID Attribute 确定一个 Feature ID 。
从 primitive 中获取 Feature ID Textures
获取 Feature ID Textures 类似于获取 Feature ID Attributes。我们使用 Cesium Metadata Primitive 来检索 Feature ID Textures 列表。对于每个 Feature ID Texture,我们检索 Feature Table Name 和 line trace 击中的Mesh的UV坐标上的 Feature ID。
要使 Find Collision UV 节点正常工作,必须在 Project Settings → Physics 中启用 “Support UV from Hit Results” 选项。
从要素表中检索元数据
现在,我们已经有了每个 Feature ID Attribute / Texture的 Feature Table Name 和 Feature ID ,我们可以在相应的 Feature Table 中查找相应的数据。
下面的蓝图展示了如何从 HitResult 中检索 Cesium Model Metadata ,以及如何列出 Cesium Model Metadata 的 Feature Table 。
您可以按名称查找特定的要素表,并使用下面显示的任何节点来浏览表中的元数据。
- 若要检索特定 Feature ID 的元数据属性,请使用 Get Metadata Values (as String) for Feature ID。
- 若要将列作为属性数组的列表进行检索,请使用 Get Properties。
- Get Number Of Features 仅返回Feature Table的行数。
我们可以将之前蓝图中的 Feature Table Name 插入到 Find 节点中,也可以将 Feature ID 插入到 Get Metadata Values (as String) for Feature ID 节点中。这为我们提供了来自要素表的一行元数据属性值。这被格式化为从列名(字符串)到 Cesium Metadata Generic Value的映射。
要素表元数据值的类型
根据访问元数据的方式,分别有不同的类型:
- 如果使用了 Get Metadata Values for Feature ID ,则应该有 Cesium Metadata Generic Values.
- 如果使用了 Get Properties ,则应该有 Cesium Metadata Properties (实际上是要素表中的列数组).
- 当属性值类型为数组时,还可以使用 Get Array 从 Cesium 元数据泛型值或 Cesium 元数据属性中检索 Cesium 元数据数组。
以下节点可用于从上述泛型值访问器中检索类型信息并强制使用值。
虽然元数据属性可以有多种类型,但蓝图中只有部分类型可用。您可以以 Boolean、Byte、Integer、Integer64、Float、String 或 Array 的形式检索元数据。上述节点将尝试将值转换为请求的数据类型。
如果需要原始类型,可以使用 GetTrueType 方法检索实际的基础类型。
您还可以使用 GetBlueprintType 访问“最适合”的蓝图支持的无损数据类型。例如,如果您使用的是UE4,并且属性的原始数据类型是Double,它将被转换为String,这是UE4蓝图中唯一可用的无损选项。
Get Metadata Values for Face
节点 Get Metadata Values for Face 和 Get Metadata Values as String for Face 可用于访问基本元数据属性。这些节点是简化的帮助程序函数,可能不会返回所有元数据。如果Face关联了多个要素表,则节点仅返回第一个要素表的元数据。
Get Metadata Values for Face 保留原始数据类型。Get Metadata Values as String for Face 将所有内容转换为字符串,这不会保留原始数据类型。
BP API: Feature Textures
每个要素纹理都有许多要素纹理属性,每个属性都有自己的纹理和元数据像素值。
每个 Cesium 基元元数据都有一个可以在 Cesium 模型元数据上查找的要素纹理名称列表,类似于我们查找要素表名称的方式。
对于我们找到的每个要素纹理,我们都可以查看其每个要素纹理属性。
对于每个 Feature Texture Property,以下节点都可用。
- Get Component Count 返回元数据像素值使用的通道数量。
- Get [Float / Integer] Color from Texture Coordinates 返回在给定 UV 坐标处分别强制为 float 或 integer 类型的元数据像素值。UV 坐标必须与 Feature Texture Property 相对应。
- Get Swizzle 返回一个字符串,表示元数据值组件在像素通道中的位置(例如,“rgba”、“gbr”等)。
- Get Texture Coordinate Index 返回设置为与 Get [Float / Integer] Color from Texture Coordinates 一起使用的 UV 坐标索引。
- Is Normalized 返回元数据像素值是否应解析成归一化整数。
与 Feature ID Textures 类似,您需要使用 HitResult 的 UV 坐标(使用 Find Collision UV 节点)来检索适当的像素值。结果将是 Cesium Integer Color 或 Cesium Float Color,具体取决于您用于检索元数据像素值的节点。这些是具有 4 个整数或浮点数通道的结构体。只有前 n 个通道是相关的,其中 n 是要素纹理属性的组件计数。例如,如果分量计数为 3,则只有 R、G 和 B 通道具有相关的元数据。
您可以通过右键单击返回结构引脚来拆分它们,以直接访问整数或浮点数类型的元数据组件。
Cesium Encoded Metadata Component
可以将 Cesium 编码元数据组件添加到地图切片集上,以准备用于材质样式的要素元数据属性。下面将概述组件的一些参数。有关使用此组件设置图块集样式的教程,请参阅可视化每个功能元数据教程。
Auto Fill按钮可以访问可用的元数据属性。并非所有类型的元数据属性都可以在材质中使用。
请记住以下说明使用此组件的最佳实践:
- 请务必删除未用于样式设置逻辑的属性。保留未使用的属性将影响性能并导致 GPU 纹理内存使用过多。已删除的属性可以通过自动填充或手动重新添加。
- Auto Fill 按钮适用于大多数情况。虽然您可以向组件添加其他属性,但此功能只能用于访问已存在的属性 - 它不会向瓦片集本身添加新属性。
- 不建议编辑自动填充属性的属性参数(如名称、类型等),因为这可能会导致组件无法正常工作。
生成材质
“Generate Material“按钮会将列出的属性从编码元数据组件传递到材质图层。
- 如果未设置目标材质图层属性,则“生成材质”按钮将在项目的“内容”文件夹的根目录中创建一个新的材质图层,并将“目标材质图层”设置为新生成的材质图层。
- 如果设置了目标材质图层,则该按钮将改为使用新节点更新提供的材质图层。重新生成的材质通常是非破坏性的,组件将尝试保持现有节点图的完整性。
必须先将材质图层添加到材质实例中,并将材质实例分配给您的瓦片集,然后才能可视化元数据属性。有关详细信息,请参阅编辑瓦片集材质教程。