Forum Programmation.c une sphère en opengl ...

Posté par (page perso) .
Tags : aucun
0
29
sept.
2004
J'ai un problème a la con : j'arrive pas a dessiner une sphère en openGL !

j'ai un cours d'intro a synthèse d'image et je dois créer une série de figures et volumes en opengl : c'est a dire en utilisant seulement

glBegin(GL_..);
...
glvertex3f...;
...
glEnd();

j'ai fais très vite les autres volumes et figures mais pas moyen de faire cette putain de sphère !

je n'arrive pas a exprimer mes points [x,y,z] en fonctions de alpha,béta (angle en radians et r (rayon).
mes souvenir de math sont trop loins :(

j'arrive a x = sin(alpha) ; z = sin(beta) mais y = ???

j'ai loupé un truc mais je ne sais pas le quel

note prog.c était peut etre pas le bon forum :s
  • # des maths

    Posté par . Évalué à 5.

    essaye avec:

    x = r * sin (theta) * cos (phi)
    y = r * sin (theta) * cos (phi)
    z = r * cos (theta)

    et fais varier theta entre -90° et 90° et phi entre 0 et 360°
    • [^] # Re: des maths

      Posté par (page perso) . Évalué à 1.

      j'ai du loupé quelque chose car avec le code suivant tout mes points sont dans le même plan :(



      glBegin(GL_POINTS);

      for(teta=-M_PI;teta<M_PI;teta+=inc)
      {
      for(phi=0.;phi<(2*M_PI);phi+=inc)
      {
      glVertex3f(sin(teta)*cos(phi),sin(teta)*cos(phi),cos(teta));
      }
      }
      glEnd();

      • [^] # Re: des maths

        Posté par . Évalué à 2.

        Ben oui, dans le plan x=y meme... Il y a surement une coquille dans la formule du monsieur au dessus, mais mes souvenirs de math sont un peu trop poussiereux pour corriger...
        • [^] # Re: des maths

          Posté par . Évalué à 1.

          Je me réponds à moi-même, mais après 2 minutes de reflexion (et un petit croquis), je pense qu'il faut changer la première ou la deuxième ligne (au choix) en r*sin(theta)*sin(phi)
  • # la soluce avec des gl_quads

    Posté par . Évalué à 3.

    j'ai du faire une erreur dans les naths mais la c'est sur que ça marche
    void Sphere(int a,int b) { 
    float da = ( M_PI / a ); 
    float db = ( 2.0f * M_PI / b ); 
    glBegin(GL_QUADS); 
    glColor3f(1.0,0.0,0.0);
    glNormal3f(0,0,1); 
    for( int i = 0; i < a + 1 ; i++ ) { 
     float r0 = sin ( i * da ); 
     float y0 = cos ( i * da ); 
     float r1 = sin ( (i+1) * da ); 
     float y1 = cos ( (i+1) * da ); 
    
     for( int j = 0; j < b + 1 ; j++ ) { 
      float x0 = r0 * sin( j * db ); 
      float z0 = r0 * cos( j * db ); 
      float x1 = r0 * sin( (j+1) * db ); 
      float z1 = r0 * cos( (j+1) * db ); 
    
      float x2 = r1 * sin( j * db ); 
      float z2 = r1 * cos( j * db ); 
      float x3 = r1 * sin( (j+1) * db ); 
      float z3 = r1 * cos( (j+1) * db ); 
    
      glColor3f((x0+x1+x2+x3)/4.0,(y0+y1)/2.0,(z0+z1+z2+z3)/4.0);
    
      glVertex3f(x0,y0,z0); 
      glVertex3f(x1,y0,z1); 
      glVertex3f(x3,y1,z3); 
      glVertex3f(x2,y1,z2); 
     } 
    } 
    glEnd();  
    }

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.