2010-10-25 5 views
1

J'écris mon propre moteur 3D et j'ai cette matrice pour faire un regard en perspective. (Il est une matrice standard, donc il n'y a rien d'intéressant)Transition douce de la 3D à la 2D

public static Matrix3D PrespectiveFromHV(double fieldOfViewY, double aspectRatio, double zNearPlane, double zFarPlane, double mod) 
    { 
     double height = 1.0/Math.Tan(fieldOfViewY/2.0); 
     double width = height/aspectRatio; 
     double d = zNearPlane - zFarPlane; 

     var rm = Math.Round(mod, 1); 

     var m = new Matrix3D(
       width, 0, 0, 0, 
       0, height, 0, 0, 
       0, 0, (zFarPlane/d) * rm, (zNearPlane * zFarPlane/d) * rm, 
       0, 0, (-1 * rm), (1 - rm) 
      ); 

     return m; 
    } 

je pourrais faire ma scène 2D comme regarder juste en ignorant cette matrice.

Mais voulez faire est de faire la transition en douceur de 3D à 2D et à l'arrière ...

Quelqu'un a une idée? Que dois-je changer dans cette matrice pour rendre les transitions douces possibles?

+0

Pourquoi votre m atrix appelé Matrix3D? Il s'agit d'une matrice quatre par quatre, donc vous devriez probablement appeler Matrix4x4 assez clair ce que c'est. ou encore mieux, l'obtenir modélisé, donc je peux dire Matrix thecoshman

+0

Ok. Tnx je pense à cela plus tard ... –

Répondre

1

je voudrais utiliser une interpolation entre m et la matrice d'identité I, comme suit:

Soit alpha passer de 1 à 0 en alpha * m + (1-alpha) * I

EDIT:

pourrait vous s'il vous plaît des détails sur

je pouvais faire regarder ma scène 2D comme juste en ignorant cette matrice.

L'idée est d'intpoler entre 2D (en ignorant la matrice) et 3D (en utilisant la matrice). Si vous expliquez comment exactement vous ignorez la matrice, l'interpolation devrait être droite.

+0

Non .. pas du tout du travail .. vous "algoritm" fonctionne très bien quand alpha est 1 ... mais pour d'autres valeurs je reçois assez foiré image ... –

+0

L'interpolation est le chemin aller ici. Vous voulez fondamentalement changer le sujet de "mise à l'échelle par la profondeur" qui est appliquée jusqu'à ce que vous n'échouez plus du tout. – thecoshman

+1

Vous avez besoin d'une projection orthographique plutôt que de l'identité. –

0

Eh bien .. ignorer la matrice « Prespective » je fais deux choses ... d'abord j'ignorer la matrice Prespective dans la matrice callculation

var matrix =
Matrix3DHelper.RotateByDegrees(renderParams.AngleX, renderParams.AngleY, renderParams.AngleZ) *
perspectiveMaterix;

je ne l'utilise pas perspectiveMatrix ...

et deuxième étape .. i ignore le paramètre 'W' lorsque le point progectin à l'écran

private Point3D GetTransformedPoint(Point3D p, Matrix3D m)
{
double w = (((m.M41 * p.X) + (m.M42 * p.Y)) + (m.M43 * p.Z)) + m.M44;
double x = ((((m.M11 * p.X) + (m.M12 * p.Y)) + (m.M13 * p.Z)) + m.M14)/(w);
double y = ((((m.M21 * p.X) + (m.M22 * p.Y)) + (m.M23 * p.Z)) + m.M24)/(w);
double z = (((m.M31 * p.X) + (m.M32 * p.Y)) + (m.M33 * p.Z)) + m.M34;
return new Point3D(x, y, z, w);
}

+0

par igoring 'w' param je veux dire que je mets 'w' à 1 comme constante ... –

Questions connexes