2009-06-03 5 views
0

Je transfère une application DirectX dans WPF à l'aide de la boîte à outils Windows.Media.Media3D. Ce qui fonctionne bien et tout, sauf que le modèle est rendu in-complet, même quand il a obtenu toutes les données possibles.Lissage des sommets dans MeshGeometry3D (WPF)

Je suppose que c'est parce que DirectX optimiser et en quelque sorte lisser ou aider le rendu de contenu supplémentaire en fonction des sommets et des indices.

Alors je me demande s'il y a une option pour changer la façon dont WPF rend les modèles 3D? C'est un peu difficile d'exprimer précisément ce que je veux dire, mais j'espère que c'est compréhensible.

Voici le code important:

private void DrawModel() 
{ 
    SwordModel swordModel; 

    string filename = "PG_S8_02"; 

    using(FileStream stream = File.OpenRead(string.Format("Media/Models/{0}.gb", filename))) 
    using(BinaryReader reader = new BinaryReader(stream)) 
    { 
     swordModel = new SwordModel(reader);   
    } 

    var group = new Model3DGroup(); 

    foreach(var modelMesh in swordModel.Meshes) 
    { 
     var mesh3D = new MeshGeometry3D(); 

     // Indices 
     foreach(var index in modelMesh.Indices) 
     { 
      mesh3D.TriangleIndices.Add(index); 
     } 

     // Vertices 
     foreach(var vertex in modelMesh.Vertices) 
     { 
      mesh3D.Positions.Add(vertex); 
     } 

     // Normals 
     foreach(var normal in modelMesh.Normals) 
     { 
      mesh3D.Normals.Add(normal); 
     } 

     // Texture Coordinates 
     foreach(var vertex in modelMesh.Vertices) 
     { 
      mesh3D.TextureCoordinates.Add(new Point(vertex.X, vertex.Y)); 
     } 

     // Material 
     var material = new DiffuseMaterial(); 
     var texture = new BitmapImage(new Uri(
      string.Format("Media/Textures/{0}.png", filename), 
      UriKind.RelativeOrAbsolute 
     )); 
     material.Brush = new ImageBrush(texture);        

     // Add to View 
     group.Children.Add(
      new GeometryModel3D(mesh3D, material) 
     ); 
    }  

    mainViewport.Children.Add(
     new ModelVisual3D() { Content = group } 
    );   
} 

Et XAML:

<Viewport3D Name="mainViewport" ClipToBounds="True"> 
    <Viewport3D.Camera> 
     <PerspectiveCamera 
      FarPlaneDistance="100" 
         LookDirection="-11,-10,-9" 
         UpDirection="0,1,0" 
         NearPlaneDistance="1" 
         Position="11,10,9" 
         FieldOfView="70" /> 
    </Viewport3D.Camera> 
    <ModelVisual3D> 
     <ModelVisual3D.Content> 
      <DirectionalLight Color="White" Direction="-2,-3,-1" /> 
     </ModelVisual3D.Content> 
    </ModelVisual3D> 
</Viewport3D> 

Répondre

2

La seule chose que je peux penser est que les Normales ne sont pas lissés, mais sans voir ce que le maillage ressemble je ne pourrais pas dire à coup sûr. J'entends par là que les normales des sommets sont parallèles aux normales de la face donnant au maillage un aspect facetté. Si les normales sont lissées, la forme entière semble lissée. Quelque chose comme ceci:

Ombrage:

http://www.forman.free-online.co.uk/images/flatshading.png

Ombrage lisse:

http://www.forman.free-online.co.uk/images/smoothshading.png

images remplacées par des liens afin de limiter l'utilisation de ma bande passante

+0

On dirait que la "face" des visages est le problème (voir la réponse de Ian Hopkinson), tout comme le fait DirectX (je pense), donc je ne peux pas immédiatement penser à la raison pour laquelle la conversion va mal tourner. – ChrisF

0

Y at-il un problème avec unilatéralité? Par défaut, je pense que WPF rend les facettes à l'unisson - vous ne pouvez pas les voir du mauvais côté.

De même avec l'éclairage vous pouvez obtenir des effets bizarres si votre modèle est pas allumé de toutes les directions - essayez de mettre dans un AmbientLight