3D vers 2D
Répondre à la discussion
Affichage des résultats 1 à 7 sur 7

3D vers 2D



  1. #1
    inviteeeb6425e

    3D vers 2D


    ------

    Bonjour à tous,
    ma question c'est que je veux des équations de conversion de coordonnées d'un point 3D vers 2D autrement dit en faire une simple projection sachant que le plan 2D est l’écran de l'ordinateur.
    j'ai pu faire un petit moteur 3D qui marche bien en translatant les objets mais qui des objets illogique (de point de vue longueur des arrêtes et angles entre les droites) en rotation.
    merci d'avance.

    -----

  2. #2
    polo974

    Re : 3D vers 2D

    On suppose que tu as la caméra en (0,0,0) qu'il n'y a rien derrière (ni trop près devant), que l'axe z est bien l'axe de profondeur. (sinon une petite rotation, un poil de translation, et hop).

    Et bien maintenant, divise les coordonnées de chacun de tes points par son z, et magie-magie, tous les z valent 1, donc la projection est faite!

    Il faut par la même occasion faire une mise à l'échelle pour passer dans l'espace écran et comme celui n'a probablement pas le (0,0) au milieu, une petite translation...
    Jusqu'ici tout va bien...

  3. #3
    inviteeeb6425e

    Re : 3D vers 2D

    merci polo974 de me répondre.
    malheuresement g pa bien compris ta réponse.
    peut être ça sera mieux compréhensible en écrivant des équations.
    alors un poit dans l'espace: M(x,y,z)
    mon ecran est un repere cartesien orthonormé (o,oi,oj) donc les variable sont:
    M.x
    M.y
    M.z
    sont les coordonnées du point M
    ecran.x
    ecran.y
    sont les coordonnées de chaque point dans l'écran
    il est possible d'ajouter d'autres variable (si c'est necessaire)



    mais je pense qu'une division par z m'empeche d'acceder aux points appartien a z=0 (car x/z ou y/z est impossible si z=0)
    merci

  4. #4
    polo974

    Re : 3D vers 2D

    mais je pense qu'une division par z m'empeche d'acceder aux points appartien a z=0 (car x/z ou y/z est impossible si z=0)
    Ben oui, c'est pour ça que j'ai donné la première phrase...

    Il faut bien voir que le monde M(x,y,z) peut être vu de différents endroits et dans différentes directions.
    Il faut donc définir le point de vue (M.x, M.y, M.z) de la caméra (la direction plus loin...).

    Et bien maintenant, on translate tout le monde pour que la caméra en devienne le nombril.
    (pour tous les points retrancher les coordonnées de la caméra).
    la caméra est donc en (0,0,0)

    Puis la direction (je tiens mes promesses...)
    Donc manque de pot, l'axe z de la caméra ne regarde pas dans la bonne direction, et bien soyons encore plus nombriliste, faisons tourner le monde autour de la caméra pour que l'axe central de la vue désirée se retrouve sur l'axe z (éventuellement une petite rotation autour de z juste pour avoir les pieds en bas, et la tête en haut).

    Bon, maintenant, il y a tous les points à z strictement positif qui nous intéressent (le reste est dans le rétro).
    Pour être plus juste, il faut définir une fenêtre par laquelle on va regarder (un rectangle à une certaine distance de la caméra (+/-xc, +/-yc, zc).

    On peut effectuer le clipping en z: virer tout ce qui est z < zc (au choix clipping sauvage: virer les éléments comportant un point z < zc, ou couper les cheveux en 4, bref couper les éléments pour ne garder que ce qu'on veut)

    Maintenant, on peut diviser les x,y,z par leur z respectifs.
    La projection est faite, il faut la mettre à l'échelle (en supposant xe, et ye demi largeur et hauteur de l'écran)
    (x * xe / xc, y * ye/ yc).

    Bon, il y a des trucs qui sortent du cadre, il faut maintenant clipper en x et y (virer tout ce qui sort de ]-xe,+xe[ et ]-ye, +ye[) (au choix clipping sauvage ou plus propre, mais pour le moment si ce n'est pas codé, commencer par la solution sauvage).

    Ça y est, tout est dans l'espace ]-xe,+xe[ , ]-ye, +ye[
    Il faut probablement l'orienter et le décaler pour rentrer dans un espace genre ]0,2xe[ , ]0,2ye[ ...

    Et bien, voilà, on a une image.

    Il faut bien comprendre tous les changement de repères, c'est un peu acrobatique au début, mais on s'en sort (sinon voir le source de opengl, il y a tout dedans et peut-être même de la doc ...)
    Jusqu'ici tout va bien...

  5. A voir en vidéo sur Futura
  6. #5
    inviteeeb6425e

    Re : 3D vers 2D

    merci c plus clair
    mais par analogie avec OpenGL la camera n'est pas fixe (je pense) mais on peut changer le point de vue en utilisant: gluLookAt()

  7. #6
    inviteeeb6425e

    Re : 3D vers 2D

    autrement dit, la rotation de la camera suivant l'axe X de teta_x=90° (par exemple) engendre une rotation des axes Y et Z de 90°
    donc:
    y = y * cos(tata_x)
    z = z * sin(teta_x)
    , non??

  8. #7
    polo974

    Re : 3D vers 2D

    heu, j'ai plus pratiqué opengl depuis quelques décennies (bon, ok, 2)...

    pour une rotation 2D autour de x:
    yout = y * cos(tata_x) - z * sin(tata_x)
    zout = y * sin(tata_x) + z * cos(tata_x)

    si c'est 90°
    yout = -z
    zout = y
    Jusqu'ici tout va bien...

Discussions similaires

  1. Orientation vers l'analyse numérique ou vers les probas/stats
    Par invite1237a629 dans le forum Orientation après le BAC
    Réponses: 3
    Dernier message: 24/07/2018, 13h40
  2. Transfert forge vers abaqus format .unv vers .inp
    Par invite1e088e2e dans le forum Logiciel - Software - Open Source
    Réponses: 3
    Dernier message: 10/02/2011, 09h44
  3. Pourqoi du Cu vers Zn et pas de Zn vers Cu (pile daniell)
    Par invite57334019 dans le forum Chimie
    Réponses: 6
    Dernier message: 09/05/2010, 12h32
  4. outlook vers Winmail/vieux PC vers Neuf
    Par invite290870ad dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 18/07/2008, 02h26
  5. Réponses: 5
    Dernier message: 05/11/2007, 17h22
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...