2010-05-17 4 views
0

J'utilise des données de suivi 2D/3D (fournies par pfHoe) pour aider à intégrer certains modèles 3D dans la lecture de certaines vidéos 2d. Les choses marchent ... okay ... mais il y a encore des "glissements" visibles des modèles par rapport à l'arrière-plan vidéo et je suppose que c'est peut-être parce que la méthode XNA CreatePerspective helper ne prend pas en compte certains des données supplémentaires fournies par pfHoe telles que les angles de champ de vision horizontal/vertical indépendants et la distance focale.Calcul de matrice de vue plus complexe requis pour les modèles 3D composites avec vidéo 2d

Quelqu'un pourrait-il me montrer quelques exemples de construction de matrices de vues qui incluent de tels détails?

Répondre

1

Cet article MSDN vous montre comment écrire une méthode qui crée une matrice en perspective qui prend en compte indépendamment (quoique, en C++) FOV horizontal et vertical
http://msdn.microsoft.com/en-us/library/bb147302%28VS.85%29.aspx

D3DXMATRIX 
ProjectionMatrix(const float near_plane, // Distance to near clipping 
             // plane 
       const float far_plane, // Distance to far clipping 
             // plane 
       const float fov_horiz, // Horizontal field of view 
             // angle, in radians 
       const float fov_vert) // Vertical field of view 
             // angle, in radians 
{ 
    float h, w, Q; 

    w = (float)1/tan(fov_horiz*0.5); // 1/tan(x) == cot(x) 
    h = (float)1/tan(fov_vert*0.5); // 1/tan(x) == cot(x) 
    Q = far_plane/(far_plane - near_plane); 

    D3DXMATRIX ret; 
    ZeroMemory(&ret, sizeof(ret)); 

    ret(0, 0) = w; 
    ret(1, 1) = h; 
    ret(2, 2) = Q; 
    ret(3, 2) = -Q*near_plane; 
    ret(2, 3) = 1; 
    return ret; 
} // End of ProjectionMatrix 

Le calcul est expliqué plus en détail dans l'article lié ci-dessus pour vous aider à écrire une version C# de cette méthode. Bonne chance :-)

+0

Hmmm ... J'aurai peut-être besoin d'un peu plus car ma première interprétation en C# donne quelques résultats ... bizarres ... :) private Matrix CreateProjection (float horizontalFov , float verticalFov, float nearPlane, float farPlane) { var w = 1f/(flottant) Math.Tan (horizontalFov * 0.5f); var h = 1f/(flottant) Math.Tan (verticalFov * 0.5f); var q = lointainPlane/(farPlane - nearPlane); return new Matrice (w, 0, 0, 0, 0, h, 0, 0, 0, 0, q, 1, 0, 0, -q * à proximité de l'avion, 0); } – lzcd

Questions connexes