Your comments

I thought the model was of a bold man... Anyway, if you want to do it programmatically, I frankly see no easy way of doing it. You'll have to modify your original model to mark the hair somehow - with another material or with some tags (if possible), - or make the hair into another model, which you can add to the rest of the body - or not add.

What wig? Your model is bold...

I don't have a little sample project, this is a part of a pretty large project. I'm afraid it won't help you much. But this is roughly what I did.

Public Function BuildSubdivisionMeshModel(
        Dim trPts As New List(Of Point3D)()
        For Each tr In (something that returns a 3-tuple of my points)
            trPts.Add(MakePoint(tr.Item1))
            trPts.Add(MakePoint(tr.Item2))
            trPts.Add(MakePoint(tr.Item3))
        Next
        Dim mat As New DiffuseMaterial(
            New SolidColorBrush(faceColor) With {.Opacity = SubdivisionAlpha})
        Dim res = New MeshVisual3D With {
            .Mesh = New Mesh3D(trPts, Enumerable.Range(0, trPts.Count)),
            .SharedVertices = True,
            .FaceMaterial = mat,
            .FaceBackMaterial = mat,
            .EdgeDiameter = 0,
            .VertexRadius = 0
        }
        ' Force mesh update to propagate materials
        res.SharedVertices = False
        Return res
End Function
Public Function MakePoint(c As IPositionAbsolute) As Point3D
    Return New Point3D(c.X, c.Y, c.Z)
End Function

Instead of loading the model I'm building it from scratch, that's the main difference between our tasks. When building, I collect triangles, and for each triangle I add three points to the mesh. I do not reuse the points, for in my case I'd like to see the edges. And note, that the order of the points (clockwise or counter-clockwise), irrelevant in my case, matters - it determines, which side of the triangle shows the face material, and which one is back.

"trPts" is just a collection of points I'm generating for Mesh3D (check its constructor declaration). In your case, they should probably be coming from the result of "import.Load".

I'm not sure what type

ModelImporter.Load()
returns, and I don't have the time now to investigate.

Have you tried assigning the material before loading?


Btw, the blue is the default BackMaterial, maybe you could set the default for it when importing?

I just set it to true in the MeshVisual3D constructor, then to false on the next line.

Dim res = New MeshVisual3D With {
    .Mesh = New Mesh3D(trPts, Enumerable.Range(0, trPts.Count)),
    .SharedVertices = True,
    .FaceMaterial = mat,
    .FaceBackMaterial = mat,
    .EdgeDiameter = 0,
    .VertexRadius = 0
}

' Force mesh update to propagate materials
res.SharedVertices = False

Return res

In my case, this happened after I created a MeshVisual3D in code. The solution was to toggle one of the visual's properties (I used SharedVertices) after the creation. This triggered the visual to reapply the materials. The blue and grey pair are the default materials for front and back faces.