Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Dibujar Parte De Una Esfera En Opengl

Iniciado por oiram, 24 de Septiembre de 2003, 08:20:43 PM

« anterior - próximo »

oiram

 Hola,

     me gustaria saber si hay alguna manera rapida de dibujar la parte superior de un esfera. Por ejemplo, para crear una cupula.

    La idea es que el resto de la esfera no se dibuje, de manera que se puedan poner mas objectos en el interior de la "cupula".

    Alguna sugerencia?

Gracias



DraKKaR

 Deberás darnos más detalles acerca de como consigues los datos de la esfera y como la representas.. pero.... lo ovbio es.... ¿si has podido crear una esfera.. pq no creas una semiesfera? Y si lo que quieres es pintar solo la parte de arriba de una esfera.. lo que pèudes hacer es habilitar el alpha blending y asignar a los vértices que no quieras ver un alpha = 0.

BeRSeRKeR

 Puedes utilizar un modelo que crees desde cualquier paquete de modelado 3D y después cargarlo en tu aplicación y escalarlo según tus necesidades.

Otra opción es crear tú la semiesfera matemáticamente. Si te sirve de algo, éste es el código de la función gluSphere. Podrías basarte en él para crear únicamente una semiesfera.

void GLAPIENTRY
gluSphere(GLUquadricObj * qobj, GLdouble radius, GLint slices, GLint stacks)
{
  GLfloat rho, drho, theta, dtheta;
  GLfloat x, y, z;
  GLfloat s, t, ds, dt;
  GLint i, j, imin, imax;
  GLboolean normals;
  GLfloat nsign;

  if (qobj->Normals == GLU_NONE) {
     normals = GL_FALSE;
  }
  else {
     normals = GL_TRUE;
  }
  if (qobj->Orientation == GLU_INSIDE) {
     nsign = -1.0;
  }
  else {
     nsign = 1.0;
  }

  drho = M_PI / (GLfloat) stacks;
  dtheta = 2.0 * M_PI / (GLfloat) slices;

  /* texturing: s goes from 0.0/0.25/0.5/0.75/1.0 at +y/+x/-y/-x/+y axis */
  /* t goes from -1.0/+1.0 at z = -radius/+radius (linear along longitudes) */
  /* cannot use triangle fan on texturing (s coord. at top/bottom tip varies) */

  if (qobj->DrawStyle == GLU_FILL) {
     if (!qobj->TextureFlag) {
 /* draw +Z end as a triangle fan */
 glBegin(GL_TRIANGLE_FAN);
 glNormal3f(0.0, 0.0, 1.0);
 glVertex3f(0.0, 0.0, nsign * radius);
 for (j = 0; j <= slices; j++) {
    theta = (j == slices) ? 0.0 : j * dtheta;
    x = -sin(theta) * sin(drho);
    y = cos(theta) * sin(drho);
    z = nsign * cos(drho);
    if (normals)
       glNormal3f(x * nsign, y * nsign, z * nsign);
    glVertex3f(x * radius, y * radius, z * radius);
 }
 glEnd();
     }

     ds = 1.0 / slices;
     dt = 1.0 / stacks;
     t = 1.0;   /* because loop now runs from 0 */
     if (qobj->TextureFlag) {
 imin = 0;
 imax = stacks;
     }
     else {
 imin = 1;
 imax = stacks - 1;
     }

     /* draw intermediate stacks as quad strips */
     for (i = imin; i < imax; i++) {
 rho = i * drho;
 glBegin(GL_QUAD_STRIP);
 s = 0.0;
 for (j = 0; j <= slices; j++) {
    theta = (j == slices) ? 0.0 : j * dtheta;
    x = -sin(theta) * sin(rho);
    y = cos(theta) * sin(rho);
    z = nsign * cos(rho);
    if (normals)
       glNormal3f(x * nsign, y * nsign, z * nsign);
    TXTR_COORD(s, t);
    glVertex3f(x * radius, y * radius, z * radius);
    x = -sin(theta) * sin(rho + drho);
    y = cos(theta) * sin(rho + drho);
    z = nsign * cos(rho + drho);
    if (normals)
       glNormal3f(x * nsign, y * nsign, z * nsign);
    TXTR_COORD(s, t - dt);
    s += ds;
    glVertex3f(x * radius, y * radius, z * radius);
 }
 glEnd();
 t -= dt;
     }

     if (!qobj->TextureFlag) {
 /* draw -Z end as a triangle fan */
 glBegin(GL_TRIANGLE_FAN);
 glNormal3f(0.0, 0.0, -1.0);
 glVertex3f(0.0, 0.0, -radius * nsign);
 rho = M_PI - drho;
 s = 1.0;
 t = dt;
 for (j = slices; j >= 0; j--) {
    theta = (j == slices) ? 0.0 : j * dtheta;
    x = -sin(theta) * sin(rho);
    y = cos(theta) * sin(rho);
    z = nsign * cos(rho);
    if (normals)
       glNormal3f(x * nsign, y * nsign, z * nsign);
    s -= ds;
    glVertex3f(x * radius, y * radius, z * radius);
 }
 glEnd();
     }
  }
  else if (qobj->DrawStyle == GLU_LINE || qobj->DrawStyle == GLU_SILHOUETTE) {
     /* draw stack lines */
     for (i = 1; i < stacks; i++) { /* stack line at i==stacks-1 was missing here */
 rho = i * drho;
 glBegin(GL_LINE_LOOP);
 for (j = 0; j < slices; j++) {
    theta = j * dtheta;
    x = cos(theta) * sin(rho);
    y = sin(theta) * sin(rho);
    z = cos(rho);
    if (normals)
       glNormal3f(x * nsign, y * nsign, z * nsign);
    glVertex3f(x * radius, y * radius, z * radius);
 }
 glEnd();
     }
     /* draw slice lines */
     for (j = 0; j < slices; j++) {
 theta = j * dtheta;
 glBegin(GL_LINE_STRIP);
 for (i = 0; i <= stacks; i++) {
    rho = i * drho;
    x = cos(theta) * sin(rho);
    y = sin(theta) * sin(rho);
    z = cos(rho);
    if (normals)
       glNormal3f(x * nsign, y * nsign, z * nsign);
    glVertex3f(x * radius, y * radius, z * radius);
 }
 glEnd();
     }
  }
  else if (qobj->DrawStyle == GLU_POINT) {
     /* top and bottom-most points */
     glBegin(GL_POINTS);
     if (normals)
 glNormal3f(0.0, 0.0, nsign);
     glVertex3d(0.0, 0.0, radius);
     if (normals)
 glNormal3f(0.0, 0.0, -nsign);
     glVertex3d(0.0, 0.0, -radius);

     /* loop over stacks */
     for (i = 1; i < stacks - 1; i++) {
 rho = i * drho;
 for (j = 0; j < slices; j++) {
    theta = j * dtheta;
    x = cos(theta) * sin(rho);
    y = sin(theta) * sin(rho);
    z = cos(rho);
    if (normals)
       glNormal3f(x * nsign, y * nsign, z * nsign);
    glVertex3f(x * radius, y * radius, z * radius);
 }
     }
     glEnd();
  }

}


Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

oiram

    La idea que tenia en mente era poder dibujar la parte superior de la esfera que se quisiera. Igual que si interseccionas un plano en el eje Y.

  Creo que la idea de modificar el codigo de la gluSphere es buena, me lo tendre que mirar con cariño...

  Gracias a los dos   :)

  Salud!



sés

Soy indeciso... ¿o no?






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.