2

我使用 VS 2008 C# Express。我想在有很多 3D 对象的窗口中更改 3D 对象的不透明度值。更改过程将由代码隐藏完成。

你能解释一下它是怎么做的吗?

谢谢

4

2 回答 2

3

假设您的 3D 对象是 a Model3DGrouporGeometryModel3D内的ModelVisual3Dor ModelUIElement3D,则更改不透明度是迭代其中的各个GeometryModel3Ds 并更新每个 sMaterial和的问题BackMaterial,类似于以下内容:

public void SetOpacity(Model3D model, double opacity)
{
  var modelGroup = model as Model3DGroup;
  var geoModel = model as GeometryModel3D;

  if(modelGroup!=null)
    foreach(var submodel in modelGroup.Children)
      SetOpacity(submodel, opacity);

  if(geoModel!=null)
  {
    geoModel.Material = SetOpacity(geoModel.Material, opacity);
    geoModel.BackMaterial = SetOpacity(geoModel.BackMaterial, opacity);
  }
}

public Brush SetOpacity(Brush brush, double opacity)
{
  if(!GetIsOpacityControlBrush(brush))  // Use attached property to mark brush
  {
    brush = new VisualBrush
    {
      Visual = new Rectangle { Fill = brush, ... };
    };
    SetIsOpacityControlBrush(brush, true);
  }
  ((Rectangle)((VisualBrush)brush).Visual).Opacity = opacity;
}

您将需要遍历对象中的所有 GeometryModel3D 和 ViewPort2DVisual3D。对于每个 GeometryModel3D,将材质更新为新的不透明度,必要时使用 VisualBrush。对于每个 ViewPort2DVisual3D,只需设置 Opacity

如果您的 3D 对象是 Visual3D,例如 ContainerUIElement3D,那么您必须首先迭代到单独的 ModelVisual3D 和 ModelUIElement3D 以获取包含它的模型。此外,如果您遇到 ViewPort2DVisual3D,您可以直接在包含的 Visual 上设置不透明度。

于 2010-06-04T23:03:17.327 回答
1

您可以根据材质包含的画笔来控制材质的不透明度。

于 2010-02-24T13:40:40.513 回答