Partage
  • Partager sur Facebook
  • Partager sur Twitter

changer repere en 3D

gluOrtho2D à t'il un équivalent 3d

    16 septembre 2007 à 20:38:30

    Bon voilà je déteste cette histoire de rapport à l'écran je n'y comprend rien, je croyais que 1 representait la largeur de l'ecran et bien on se retrouve avec des 1.5 .

    Bref je préfere donner des tailles en pixel comme dans le TP avec la grue car c'est vraiment plus pratique et moins abstrait. Seulement je ne sais pas comment faire celà en 3D.

    Merci d'avance
    • Partager sur Facebook
    • Partager sur Twitter
      16 septembre 2007 à 20:45:57

      Salut.

      Il manque un bout de la discussion non ?
      Pourrais tu expliquer ton problème du début ?
      • Partager sur Facebook
      • Partager sur Twitter
        16 septembre 2007 à 23:05:45

        Ahem desolé j'ai mal du m'exprimer.
        Je suis les cours de Kayl et j'ai remarqué qu'en 2d avec open gl on peux configurer le repere (axe x et y)en leur assoiant des valeurs maximales(640,480 par exemple) via la fonction "gluOrtho2D".

        Mais Kayl ne dit pas s'il existe un équivalent en 3d car je ne suis pas à l'aise du tout avec ces rapports 1,1, je ne visualise pas à quoi ils correspondent.
        • Partager sur Facebook
        • Partager sur Twitter
          16 septembre 2007 à 23:41:38

          Que veux tu faire avec gluOrtho2D ?
          Je veux dire, quel est le code qui te pose problème ?
          • Partager sur Facebook
          • Partager sur Twitter
            16 septembre 2007 à 23:47:09

            pour changer de repère, suffit de rappeler SDL_setVideoMode et gluPerspective (avec le reste qui va bien).
            • Partager sur Facebook
            • Partager sur Twitter
              17 septembre 2007 à 0:00:42

              Tu voudrais dessiner en 3D avec pour "repère" 1 = un pixel ? Je ne vois vraiment pas l'intérêt si c'est ça.
              • Partager sur Facebook
              • Partager sur Twitter
                17 septembre 2007 à 0:32:16

                Je ne comprends pas bien ce que tu demandes.

                Pour différencier gluOrtho et gluPerspective (pour faire simple), je dirais que gluPerspetive est assez réaliste :

                En effet, un segment de 1 de large sera plus grand s'il est "plus pres" que s'il est "plus loin" -> c'est dans la logique des choses. (utilisation d'un Frustrum)

                Alors que gluOrtho (artificiel) conservera la meme longueur que le segment soit pres ou loin (je dis segment, mais ça peut etre polygone, objet : n'importe quoi en fait :) )

                Détaille ce que tu veux exactement savoir !
                • Partager sur Facebook
                • Partager sur Twitter

                Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                  17 septembre 2007 à 10:23:41

                  Citation : Fvirtman

                  Frustrum


                  Frustum.

                  Pour ton explication, il y a des noms respectifs ;) :

                  Perspective conique.
                  Perspective cavalière.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    17 septembre 2007 à 10:26:41

                    Citation : Yno

                    Tu voudrais dessiner en 3D avec pour "repère" 1 = un pixel ? Je ne vois vraiment pas l'intérêt si c'est ça.


                    L'intêret c'est que je sait quelle taille fait un pixel je visualise mieux dans mon esprit.

                    Citation : Fvirtman

                    En effet, un segment de 1 de large sera plus grand s'il est "plus pres" que s'il est "plus loin" -> c'est dans la logique des choses. (utilisation d'un Frustrum)



                    Bon alors c'est un rapport a l'ecran donc ce que je peux faire c'est par exemple pour x: taillexenpixel*1/largeur ecran ?

                    Enfait je fais un produit en croix. 1 ca représente bien la largeur de l'écran?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      17 septembre 2007 à 10:36:17

                      Citation : Son Of Sparda

                      Enfait je fais un produit en croix. 1 ca représente bien la largeur de l'écran?


                      Ça dépend de ta composante Z, comme l'a très bien expliqué Fvirtman.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        17 septembre 2007 à 12:06:18

                        Jette un oeil sur ce schéma.

                        http://wwweic.eri.u-tokyo.ac.jp/computer/manual/lx/SGI_Developer/books/Perf_GetStarted/sgi_html/figures/aspect.ratio.gif

                        Le frustum, tu définis l'angle d'ouverture de la caméra en y, et un ratio (4/3, 16/9 : comme les écrans)
                        Dans un premier temps, si tu ne veux pas te casser la tete, met 1.0 comme ratio
                        tu définis aussi 2 plans de clipping : near et far : seuls seront affichés les objets entre ces plans.
                        je te conseille de mettre 1.0 pour plan near (si tu mets un nombre trop petit : genre 0.1 voir moins, tu auras des soucis d'arrondis pour le rendu [...] )
                        et met par exemple 100000 pour le plan far.

                        la fonction pour définir tout ça :
                        1. void gluPerspective  ( GLdouble angle , GLdouble ratio , GLdouble zNear , GLdouble zFar );


                        ensuite, toi, tu veux savoir ou seront projetées les coordonnées souhaitées :) -> probleme de trigo

                        pour un point Z donné, tu seras sur un plan Pparallele aux plans near et far.
                        soit :
                        O : le centre de la caméré
                        C : projection orthogonale de O sur le plan P : C sera toujours au centre du plan limité par le frustum.
                        exemple sur le schéma : sur le plan Near, C est le point intersection des segments marqués h et v.
                        E : point d'extrmité horizontale : par exemple le point le plus a droite en X : sur le schéma, c'est le point au bout de l'axe marqué h (a gauche ou a droite peut importe)

                        Soit le triangle OCE : triangle rectangle en C (car C ortogonale au plan P porteur de C,E)
                        angle O dans ce triangle = angle_frustum/2.0 (dessine, tu verras)
                        distance OC = le Z que tu souhaites.

                        Tu cherches la largeur du plan P : c'est 2*CE

                        Tu as un triangle rectangle : tu connais un coté et un angle : hop ! une tangeante, et tu trouves le coté opposé :)
                        l'inverse de la fonction tangeante est la fonction arctan !

                        Je te laisse finir :)
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                          19 septembre 2007 à 17:07:43

                          Je planche sur ton truc avec un peu de mal (j'ai pas fait énormement de maths) bon enfin voilà comment je voyais l'affaire.

                          On a un repere xyz avec bon allez disons la taille d'une map 9000,9000,1000(grandeurs maxi en pixels).

                          On définit les vertices dans ce repere en ce moquant des proportions.

                          Ensuite on place la caméra... on la parametre avec le ratio, le clipping comme tu dis et elle se charge seule de l'effet de perspective en reduisant la taille en fonction de la distance(en gros j'ai l'idée que le positionnement dans le repere et la camera n'ont rien à voir),où est-ce que j'ai faux?
                          • Partager sur Facebook
                          • Partager sur Twitter
                            19 septembre 2007 à 19:39:09

                            Bon, alors prenons un cas simple :

                            Tu dessines tes points dans le plan Z = 0.
                            Tu les dessine dans le rectangle défini par x1,y1 (point inférieur gauche) x2,y2 (point supérieur droit).

                            Déja, je te conseille de garder toujours le meme ratio entre (x2-x1)/(y2-y1) : 4/3 ou 16/9, comme les télés, me parait pas mal.
                            --> Si pendant le jeu, tu changes ce ratio, ton image va se distordre, c'est moche.
                            Donc pour le ratio que tu passes a gluperspective : passe lui une constante.
                            Pareil, ton angle d'ouverture, ne le change pas : fixe la a 45°.
                            Near et Far, pas besoin de faire varier.
                            --> gluPerspective ne prend que des constantes.

                            Maintenant, il faut savoir quoi passer au gluLookAt.
                            On attend la position de la caméra O
                            Elle regarde un point P
                            Le vecteur Up est U

                            Bon, du coup, ta caméra sera orthogonale au plan : a un position Oz = -z (plus ou moins éloignée) : on va calculer ça.
                            Quid de la position Ox, Oy de la caméra : et bien elle est au "milieu" du rectangle (x1,y1) (x2,y2)
                            donc :
                            Ox = (x1+x2)/2; // moyenne
                            Oy = (y1+y2)/2; // moyenne

                            Quid du point de regard ? Il est en face, sur le plan :
                            donc : P(Ox,Oy,0)

                            Quid du vecteur Up U ? Il est constante : a moins que tu veuille renverser ton décor (mettre la tete de ton mario en bas...)
                            U(0,1,0)

                            Maintenant, il reste Oz.

                            Tu consideres le triangle OPE (ou E est le point extremité dont j'ai parlé plus haut dans un autre post), on sait que PE = (x2-x1)/2 (moitié horizontale du ractangle)

                            tu as cette distance, tu as l'angle au niveua de la cam : dans ce triangle, cet angle est la moitié de l'angle d'ouverture (fait un dessin), donc 22.5°

                            triangle rectangle, on sait que tan(angle) = cote oppose/cote adjascent

                            le coté adjascent est Oz, le coté opposé est PE, l'angle est 22.5°
                            --> tu retouves Oz.

                            Et tu peux appliquer ton GluLookAt.
                            • Partager sur Facebook
                            • Partager sur Twitter

                            Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                              21 septembre 2007 à 13:37:54

                              OUahh !
                              merci j'ai un peu de mal avec openGL c'est assez abstrait(kayl explique moins le pourquoi du comment de chaque chose comme le fait m@téo meme si ses cours sont supers) en tout cas merci pour ton coup de main (placer la caméra dynamiquement par rapport a la taille de l'écran de cette manière je n'aurais jamais ne serait-ce que pu imaginer).

                              Pour le point de regard... on peut bien entendu le désaxer non?
                              En tout cas j'essaie tout ça sur mon pc dès que possible, encore merci à toi Fvirtman et aux autres!
                              • Partager sur Facebook
                              • Partager sur Twitter
                                21 septembre 2007 à 16:33:15

                                openGL c'est abstrait... la 3D c'est abstrait car ça n'existe pas ;) ce n'est qu'une représentation sur un écran qui est, en soit, 2D.

                                Préférablement il faut comprendre l'algèbre vectoriel, les matrices, les rapports entre Plan et Espace, etc...

                                Bonne chance
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  21 septembre 2007 à 16:48:25

                                  Il est vrai qu'un certain baggage mathématique est préférable avant de faire de la 3D (meme si certaines fonctions permettent de "faire de la magie sans savoir comment elle est faite" pour un non-mathématicien, si j'ose dire !)

                                  En baggage bon a connaitre :
                                  - trigonométrie (sinus, cos, tan)
                                  - vecteurs
                                  - interpollation et barycentres.
                                  - espace vectoriel, espace affine : espaces de points & de vecteurs
                                  - matrices, plus particulierement matrices de transformation 4x4
                                  - coordonnées homogenes
                                  - espace de projection
                                  - ...

                                  Si tu connais pas tout, c'est pas grave, tu apprendras sur le tas, mais il est bon d'en connaitre un petit peu quand meme.
                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                                  changer repere en 3D

                                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                  • Editeur
                                  • Markdown