如何更改3D对象的不透明度值

时间:2010-02-23 21:46:17

标签: c# wpf opacity

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

你能解释一下它是如何完成的。

由于

B.Joe

2 个答案:

答案 0 :(得分:3)

假设您的3D对象是Model3DGroupGeometryModel3D中的ModelVisual3DModelUIElement3D,更改不透明度是迭代单个GeometryModel3D的问题在其中并更新每个MaterialBackMaterial,其中包含以下内容:

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,只需设置不透明度

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

答案 1 :(得分:1)

您可以根据其包含的画笔操纵材质的不透明度。