begin process at 2012 02 11 05:52:24
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C#

 > 

Multimédia

 > 

Autre

 > 

Projection 3D


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Projection 3D

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ée dans : public, tr, matrix, float, mxres


Répondre à ce message

Sujets en rapport avec ce message

Plantage designer suite à une modification sur le formulaire [ par Mickael1984 ] Bonjour, je suis un peu perdu sur un développement que je fais actuellement je mets le code, si quelqu'un a déjà eu ce genre de problème. Mon problè un problème avec c# [ par amzerd ] bonjour je suis débutans en c# j'ai rencontre plusieurs problème et parmis c problème une erreur quand je compile mon prog l'erreur est : L'index éta erreur de syntaxe dans l'instruction INSERT INTO :( base access [ par nizarawi ] Bonjour, svp est ce que vous pouvez m'aider??j'ai une erreur de syntaxe dans l'instruction INSERT INTO ,et alors je vous pries de bien vouloir m'aide Cast C# [ par artichomaske ] Bonjour ! Question simple, pour personnes averties: J'ai une classe : [code=cs] public class ListOfTopicsView { public probléme : Object reference not set to an instance of an object [ par ami7 ] bonjour j'ai message d'erreur suivant : Object reference not set to an instance of an object et indique un trait jaune au niveau de la méthode " de Calender + TextBox [ par abrim ] Bonjour tout le monde , Je débute avec c# et je veux créer dynamiquement une zone de texte et un calendrier dont la date sélectionnée sera affiché da aceeder une zone de texte créer dynamiquement [ par abrim ] Bonjour Tout le monde Je débute avec c# j'ai besoin de votre aide , Moi j'ai cré un bouton et une zone de text dynamiquement avec c# sous visual stu


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,541 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales