IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Mathématiques Discussion :

Raytracing, rotation d'une sphere.


Sujet :

Mathématiques

  1. #1
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 8
    Points : 2
    Points
    2
    Par défaut Raytracing, rotation d'une sphere.
    coucou a tous,
    actuellement en 2eme annee en ecole d'infographie^^
    Je me suis inscris a un projet pr realiser un "raytracer" en langage C et j ai un probl sur la rotation de la sphere
    je vous explik:
    dans nos cours on place tt les volumes en 0,0,0 pour faciliter les calculs...
    parconsequant on doit deplacer virtuellement la position de l oeil a l aide de translation et rotation...
    cela marche chez moi pour le plan et le cylindre... mais la sphere reagit tres mal a la rotation...
    je vous montre ma rotation en X:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    int rotatex(double *x, double *y, double *z, double angle){
     
      double cosin, sinus, nvy , nvz;
     
      cosin = cos((angle * M_PI) / 180);
      sinus = sin((angle * M_PI) / 180);
      *x = *x;
      nvy = (*y * cosin) - (*z * (sinus));
      nvz = (*y * sinus) + (*z * cosin);
      *y = nvy;
      *z = nvz;
      return 0;
    }
    les rotations y et z sont egalements base sur le calcul matriciel:
    pour y:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    nvx = (*x * cosin) + (*z * sinus);
      *y = *y;
      nvz = (*x * (-sinus)) + (*z * cosin);
    pour z:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      nvx = (*x * cosin) + (*y * (-sinus));
      nvy = (*x * sinus) + (*y * cosin);
      *z = *z;
    ma formule pour la sphere:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
     
     
    double second(double a, double b, double c)
    {
      double delta,r1,r2;
     
      delta = pow(b, 2) - (4 * a * c);
      if (delta >= 0)
        {
          r1 = (-b - (sqrt(delta))) / (2 * a);
          r2 = (-b + (sqrt(delta))) / (2 * a);
        }
      else
        return (-1);
    // ici on fait un ternaire ^^ pour renvoyer la valeur la plus petite positive, si //ya deux intersections ou -1 si yen a pas
     r2 = ((r2 < 0) ? -1 : r2);
      return ((r1 > 0 && r1 < r2) ? r1 : r2);
    }
     
    // ici on calcul les coefficients de l equation du second degre
    // vx,vy, vz est le vecteur vu...
    // cam->x,y,z est la position de l oeil
    // targ->taille est le rayon de la sphere
    double inter_sphere(t_vect *op, t_ultim *ult, t_obj *targ){
      double a, b, c;
    a = (op->vx * op->vx) + (op->vy * op->vy) + (op->vz * op->vz);
      b = 2 * ((ult->cam->x * op->vx) + (ult->cam->y * op->vy) + (ult->cam->z * op->vz));
      c = (ult->cam->x * ult->cam->x) + (ult->cam->y * ult->cam->y) + (ult->cam->z * ult->cam->z) - (targ->taille * targ->taille);
      return (second(a, b, c));
    }
    j ai verifie pleiiiiiin de fois ma formule et je n y ai pas trouve d erreur...
    Quelqu un a t il rencontre un probleme similaire ?
    ou... quelqu un a une idee ?

    Je vous remercie... Lucie

    Edit: j ai edite b, c etait une erreur de copiage... desolee

  2. #2
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    r2 = ((r2 < 0) ? -1 : r2);
    return ((r1 > 0 && r1 < r2) ? r1 : r2);

    L'opérateur ternaire c'est joli mais, question lisibilité, ca ne vaut pas un bon if/else avec des commentaires.

    Par exemple, avec r2=-3 et r1=5, qu'est ce que ca renvoie ?

    Edit: et le calcul de "b" est faux: le facteur "2" n'est pas que sur le 1er terme
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  3. #3
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    une valeur negative se situe derriere l'oeil... donc ininteressante.. ca renvoit donc valeur positive et si elles le sont ttes les deux ca renvoit la plus petite

  4. #4
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par Lucie Mor Voir le message
    une valeur negative se situe derriere l'oeil... donc ininteressante.. ca renvoit donc valeur positive et si elles le sont ttes les deux ca renvoit la plus petite
    ce n'est pas ma question. Ma question c'est:

    " avec r2=-3 et r1=5, que renvoie ce code ? "
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  5. #5
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    ca renvoit 5

  6. #6
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    ce n'est pas ma question. Ma question c'est:

    " avec r2=-3 et r1=5, que renvoie ce code ? "
    Citation Envoyé par Lucie Mor Voir le message
    ca renvoit 5
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    int r2=-3, r1=5;
     
    r2 = ((r2 < 0) ? -1 : r2); 
    // --> r2 = (-3 < 0) ? -1 : -3
    // --> r2 = (TRUE) ? -1 : -3
    // --> r2=-1
     
    return ((r1 > 0 && r1 < r2) ? r1 : r2);
    // --> return ((5 > 0 && 5 < -1) ? 5 : -1);
    // --> return ((TRUE && FALSE) ? 5 : -1);
    // --> return ((FALSE) ? 5 : -1);
    // --> return -1;
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  7. #7
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    oups... je suis bete merci
    j'ai corrige en faisant que des if ^^... mais sur la rotation ca ne change rien... la sphere subit mal la rotation... je me demande si ce n est pas a cause de z... parce qu au final le cylindre est comme la sphere mais sans z mais je ne vois pas en quoi...

  8. #8
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par Lucie Mor Voir le message
    oups... je suis bete merci
    j'ai corrige en faisant que des if ^^... mais sur la rotation ca ne change rien... la sphere subit mal la rotation... je me demande si ce n est pas a cause de z... parce qu au final le cylindre est comme la sphere mais sans z mais je ne vois pas en quoi...
    La sphere n'est pas sensible aux rotations, puisqu'elle est centrée en (0,0,0).

    A priori, le problème n'est pas dans le code que tu nous a montré, mais dans celui ou tu effectues le changement de repère...
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  9. #9
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    merci bcp de m'aider
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    // D = 100 X et Y sont la taille de la fenetre
    //cette fonction effectue la translation puis la rotation sur le vecteur vue //(vx,vy,vz)
    // t_obj est une liste chainee contenant les caracteristiques des objs...
     
    int calc(int x, int y, t_ultim *p){
      t_coo coo;
      double res;
      int i = 0;
      t_obj *begin;
     
      begin = p->cam->begin_obj;
      coo.res_min = -1;
      coo.color = 0;
      while (i < p->cam->taille_obj)
        {
          coo.vx = D - (p->cam->x_cam - begin->x);
          coo.vy = ((X / 2) - x) - (p->cam->y_cam - begin->y);
          coo.vz = ((Y / 2) - y) - (p->cam->z_cam - begin->z);
          rotate_z(&coo.vx, &coo.vy, &coo.vz, -p->scene->vz_cam);
          rotate_y(&coo.vx, &coo.vy, &coo.vz, -p->scene->vy_cam);
          rotate_x(&coo.vx, &coo.vy, &coo.vz, -p->scene->vx_cam);
          i++;
          begin = begin->next;
        }
      return coo.color;
    }
    j ai un peu elague cette fonction pour essayer d etre la plus claire possible...

  10. #10
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Pourquoi les coordonnées des objets interviennent dans le calcul du vecteur direction des rayons ?

    Normalement, ces coordonnées ne devraient intervenir que sur le point d'origine des rayons, mais pas sur leurs directions. non ?
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  11. #11
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Le vecteur subit une translation de coordonnee x y z de l objet: je m explique
    l oeil est en 100, 0, 0
    la sphere en -100, 23, 18
    pour mettre virtuellement la sphere en 0, 0, 0 on doit effectuer une translation de vecteur 100, -23, -18 sur l oeil
    ce qui nous donne 200, -23, -18... ainsi la sphere est en 0, 0, 0 tout en gardant les mm caracteristiques... ce qui theoriquement, je te l accorde lol, simplifie les calculs...
    suis je dans le faux ?

  12. #12
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    1 rayon est défini par 1 point d'origine "O" + 1 vecteur direction "V"

    Pour calculer l' intersection du rayon avec une sphere centrée de taille R, on cherche alors le point P tels que P=O+t.V et ||P||=R, ce qui nous conduit à l'equation de 2nd degré de ton code.

    Si la sphere n'est pas centrée, il faut changer de repère => translater l'origine du rayon et le centre de la sphere. Mais le vecteur direction du rayon n'est pas modifié par la translation.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  13. #13
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    J'ai tenue en compte de tes remarques..
    En effet, tu avais raison, j'appliquais mal la rotation...

    Maintenant la rotation de la cam semble marcher mais, la rotation de l'objet deconne encore... Je m'interroge sur la facon de faire, pour rotater les objets

    J'effectue une translation sur des temporaires (tx_cam...) que j'utilise pour les calculs..
    Puis, je calcule le vecteur.
    J'effectue une rotation sur le vecteur vue d'angle "camera"
    Enfin une rotation d'angle "objet"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
          p->scene->tx_cam = p->scene->x_cam - begin->x;
          p->scene->ty_cam = p->scene->y_cam - begin->y;
          p->scene->tz_cam = p->scene->z_cam - begin->z;
     
          coo.vx = D - p->scene->x_cam;
          coo.vy = ((X / 2) - x) - p->scene->y_cam;
          coo.vz = ((Y / 2) - y) - p->scene->z_cam;
     
          rotate_z(&coo.vx, &coo.vy, &coo.vz, -p->scene->vz_cam);
          rotate_y(&coo.vx, &coo.vy, &coo.vz, -p->scene->vy_cam);
          rotate_x(&coo.vx, &coo.vy, &coo.vz, -p->scene->vx_cam);
     
    // Il faudrait retirer l'angle de camera, mais pour simplifier les choses je le mets a 0.
     
          rotate_z(&coo.vx, &coo.vy, &coo.vz, -begin->rotz); 
          rotate_y(&coo.vx, &coo.vy, &coo.vz, -begin->roty); 
          rotate_x(&coo.vx, &coo.vy, &coo.vz, -begin->rotx);
    La sphere tourne par rapport a un centre... je ne trouve pas ca normal pour moi elle devrait tourner sur elle mm... est ce que je me trompe ?

  14. #14
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par Lucie Mor Voir le message
    J'ai tenue en compte de tes remarques..
    En effet, tu avais raison, j'appliquais mal la rotation...

    Maintenant la rotation de la cam semble marcher...
    bien.

    mais, la rotation de l'objet deconne encore... Je m'interroge sur la facon de faire, pour rotater les objets
    http://jeux.developpez.com/faq/matqu...ransformations

    J'effectue une translation sur des temporaires (tx_cam...) que j'utilise pour les calculs..
    Puis, je calcule le vecteur.
    J'effectue une rotation sur le vecteur vue d'angle "camera"
    Enfin une rotation d'angle "objet"
    L'origine O et le vecteur direction V de la camera doivent être caclulés une fois pour toute au début du programme.

    Ensuite, pour chaque objet, on calcule une camera "virtuelle" propre à l'objet:
    O' = invRotation( invTranslation(O) )
    V' = invRotation( V )

    invRotation et invTranslation sont les transformations inverses de celles appliquées à l'objet.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

Discussions similaires

  1. Réponses: 3
    Dernier message: 23/06/2011, 12h55
  2. triangulation d'une sphere
    Par lalaurie40 dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 02/10/2005, 14h02
  3. Rotation d'une cible autour du centre de l'écran
    Par kurul1 dans le forum C++Builder
    Réponses: 7
    Dernier message: 11/06/2005, 21h32
  4. Définir un angle de rotation pour une image
    Par mateo.14 dans le forum C++
    Réponses: 5
    Dernier message: 25/03/2005, 14h43
  5. Rotation d une sphere
    Par venomelektro dans le forum DirectX
    Réponses: 4
    Dernier message: 23/01/2005, 23h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo