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

Résolu
draonix Messages postés 43 Date d'inscription mercredi 27 mai 2009 Statut Membre Dernière intervention 7 juin 2011 - 22 avril 2010 à 10:41
draonix Messages postés 43 Date d'inscription mercredi 27 mai 2009 Statut Membre 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 )

5 réponses

cs_GG29 Messages postés 326 Date d'inscription vendredi 23 décembre 2005 Statut Membre Dernière intervention 8 février 2011 17
22 avril 2010 à 16:12
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.
3
draonix Messages postés 43 Date d'inscription mercredi 27 mai 2009 Statut Membre Dernière intervention 7 juin 2011
22 avril 2010 à 16:41
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
3
cs_GG29 Messages postés 326 Date d'inscription vendredi 23 décembre 2005 Statut Membre Dernière intervention 8 février 2011 17
22 avril 2010 à 14:46
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.
0
draonix Messages postés 43 Date d'inscription mercredi 27 mai 2009 Statut Membre Dernière intervention 7 juin 2011
22 avril 2010 à 15:46
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
draonix Messages postés 43 Date d'inscription mercredi 27 mai 2009 Statut Membre Dernière intervention 7 juin 2011
22 avril 2010 à 16:42
Par contre dans mon code précédent, j'ai ma texture0 qui refuse de bouger :s
0
Rejoignez-nous