如何在 Cesium 中使用 Material.fromType

How to use Material.fromType in Cesium

我在使用 Cesium.Material.fromType 函数创建一个使用类型和制服的 material 时遇到问题。

我指的是这里的文档:link

我有以下示例,我正在尝试开始工作,但是接下来我想使用 Dot 动态类型而不是颜色。目前,颜色似乎更容易。

Sandcastle example

这个有效: material : Cesium.Color.GREEN

这不是:

material : Cesium.Material.fromType('Color', {
  color : new Cesium.Color(1.0, 0.0, 0.0, 1.0)
})

我收到这个错误:
Uncaught DeveloperError: Unable to infer material type: [object Object]

似乎实体上的 material 属性 不能是对象,我是否缺少将 material 转换为原始类型的步骤?

所以我这里没有什么好消息,但我至少可以解释出问题所在。如您所知,Cesium 有两个独立的 API 层,"Entity" 层(用于移动车辆等复杂对象)和 "Primitive" 层(用于图形基元,如广告牌或网格的集合) .你在这里做的是直接从 Primitive 层构造一个 material 并试图将它分配给一个 Entity,这是行不通的。

在实体层,materials 由 class 描述,该 class 来自 MaterialProperty. The derived classes are all Entity-layer classes listed in that doc link, for example there's a ColorMaterialProperty class 的抽象基础 class 用于纯色。在实体层使这些东西具有时间动态性,例如,当模拟时间为 04:00 时,您的纯色可能是蓝色,而在 06:00 时变为红色,等等。原始 materials 没有时间概念,因此重量更轻。

现在有个坏消息:目前在 Cesium 中似乎没有 DotMaterialProperty class。这意味着 Dot material 仅存在于原始层 API 并且没有连接到实体层。团队在这一点上喜欢说 "contributions welcome",如果您愿意,您可能可以通过复制 StripeMaterialPropertyGridMaterialProperty 并编辑它以连接到 Dot 来连接它。

但在短期内,如果您需要点 material 多于实体层,则可以将代码转换为图形基元。您可以在 Procedural Textures 下拉框下的 Material Sandcastle Demo 中找到示例代码。