-->

How to load Textures and materials using Helix Too

2019-08-22 15:39发布

问题:

I am trying to load 3d obj files or 3ds file, it's loaded

but unfortunately I am not able to load .mtl files or any textures

Any Idea/sample code how to load .mtl files or textures?

---> The 3D models is loaded but in gray color

public void load3dModel()
    {
        ObjReader CurrentHelixObjReader = new ObjReader();
       // Model3DGroup MyModel = CurrentHelixObjReader.Read(@"D:\3DModel\dinosaur_FBX\dinosaur.fbx");
      // Model3DGroup MyModel = CurrentHelixObjReader.Read(@"C:\Users\aaa\Downloads\jlb4kmi4xssg-iphone6model\iphone_6_model.FBX");


        Model3DGroup model = null;
        string path = @"C:\Users\aaa\Downloads\jlb4kmi4xssg-iphone6model\note4.obj";
        string ext = System.IO.Path.GetExtension(path).ToLower();
        switch (ext)
        {
            case ".3ds":
                {
                    var r = new StudioReader();
                    model = r.Read(path);
                    break;
                }

            case ".fbx":
                {
                    var r = new HelixToolkit.Wpf.ObjReader();
                    model = r.Read(path);
                    break;
                }

            case ".lwo":
                {
                    var r = new HelixToolkit.Wpf.LwoReader();
                    model = r.Read(path);

                    break;
                }

            case ".obj":
                {
                    var r = new HelixToolkit.Wpf.ObjReader();
                    model = r.Read(path);

                    //Material matty = (MaterialGroup)((GeometryModel3D)model.Children[0]).Material;
                    //Material myMaterial = MaterialHelper.CreateImageMaterial(@"C:\Users\aaa\Downloads\jlb4kmi4xssg-iphone6model\sam-scrn.jpg", 1);
                   // Material anotherMaterial = ((GeometryModel3D)model.Children[0]).Material;
                   //  Newmodel.Children.Add(new GeometryModel3D { Geometry = anotherMaterial, Material = myMaterial });
                    break;
                }

            case ".objz":
                {
                    var r = new HelixToolkit.Wpf.ObjReader();
                    model = r.ReadZ(path);
                    break;
                }

            case ".stl":
                {
                    var r = new HelixToolkit.Wpf.StLReader();
                    model = r.Read(path);
                    break;
                }

            case ".off":
                {
                    var r = new HelixToolkit.Wpf.OffReader();
                    model = r.Read(path);
                    break;
                }

            default:
                throw new InvalidOperationException("File format not supported.");
        }

       Newmodel.Content = model;

        //MyModel.Children.Add(MyModel);


    }

回答1:

actually helix do it by default at least for .obj files. In your .obj file there must be a line like

mtllib File02.mtl

where File02.mtl is your material file name. helix calls then LoadMaterialLib method, which reads the .mtl file specified after mtllib. Just be sure this .mtl file exists and his name was not changed. Perhaps you changed both .obj and .mtl filenames, but inside of the .obj file the mtllib parameter remained unchanged.