2010-11-12 6 views
2

Je tente d'héberger un formulaire WPF sur une surface Viewport2DVisual3D. J'ai mis en place l'appareil photo de sorte que les contrôles correspondent à la largeur de la fenêtre. La géométrie par défaut mappe le formulaire entier sur une face carrée, il est donc nécessaire de faire une sorte de transformation pour que la surface ressemble à une forme 2d normale et ne pas apparaître étirée verticalement. La forme semble correcte dans l'ensemble, mais le texte ne se met pas bien à l'échelle, il est flou et bloc et semble mauvais de différentes manières d'une ligne à l'autre. Voici ce que j'ai essayé de régler le rapport d'aspect:Texte flou Viewport2DVisual3D sur les contrôles WPF

  • A ScaleTransform3D
  • Réglage du maillage Positions au format approprié
  • Réglage des TextureCoordinates au rapport d'aspect approprié

Le les deux premiers me donnent les résultats que je veux, sauf pour le texte blocky/flou. Ma conclusion à ce stade est que le rendu de la police se produit avant que l'image du formulaire ne soit projetée sur la surface 3D et que la mise à l'échelle se produise, donc cela semblera mauvais quoi qu'il arrive. Est-ce que quelqu'un sait un moyen de contourner cela ou de le mettre en place dès le début? Je ne connais pas beaucoup les graphismes en 3D, juste assez de maths de base pour obtenir les angles de caméra à droite, etc.

Avoir testé sur Win 7 et XP.

Certaines des ressources que j'ai utilisé:

Quelques extraits du code:

<Viewport2DVisual3D.Geometry> 
    <MeshGeometry3D x:Name="FrontFaceGeometry"        
     Positions="-1,1,0 -1,-1,0 1,-1,0 1,1,0" 
     TextureCoordinates="0,0 0,1 1,1 1,0" 
     TriangleIndices="0 1 2 0 2 3"/> 
</Viewport2DVisual3D.Geometry> 

...

<Grid Width="500" x:Name="FrontFaceGrid"> 

Ensuite, dans la routine Window_Loaded, par ex.

var aRatio = FrontFaceGrid.ActualHeight/FrontFaceGrid.ActualWidth; 
FrontFaceGeometry.Positions[0] = new System.Windows.Media.Media3D.Point3D(-1, aRatio, 0); 
FrontFaceGeometry.Positions[1] = new System.Windows.Media.Media3D.Point3D(-1, -aRatio, 0); 
FrontFaceGeometry.Positions[2] = new System.Windows.Media.Media3D.Point3D(1, -aRatio, 0); 
FrontFaceGeometry.Positions[3] = new System.Windows.Media.Media3D.Point3D(1, aRatio, 0); 
+0

Quelle version de .NET utilisez-vous? –

+0

Je suis sur .NET 4.0. – flatline

+0

Avez-vous essayé SnapsToDevicePixels = "Vrai" –

Répondre

0

Vous rendrez la forme WPF sur une texture sur la place, puis afficher le carré à l'aide du moteur de texture du GPU. Selon le mode utilisé par le moteur de texture, cela peut provoquer un blocage ou un flou (puisque le moteur de texture tentera d'interpoler la texture par défaut). Pourquoi voulez-vous le rendre en utilisant un visuel 3D et pas normalement s'il est destiné à remplir l'écran?

+0

Je voulais effectuer des transitions 3D entre deux formes.Plus précisément, mon intention est de retourner le formulaire sur l'axe des Y (en supposant que l'axe Z est face à vous) pour révéler une autre forme sur le dos. Les trucs en 3d cuits dans WPF ont rendu cela étonnamment facile à première vue, je voudrais juste que ça soit un peu plus propre avec la mise à l'échelle. – flatline

+0

Afficher le formulaire normalement, en utilisant simplement la 3D pour la transition. –

3

Pour éviter le texte flou et d'autres distorsions visuelles, faites en sorte que le rapport d'aspect 3D XY soit égal au rapport d'aspect de la commande 2D. Ceci est réalisé en définissant X et Y MeshGeometry3D.Positions. Par exemple, un contrôle 2D de taille à 500x700 pourrait être mis en correspondance avec un rectangle maillage 3D sans distorsion par des positions assignant

<Viewport2DVisual3D.Geometry> 
    <MeshGeometry3D x:Name="FrontFaceGeometry"        
     Positions="-2.5,3.5,0 -2.5,-3.5,0 2.5,-3.5,0 2.5,3.5,0" 
     TextureCoordinates="0,0 0,1 1,1 1,0" 
     TriangleIndices="0 1 2 0 2 3"/> 
</Viewport2DVisual3D.Geometry> 

L'image de la commande 2D affichée dans l'environnement 3D est toujours « étirées » aux dimensions du maillage.

Questions connexes