Предполагая, что ваш 3D-объект является Model3DGroup
или GeometryModel3D
в пределах ModelVisual3D
или ModelUIElement3D
, изменение непрозрачности заключается в повторении отдельных GeometryModel3D
s в нем и обновлении каждого из Material
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 просто установите непрозрачность
Если ваш трехмерный объект представляет собой Visual3D, например ContainerUIElement3D, то сначала вам нужно будет выполнить итерации до отдельных ModelVisual3D и ModelUIElement3D, чтобы перейти к содержащим его моделям. Кроме того, если вы сталкиваетесь с ViewPort2DVisual3D, вы можете установить непрозрачность непосредственно на визуальном элементе.