在Cesium中,3D模型的颜色管理是一个重要的功能,它允许开发者对加载的模型进行颜色、透明度、色彩混合模式等多方面的自定义,从而增强模型的表现力和可视化效果。本文将基于示例代码,详细讲解如何在Cesium中管理模型的颜色属性以及实现动态交互。


一、Cesium模型中的颜色属性

Cesium支持通过ModelGraphics接口来设置模型的各种属性,其中颜色相关的主要参数包括:

  1. color:模型的基础颜色,支持使用Cesium.Color对象来定义颜色值。
  2. colorBlendMode:模型的颜色混合模式,用于定义模型颜色与其原始纹理颜色的混合方式。
  3. colorBlendAmount:在某些混合模式下,定义混合比例。
  4. silhouetteColor:模型的轮廓颜色,用于高亮显示模型的轮廓。
  5. silhouetteSize:轮廓线的宽度。

二、设置模型颜色 (color)

模型的颜色可以使用Cesium内置的Cesium.Color对象定义,包括常见颜色(如红色Red、绿色Green等)以及透明度。

示例代码


function getColor(colorName, alpha) {
  const color = Cesium.Color[colorName.toUpperCase()];
  return Cesium.Color.fromAlpha(color, parseFloat(alpha));
}

上面的代码通过颜色名称和透明度(alpha)动态生成一个Cesium.Color对象。在模型初始化时,颜色可以直接通过model.color属性设置:

javascript
model: {
  color: getColor(viewModel.color, viewModel.alpha),
}

注意点:

  • alpha表示透明度,范围是0.0(完全透明)到1.0(完全不透明)。
  • 如果不指定透明度,默认值为1.0

三、颜色混合模式 (colorBlendMode)

colorBlendMode决定了模型的基础颜色如何与其纹理颜色相结合,Cesium提供了三种混合模式:

  1. HIGHLIGHT(高亮模式,默认值)
    颜色直接叠加到模型上,与原始纹理结合。
  2. REPLACE(替换模式)
    忽略模型的纹理颜色,直接使用设置的基础颜色。
  3. MIX(混合模式)
    按照一定比例混合模型的纹理颜色和基础颜色,混合比例由colorBlendAmount控制。

示例代码

javascript
function getColorBlendMode(colorBlendMode) {
  return Cesium.ColorBlendMode[colorBlendMode.toUpperCase()];
}

在模型配置中可以通过以下方式设置混合模式:

javascript
model: {
  colorBlendMode: getColorBlendMode(viewModel.colorBlendMode),
}

四、混合比例 (colorBlendAmount)

colorBlendMode设置为MIX时,colorBlendAmount定义了模型颜色与纹理颜色的混合比例:

  • 0.0:完全使用模型的纹理颜色。
  • 1.0:完全使用模型的基础颜色。
  • 0.5:模型颜色和纹理颜色各占一半。

在示例代码中,viewModel对象绑定了colorBlendAmount,并通过Knockout实现动态更新:

javascript
Cesium.knockout
  .getObservable(viewModel, "colorBlendAmount")
  .subscribe(function (newValue) {
    entity.model.colorBlendAmount = parseFloat(newValue);
  });

五、轮廓颜色和轮廓宽度 (silhouetteColorsilhouetteSize)

Cesium支持为模型添加轮廓,用于强调模型的边缘。主要参数包括:

  • silhouetteColor:轮廓颜色。
  • silhouetteSize:轮廓的宽度,单位为像素。

设置轮廓颜色

通过函数getColor动态获取颜色,并为silhouetteColor赋值:

javascript
Cesium.knockout
  .getObservable(viewModel, "silhouetteColor")
  .subscribe(function (newValue) {
    entity.model.silhouetteColor = getColor(newValue, viewModel.silhouetteAlpha);
  });

设置轮廓宽度

轮廓宽度通过silhouetteSize属性设置,其单位为像素:

javascript
Cesium.knockout
  .getObservable(viewModel, "silhouetteSize")
  .subscribe(function (newValue) {
    entity.model.silhouetteSize = parseFloat(newValue);
  });

轮廓功能通常用于高亮显示模型,例如在选择状态下以不同颜色标识模型。


六、动态交互实现

通过示例代码中的viewModel对象,结合Knockout.js的绑定功能,可以轻松实现颜色属性的动态更新。例如:

  1. 当用户修改颜色时,更新模型的color属性:
javascript
Cesium.knockout.getObservable(viewModel, "color").subscribe(function (newValue) {
  entity.model.color = getColor(newValue, viewModel.alpha);
});
  1. 当用户切换颜色混合模式时,自动更新模型的混合模式:
javascript
Cesium.knockout
  .getObservable(viewModel, "colorBlendMode")
  .subscribe(function (newValue) {
    const colorBlendMode = getColorBlendMode(newValue);
    entity.model.colorBlendMode = colorBlendMode;
    viewModel.colorBlendAmountEnabled =
      colorBlendMode === Cesium.ColorBlendMode.MIX;
  });
  1. 在用户调整透明度(alpha)时,动态调整模型的透明效果:
javascript
Cesium.knockout.getObservable(viewModel, "alpha").subscribe(function (newValue) {
  entity.model.color = getColor(viewModel.color, newValue);
});

七、完整的模型创建函数

在示例代码中,createModel函数负责加载3D模型并为其应用颜色相关的属性:

javascript
function createModel(url, height) {
  viewer.entities.removeAll();
  const position = Cesium.Cartesian3.fromDegrees(-123.0744619, 44.0503706, height);
  const heading = Cesium.Math.toRadians(135);
  const orientation = Cesium.Transforms.headingPitchRollQuaternion(position, hpr);

  entity = viewer.entities.add({
    name: url,
    position: position,
    orientation: orientation,
    model: {
      uri: url,
      minimumPixelSize: 128,
      maximumScale: 20000,
      color: getColor(viewModel.color, viewModel.alpha),
      colorBlendMode: getColorBlendMode(viewModel.colorBlendMode),
      colorBlendAmount: parseFloat(viewModel.colorBlendAmount),
      silhouetteColor: getColor(viewModel.silhouetteColor, viewModel.silhouetteAlpha),
      silhouetteSize: parseFloat(viewModel.silhouetteSize),
    },
  });
  viewer.trackedEntity = entity;
}

javascript

此函数通过为模型设置初始颜色、透明度、混合模式等参数,实现了颜色的完整配置。


八、总结

本文基于示例代码详细讲解了Cesium中模型颜色相关的设置方法和应用场景。主要内容包括:

  1. 模型颜色的基础设置(color和透明度)。
  2. 颜色混合模式(colorBlendMode)及其应用。
  3. 动态调整透明度、混合比例的实现。
  4. 模型轮廓(silhouetteColor silhouetteSize)的设置。

通过灵活使用Cesium提供的这些功能,可以实现丰富的3D模型可视化效果,从而提升项目的用户体验。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注