[directX débutant] centrer la caméra sur un unique objet en mouvement [Résolu]

Messages postés
43
Date d'inscription
mercredi 27 mai 2009
Dernière intervention
7 juin 2011
- - Dernière réponse : draonix
Messages postés
43
Date d'inscription
mercredi 27 mai 2009
Dernière intervention
7 juin 2011
- 22 avril 2010 à 16:42
Bonjour à tous et à toutes c'est encore moi avec mes questions
je dois faire une animation en utilisant diretX. Le problème que j'ai est que je n'arrive pas à centrer la caméra sur un objet en mouvement. J'utilise le bout de code suivant
  this.device.Transform.View = Matrix.LookAtLH(
                new Vector3(trans.X * Environment.TickCount, trans.Y*Environment.TickCount, -50f), // position de la caméra
                new Vector3(0,-this.pointA1.Y,0 /*trans.X * Environment.TickCount*/), // la direction du regard (l'origine où est centré le rectangle)
                new Vector3(0f, 1f, 0f)); // le vecteur directeur du regard (en face de soi)


où on a l'instance de la classe "this.pointA1" correspond à l'ordonnée où se situe l'image. Après de nombreux tests je vois l'objet se déplacer mais j'ai l'impression que celui-ci devient de plus en plus petit puis qu'il disparait.... Je ne comprends pas pourquoi ????
Quelqu'un pourrait m'expliquer et par la même occasion me dire comment il faut s'y prendre pour centrer la caméra une bonne fois pour toute sur une image en mouvement.
Un grand merci d'avance
P.S: Une explication me suffit largement (mais un bout de code ou une correction de ce que j'ai me conviendrait aussi )
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
Messages postés
327
Date d'inscription
vendredi 23 décembre 2005
Dernière intervention
8 février 2011
7
3
Merci
pour moi la caméra est positionnée selon le repère de la main gauche non?

Oui

Essaye avec ca
this.device.Transform.View = Matrix.LookAtLH(
                new Vector3(0, pointA1.Y - 50f, -50f), 
                new Vector3(0, pointA1.Y, 0), 
                new Vector3(0f, 1f, 0f));


Pourrais-tu mettre la fonction pour afficher ton objet ?

---
mon blog
Généralement le bug se situe entre le clavier et la chaise.
Le temps est une "chose" introuvable dont l'existence ne fait aucun doute.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 121 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_GG29
Messages postés
43
Date d'inscription
mercredi 27 mai 2009
Dernière intervention
7 juin 2011
3
Merci
Voilà je mets en lien ma fonction d'affichage
 public void Render(Vector2 robotPos,Vector2 trans, float angle,
             Vector2 posA1, Vector2 dPosA1, float angPhi1,
             Vector2 posA2, Vector2 dPosA2, float angPhi2,
             Vector2 posA3, Vector2 dPosA3, float angPhi3)
        {
            this.device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.White, 1.0f, 0);
            this.device.BeginScene();

            //this.device.RenderState.Lighting = false;

            this.device.SetStreamSource(0, this.vBuffer, 0); // on prends les données du buffer
            this.device.VertexFormat = CustomVertex.PositionNormalTextured.Format; // on redonne le format du vertex

            //-------------------------- Passage aux textures -------------------
            this.device.TextureState[0].ColorOperation = TextureOperation.Modulate;
            this.device.TextureState[0].ColorArgument1 = TextureArgument.TextureColor;
            this.device.TextureState[0].ColorArgument2 = TextureArgument.Diffuse;
            this.device.TextureState[0].AlphaOperation = TextureOperation.Disable;
            //-------------------------------------------------------------------//*/

            if (this.debutOperation == 0)   // condition sur l'initialisation du début des opérationS
                this.debutOperation = Environment.TickCount;

            Vector2 scalCent = new Vector2(0,0);
            float scalRot = 0;
            Vector2 scaling = new Vector2(1,1);

            // dessin sur le label1 des deux premiers triangle
            float startTime = Environment.TickCount;
            this.device.SetTexture(0, texture0);
            this.device.Transform.World = Matrix.Translation(new Vector3(5,5,0)) ;
          //  MessageBox.Show("gravity.X " + this.gravity.X + "garvity.Y " + this.gravity.Y);
            this.device.DrawPrimitives(PrimitiveType.TriangleList, 0, 2);//*/
            
            // transformation of the wheel one look the transformation of the point A2
            this.device.SetTexture(0, texture1);
            this.device.Transform.World = Matrix.Transformation2D(scalCent, scalRot, scaling, this.pointA2, angPhi2, new Vector2(0f, 0f));
            this.device.DrawPrimitives(PrimitiveType.TriangleList, 6, 2);

           // transformation of the wheel two look the transformation of the point A1
            this.device.SetTexture(0, texture2);
            this.device.Transform.World = Matrix.Transformation2D(scalCent, scalRot, scaling, this.pointA1, angPhi1, new Vector2(0f, 0f));
            this.device.DrawPrimitives(PrimitiveType.TriangleList, 12, 2);

            //transformation of the wheel three look the transformation of the point A3
            this.device.SetTexture(0, texture3);
            this.device.Transform.World = Matrix.Transformation2D(scalCent, scalRot, scaling, this.pointA3, angPhi3, new Vector2(0f, 0f));
            this.device.DrawPrimitives(PrimitiveType.TriangleList, 18, 2);//*/    


            // On précise comment est ce que la caméra (la matrice view) regarde la scène
            this.device.Transform.View = Matrix.LookAtLH(
                new Vector3(0, -pointA1.Y, -50f), // position de la caméra
                new Vector3(0, -pointA1.Y,0), // la direction du regard (l'origine où est centré le rectangle)
                new Vector3(0f, 1f, 0f)); // le vecteur directeur du regard (en face de soi)

            // application de la perspective pour avoir le rendu 2D
            this.device.Transform.Projection = Matrix.PerspectiveFovLH((float)Math.PI / 4,
                1.0f, 1.0f, 100.0f);

            this.device.EndScene(); // fin de la définition
            this.device.Present(); // lancer l'affichage 


        }  // Render (arguments)


