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>
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