更改 3DS 模型的颜色和透明度

问题描述

我想从 3DS 文件导入模型,然后更改颜色和透明度。导入没有问题,但如何更改模型的颜色和透明度?

我的代码看起来与附加的代码相似。我的 3DS 文件是 Helix 的 Ferrarri40.3ds。

Model3DGroup group = new Model3DGroup();
var hpVp3D = new HelixViewport3D();
ModelVisual3D visual3D = new ModelVisual3D();
var lights = new DefaultLights();
ModelImporter importer = new ModelImporter();
Model3D element;

element = importer.Load(@"Ferarri40.3ds")
group.Children.Add(element);

visual3D.Content = group;

hVp3D.Children.Add(visual3D);
hVp3D.Children.Add(lights);

this.AddChild(hVp3D);

我已经尝试使用以下代码更改颜色,但没有成功。

Material material = new DiffuseMaterial(new SolidColorBrush(Colors.Black));
importer.DefaultMaterial = material;

我做错了什么?

解决方法

下面我描述了如何更改材质和不透明度,而无需每次都加载文件。但我需要在内存中保留额外的对象 (objects_3d)。

这里是如何在文件加载期间更改材料的片段:

var mi = new HelixToolkit.Wpf.ModelImporter();
mi.DefaultMaterial = HelixToolkit.Wpf.MaterialHelper.CreateMaterial(Colors.Gray);
helix_model.Content = mi.Load(f_name);

这里我正在将文件加载到 Model3DGroup 中,然后我正在更改材料

            var mi = new HelixToolkit.Wpf.ModelImporter();

            Model3DGroup objects_3d = new System.Windows.Media.Media3D.Model3DGroup();
            Model3DGroup grp_item = mi.Load(fname);
            objects_3d.Children.Add(grp_item);
            //model is imported,now we can change material and opacity:
            ChangeMatrial(objects_3d,default_material,default_opacity);
            helix_model.Content = objects_3d;
            helix_vport.Viewport.UpdateLayout();

这是之后更改材料的简单函数:

public void ChangeMatrial(Model3DGroup group,System.Windows.Media.Media3D.Material new_mat,double opacity=1)
            
        {
            foreach (object itm in group.Children)
            {
                if (itm is GeometryModel3D)
                {
                    System.Windows.Media.Media3D.Material new_mat2 = new_mat.Clone();
                    HelixToolkit.Wpf.MaterialHelper.ChangeOpacity(new_mat2,opacity);
                    ((GeometryModel3D)itm).Material = new_mat2;
                    ((GeometryModel3D)itm).BackMaterial = new_mat2;
                   
                }
                else if (itm is Model3DGroup)
                {
                    ChangeMatrial((Model3DGroup)itm,new_mat,opacity);
                }
            }
        }