par contre par rapport à ce que tu m'as donné, ça me fait la même chose par contre lorsque je fais ça ca me donne ce que je veux :D
this.device.Transform.View = Matrix.LookAtLH(
                new Vector3(0, pointA1.Y, -50f), 
                new Vector3(0, pointA1.Y, 0), 
                new Vector3(0f, 1f, 0f));


Par contre je mets un "-pointA1.Y" pour que l'on voit le déplacement tel que l'on a envie.
Ca marche :D

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 121 internautes nous ont dit merci ce mois-ci

Commenter la réponse de draonix
Messages postés
327
Date d'inscription
vendredi 23 décembre 2005
Dernière intervention
8 février 2011
7
0
Merci
Tes commentaires ne sont pas exacts
1er vecteur : Position de la camera
2eme vecteur : Point ou tu regardes (et non la direction)
3eme vecteur : Vecteur Up de la camera

Es-tu sur de déplacer la camera dans la même direction que l'objet et à la même vitesse ?

---
mon blog
Généralement le bug se situe entre le clavier et la chaise.
Le temps est une "chose" introuvable dont l'existence ne fait aucun doute.
Commenter la réponse de cs_GG29
Messages postés
43
Date d'inscription
mercredi 27 mai 2009
Dernière intervention
7 juin 2011
0
Merci
Salut et merci d'avoir été prompt à répondre
J'ai envie que ma caméra bouge en fonction du point 'pointA1' en question. Lorsque, je déplace la caméra par exemple suivre le point soit
 this.device.Transform.View = Matrix.LookAtLH(
                new Vector3(0, -pointA1.Y/50, -50f), // position de la caméra
                new Vector3(0,0,0), // la direction du regard (l'origine où est centré le rectangle)
                new Vector3(0f, 1f, 0f)); // le vecteur directeur du regard (en face de soi)



Si je ne me trompe pas je suis le point A1 mais même chose mon image disparait :s
... Je crois que je n'ai pas compris les fonctions en question , pour moi la caméra est positionnée selon le repère de la main gauche non? Normalement, la caméra doit se déplacer à la même vitesse que mon image (sinon comment faut il faire ? )

Merci d'avance et désolé si je t'embête
Commenter la réponse de draonix
Messages postés
43
Date d'inscription
mercredi 27 mai 2009
Dernière intervention
7 juin 2011
0
Merci
Par contre dans mon code précédent, j'ai ma texture0 qui refuse de bouger :s
Commenter la réponse de draonix

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.