Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Projection 3D [ Multimédia / Autre ] (MaxSoldier)

samedi 22 juillet 2006 à 16:22:12 | Projection 3D

MaxSoldier

Membre Club
Bonjours, voilà en ce moment, ( et oui les grande vacances, le moment des très gros projets ), je code un moteur de rendu 3D entièrement software, je sais c'est lent, mais je le fait pour l'apprendtissage, et pour appliquer mes connaissances des matrices.

Voilà mon problème, je cherche 2 matrices : Une matrice de correction de la perspective, et une autre de projection d'un point 3D sur un plan 3D, voici mon code :


public Point2D Project(Point3D P,Camera Cam){
            Matrix WorldTransform = new Matrix(4,4);
            Matrix CameraTransform = new Matrix(4,4);
            Matrix PerspectiveTransform = new Matrix(4,4);
           
            WorldTransform = Tr.Translation(P.PointMx.X,P.PointMx.Y,P.PointMx.Z) * Tr.RotationX(P.Alpha) * Tr.RotationY(P.Beta) * Tr.RotationZ(P.Gamma);
            CameraTransform = Tr.InverseRotationX(Cam.Alpha) * Tr.InverseRotationY(Cam.Beta) * Tr.InverseRotationZ(Cam.Gamma) * Tr.InverseTranslation(Cam.CamMx.X,Cam.CamMx.Y,Cam.CamMx.Z);
            //PerspectiveTransform = Tr.Perspective();
           
           
            P.PointMx= CameraTransform * WorldTransform;
           
            /*
             * u=factor_x*x/z +w/2
             * v=factor_y*y/z +h/2
             *
             * factor_x=w/(2*tan(ax))
             * factor_y=h/(2*tan(ay))
             * */
           
           
           
            return Get2DPoint(P.PointMx);
        }

        public Matrix Perspective(){
            Matrix ResMx = new Matrix(4,4);
           
            float CoefB=100;
            float CoefF=2;
           
            ResMx.M[0,0] = (float)(1/Math.Tan(45));
            ResMx.M[1,1] = (float)(1/Math.Tan(Math.PI/2));
           
            ResMx.M[2,2] = (CoefB + CoefF) / (CoefB - CoefF);
            ResMx.M[3,3] = (-2 * CoefB * CoefF)/(CoefB - CoefF);;
           
            ResMx.M[2,3] = 1;
           
            return ResMx;
        }


Je ne sais pas pourquoi mais ma matrice de correction de la perspective, ne marche pas convenablement ( je l'ai trouvé sur Wikipedia pourtant ) et je me demande si ce n'est pas l'ordre de mes produits matricielles dans la matrice camera qui fait tout foirer, pourtant, j'ai essayé toutes le possibilité.

En gros, quelqu'un connait-il une autre matrice de correction de la perspective et une matrice de projection 3D ?

Merci d'avance !

PS : Ma classe matrcielle est totalement fonctionnelle et le problème ne vient pas de là, mais je vous donne quand même mon opérateur :

        public static Matrix operator *(Matrix Mx1,Matrix Mx2){
           
            if(Mx1.MWidth == Mx2.MHeight){
               
                Matrix MxRes = new Matrix(Mx1.MHeight,Mx2.MWidth);
                MxRes.FillZero();
               
                for(int i=0;i<Mx1.MHeight;i++){
                    for(int j=0;j<Mx2.MWidth;j++){
                        for(int k=0;k<Mx1.MWidth;k++){
                            MxRes.M[i,j]+= Mx1.M[i,k] * Mx2.M[k,j];
                        }
                    }
                }
               
                return MxRes;
               
            }else{
                return null;
            }
           
        }
       
        public static Matrix operator *( float n , Matrix A )
        {
            Matrix MxRes = new Matrix(A);
           
            for ( int i = 0 ; i < A.MHeight  ; i++ )
            {
                for (int j = 0 ; j < A.MWidth ; j++ )
                {
                    MxRes.M[i,j] = n * A.M[i,j];
                }
            }
           
            return MxRes;
        }
       
        public static Matrix operator *( Matrix A , float n )
        {
            Matrix MxRes;
            MxRes = n * A;
            return MxRes;
        }

private int _MWidth;
        private int _MHeight;
       
        public float[,] M;

       
        public Matrix(){
           
        }
       
        public Matrix(int MxWidth,int MxHeight){
            this._MWidth = MxWidth;
            this._MHeight =MxHeight;
           
            this.M = new float[this._MWidth,this._MHeight];
           
            FillIdentity();
        }


        public Matrix(float X,float Y,float Z){
            this.MWidth = 1;
            this.MHeight =4;
           
            M = new float[1,4];
            FillIdentity();
           
            M[0,0] = X;
            M[0,1] = Y;
            M[0,2] = Z;
        }
   

( Les deux constructeurs utilisés, et mon opérateur )
  
-=Arsenik=-



Cette discussion est classé dans : public, tr, matrix, float, mxres


Répondre à ce message

Sujets en rapport avec ce message

Pb avec mon programme - help... [ par adrien78 ] Voici les sources de mon programme il bug :// project created on 09/11/2002 at 10:51// By Adrien HADJ SALAH// http://www.informatick.com// Pour me rem Accès [ par fredza ] Bonjour et bonne année à toutes et tous,J'ai un fichier ip.cs voilà brièvement son contenu :namespace iprog{ /// /// Description résumée de ip. /// Conversion API Win32 -> C# [ par merlintintin ] J'aimerais utiliser des fonctions de l'APIen C#. Il faut pour cela redefinir les fonctions et les structures de l'API en C#. Malheureusement, je ne sa La référence d'objet n'est pas définie à une instance d'un objet. [ par kinderman81 ] Salut,Je souhaite ajouter des objets "Concessionnaire" dans un vecteur ArrayList (qui est la liste des concessionnaires): Celui-ci est l'objet Collect classe static dans classe static [ par linx20 ] Voila en gros je veux inclure une classe static ds mon autre classe static : public abstract class MaClasseStatic1{public static MaClasseStatic2 st2;/ TcpClient et TcpListener une est dérivée l'autre incluse dans une class [ par Trollien ] Bonjour,je commence à pété un cable car je ne comprend pas trop ce qui ce passe alors voici les deux sources et un bout de code de l'appli.Si qqn a un Creer et enregistrer une dll .net pour l'utiliser en ASP [ par Kev33 ] Bonjour,J'essai de creer une dll en .net et de l'enregistrer avec la commande "regsvr32 madll.dll"mais j'ai une erreur : "madll.dll a été chargé mais L'objet et moi [ par tobleronne ] Bonjour,J'ai fait une classe et j'arrive pas a y acceder dans une autre.Ma classe general.cs : ---------------------------public class general{public serialisation [ par zaka48 ] je voudrai serialiser un objet "etudiant" sous cette forme xxxxxx<DateDe prob chargement dll/conversion de type cpp/c# [ par davtemp ] bonjour,J'ai un programme en cpp 6.0 qui charge une dll compilée aussi en cpp 6.0. Mon programme fonctionne bien et j'en suis bien content, sauf que l


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,374 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.