2010-07-23 6 views
0

J'essaie actuellement de comprendre WPF, et je suis en train de convertir des espaces de coordonnées avec des structures Matrix3D.La fonction WPF Matrix3D.Rotate() est-elle inactive?

Après avoir réalisé WPF a des différences entre Point3D et Vector3D (c'est deux heures que je ne reviendrai jamais ...) Je peux obtenir une matrice de traduction mis en place. J'essaie maintenant d'introduire une matrice de rotation, mais cela semble donner des résultats inexacts. Voici mon code pour mon monde transformation de coordonnées ...

private Point3D toWorldCoords(int x, int y) 
    { 


     Point3D inM = new Point3D(x, y, 0); 


     //setup matrix for screen to world 
     Screen2World = Matrix3D.Identity; 

     Screen2World.Translate(new Vector3D(-200, -200, 0)); 
     Screen2World.Rotate(new Quaternion(new Vector3D(0, 0, 1), 90)); 

     //do the multiplication 
     Point3D outM = Point3D.Multiply(inM, Screen2World); 

     //return the transformed point 
     return new Point3D(outM.X, outM.Y, m_ZVal); 


    } 

La traduction semble fonctionner très bien, la rotation de 90 degrés semble toutefois revenir inaacuracies à virgule flottante. La ligne Offset de la matrice semble être légèrement décalée (0,000001 dans les deux cas) ce qui produit un aliasing sur les rendus. Y a-t-il quelque chose qui me manque ici, ou dois-je juste arrondir manuellement la matrice?

Vive

Répondre

2

Même avec double précision mathématiques il y aura des erreurs d'arrondi avec la multiplication des matrices.

Vous effectuez 4 multiplications, puis additionnez les résultats pour chaque élément de la nouvelle matrice.

Il est peut-être préférable de commencer par utiliser la matrice Screen2World comme matrice de traduction plutôt que de multiplier une matrice d'identité par votre traduction, puis par la rotation. C'est deux multiplications matricielles plutôt qu'une et (plus que) deux fois l'erreur d'arrondi.

Questions connexes