2017-04-14 5 views
0

Je tente de dessiner une sphère à partir de zéro en utilisant OpenGL. La fonction doit être définie comme void drawSphere(float radius, int nSegments, int nSlices), doit être centrée sur l'origine (0, 0, 0) et doit être créée en utilisant GL_QUADS. Premièrement, est-ce que les «tranches» sont des sortes de cylindres coniques qui sont empilés les uns sur les autres pour créer la sphère, et les «segments» sont les quads qui sont générés dans un cercle pour générer la paroi/côté de chacune de ces tranches de cylindres coniques? Deuxièmement, je n'arrive pas à trouver des algorithmes ou des exemples de la façon de faire les calculs pour générer cette sphère en utilisant des quadrilatères - la plupart des exemples semblent être générés à partir de triangles à la place.Algorithme pour dessiner une sphère à l'aide de quadrilatères

EDIT

Voici ce que je viens d'essayer, ce qui est certainement dans la bonne direction, mais mes calculs sont coordonnées quelque part:

void drawSphere(float radius, int nSegments, int nSlices) { 
    /* 
    * TODO 
    * Draw sphere centered at the origin using GL_QUADS 
    * Compute and set normal vectors for each vertex to ensure proper shading 
    * Set texture coordinates 
    */ 

    for (float slice = 0.0; slice < nSlices; slice += 1.0) { 
     float lat0 = M_PI * (((slice - 1)/nSlices) - 0.5); 
     float z0 = sin(lat0); 
     float zr0 = cos(lat0); 

     float lat1 = M_PI * ((slice/nSlices) - 0.5); 
     float z1 = sin(lat1); 
     float zr1 = cos(lat1); 

     glBegin(GL_QUADS); 

     for (float segment = 0.0; segment < nSegments; segment += 1.0) { 
      float long0 = 2 * M_PI * ((segment -1)/nSegments); 
      float x0 = cos(long0); 
      float y0 = sin(long0); 

      float long1 = 2 * M_PI * (segment/nSegments); 
      float x1 = cos(long1); 
      float y1 = sin(long1); 

      glVertex3f(x0 * zr0, y0 * zr0, z0); 
      glVertex3f(x1 * zr1, y1 * zr1, z0); 
      glVertex3f(x0 * zr0, y0 * zr0, z1); 
      glVertex3f(x1 * zr1, y1 * zr1, z1); 
     } 

     glEnd(); 
    } 
} 

Répondre

0

Je ne vois pas radius utilisé . Probablement une simple omission. Supposons que pour le reste de votre calcul, le rayon est 1. Vous devez générer vos 4 valeurs en utilisant 0-1 à la fois (x, y) et (z, zr), mais ne pas mélanger dans ces tuples.

Donc, x1 * zr1, y1 * zr1, z0 n'est pas correct car vous mélangez zr1 et z0. Vous pouvez voir que la norme de ce vecteur n'est plus 1. Vos 4 valeurs doivent être

x0 * zr0, y0 * zr0, z0 
x1 * zr0, y1 * zr0, z0 
x0 * zr1, y0 * zr1, z1 
x1 * zr1, y1 * zr1, z1 

Je ne suis pas sûr de l'ordre que je ne l'utilise pas Quads mais triangles.

+0

Merci. Je devais juste jouer avec la commande pour le faire fonctionner. Aussi, merci d'avoir repéré que je n'ai jamais ajusté pour le rayon. «x0», «x1», «y0» et «y1» devaient être multipliés par le rayon – KOB