2012-08-28 7 views
0

Comment puis-je désactiver le comportement étrange de redimensionnement/redimensionnement d'un Viewport3d dans WPF? Notez que je ne change pas la hauteur de la fenêtre: (ou pourquoi faut-il faire)Viewport3D disable redimensionnement/redimensionnement

http://i.stack.imgur.com/jCgPe.png

http://i.stack.imgur.com/Q0V6X.png

Comment puis-je désactiver cette « fonction » de WPF

Répondre

2

Pour tout le monde trébuchant sur cette question, voici la réponse par Mike Danois: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/642253a6-e7a5-4ce2-bc08-e91f2634605b/

cette La mise à l'échelle automatique est une conséquence de la façon dont fonctionne la perspective.

Le champ de vision par défaut est 45 et la distance de plan de proximité par défaut est 0,125. Cela signifie qu'un point (x, 0, 0,125) sera visible du côté droit de la fenêtre lorsque sa coordonnée x est tan (45/2) * 0,125 = 0,051776. Notez que la largeur de la fenêtre ne joue pas de rôle dans ce calcul, si vous la faites plus large, le point, 0, 0.125 sera toujours visible sur le côté droit de la fenêtre, c'est pourquoi la théière apparaît plus grande.

Vous pouvez compenser une augmentation de la largeur en modifiant le champ de vue et à distance d'avion près, quelque chose le long de ces lignes:

double newWidth = grid.ActualWidth; 
double originalWidth = 509.0; 
double originalNearPlaneDistance = 0.125; 
double originalFieldOfView = 45.0; 
double scale = newWidth/originalWidth; 

double fov = Math.Atan(Math.Tan(originalFieldOfView/2.0/180.0 * Math.PI) * scale) * 2.0; 
camera.FieldOfView = fov/Math.PI * 180.0; 
camera.NearPlaneDistance = originalNearPlaneDistance * scale; 
+0

La pourriture du lien se produit. S'il vous plaît résumer ou citer les bits cruciaux ici. Les réponses de type lien uniquement sont sujettes à suppression. –

0

Je sais que c'est un ancien poste, mais je suis venu à travers cela quelques fois, et je ne suis pas sûr que la réponse acceptée est correcte. Near Plane Distance définit à quel point les objets sont trop proches. Je ne sais pas comment cela pourrait affecter l'échelle de viewport3d et de ses enfants. Ce que j'ai trouvé est que modifier Viewport3d.Width affecte l'échelle de la scène 3D, tandis que la modification de la hauteur ne provoque que l'écrêtage (ou l'ajout d'espace blanc si elle devient plus grande). Ce n'est pas intuitif à mon avis, mais c'est peut-être une convention de programmation 3D que je ne connais pas.

Ma solution pour le problème ci-dessus serait d'enlever le Viewport3D de la grille et de le placer dans un canevas. Cela empêchera le redimensionnement de la fenêtre de modifier la largeur de la fenêtre et il doit rester la même taille.