Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Inento Crear Lo Siguiente, Ayuda Por Favor.

Iniciado por Gizbo, 17 de Mayo de 2006, 10:58:32 AM

« anterior - próximo »

Gizbo

 Lo que intento crear es un sistema solar en los que los planetas giren alrededor del sol.Solo he hecho el sol y dos planetas mas y ahi es donde viene mi problema, cuando hago el tercer planeta este da vueltas sobre el planeta anetrior y tambien sobre el sol(como si fuera la luna), ¿como podria hacer para que diera solo vueltas sobre el sol???
Esta realizado en visual c++ con opengl y windows.

#include

GLfloat light_diffuse [] = { 1.0, 1.0, 0.0, 1.0 };
GLfloat light_specular [] = { 1.0, 1.0, 0.0, 1.0 };
GLfloat light_emission [] = { 1.0, 1.0, 0.0, 1.0};


int winIdMain; // Identificador de la ventana principal
int winIdSub; // Identificador de la subventana

#define ANG_ROT_PEQ 1.0 // Ángulo de rotación pequeño
#define DIST_TRANS_PEQ 0.01 // Distancia de transalación pequeña
#define PASO 0.3 // Paso que se suma al tiempo

static double ang_rot_act = 0.0; // Ángulo de rotación actual
static double dist_trans_act = 0.0; // Valor de translación actual

static double spin = 0.0; // Ángulo de spin
static double paso_act = 0.0; // "Tiempo" transcurrido actual
static double mov_x = 0.0;
static double centro_grav = 0.0; // Centro de gravedad actual


void inicializa(void) {
   GLfloat light_position[] = { 0.0, 0.0, -5.0, 1.0};
   glLightfv(GL_LIGHT0, GL_POSITION, light_position);

   glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
   glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);

   glEnable(GL_LIGHTING);
   glEnable(GL_LIGHT0);
   glLightfv(GL_LIGHT0, GL_EMISSION, light_emission);
}

void redimensiona(int w, int h) {
   glViewport(0,0,w,h);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   gluPerspective(60,(GLfloat)w / (GLfloat)h,1.0,20.0);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
   gluLookAt(0.0,0.0,10.0,0.0,0.0,0.0,0.0,1.0,0.0);
}

void dibuja(void) {
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
   glColor3f (1.0, 1.0, 1.0);
   glPushMatrix();

   /* Dibuja el sol */
   glColor3f (1.0, 1.0, 0.0);
   glPushMatrix();
   glutSolidSphere (1.6,32,32);
   glPopMatrix();

   /* Situa la segunda esfera */
   glRotatef ((GLfloat) mov_x, 0.0, 1.0, 0.0);
   glTranslatef (2.5, 0.0, 0.0);

   /* Dibuja la segunda esfera */
   glColor3f (0.0, 0.0, 1.0);
   glutSolidSphere (0.4,32,32);

   /* Situa la tercera esfera
   glRotatef ((GLfloat) mov_x, 0.0, 1.0, 0.0);
   glTranslatef (2.5, 0.0, 0.0);

   /* Dibuja la tercera esfera*/
   glColor3f (1.0, 0.0, 0.0);
   glutSolidSphere (0.4,32,32);

   glPopMatrix();
   glutSwapBuffers();
   glFlush();

}

void idle (void) {

   /* Actualiza las variables de estado */
   mov_x += PASO;
   spin += ang_rot_act;
   centro_grav += dist_trans_act;
   if(centro_grav > 1.0) centro_grav -= 2.0;

   /* Actualiza la ventana y la subventana */
   glutSetWindow (winIdMain);
   glutPostRedisplay ();
   glutSetWindow (winIdSub);
   glutPostRedisplay ();
}

void main(int argc, char** argv) {
   glutInit(&argc, argv);
   glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
   glutInitWindowSize (800, 600);
   glutInitWindowPosition (0, 0);
   glutCreateWindow ("Práctica 6 de OpenGL");
   inicializa();
   glutReshapeFunc(redimensiona);
   glutDisplayFunc(dibuja);
   glutIdleFunc (idle);
   glEnable(GL_DEPTH_TEST);
   glutMainLoop();
}


Ruben

 Hi,
mira a ver si el codigo de este ejemplo te sirve de guia.

Un saludo,
Rubén

AgeR

 Hace tiempo que no toco OpenGL, pero parece que el problema está en que no haces glPushMatrix y glPopMatrix para las otras dos esferas. Por eso la primera se mueve bien respecto al Sol, pero la segunda toma como referencia la anterior.

ethernet

 Lo del sistema solar es un ejercicio típico para aprender como funcionan el sistema de transformación de OpenGL (y de otras muchas API), por ello es mejor que le des vueltas y estudies bien cómo funciona. Te asguro que te servirá de mucho tener muy claros los conceptos si piensas seguir en esto de la programación 3D.


suerte

Gizbo

 bueno ya he arreglado el tema de la rotacion,os doy las gracias atodos los que habeis contestado.Solo una cosa mas, ¿como podria poner el nombre justo arriba de los planetas?no se si me explico.....
quiero poner justo arriba de la tierra el nombre "la tierra", justo arriba de jupiter el nombre de "jupiter", venga haber si mepodeis echar una mano...gracias.

Mars Attacks

 La forma fácil y cutrona es creando un plano, asignándole coordenadas de textura y aplicándole una imagen con el nombre del planeta. Este plano lo dibujarás justo después de la esfera, para que también le afecten sus traslaciones y rotaciones.

Problemas: es cutre, y el texto no siempre mira a la cámara.

No estás preparado para la forma chachiguay y moloncia.

BeRSeRKeR

 Me imagino que la forma chachiguay a la que se refiere Mars es la de proyectar la posición 3D donde quieres que esté el texto a coordenadas de pantalla.

Para ello puedes utilizar la función gluProject. Le pasas las coordenadas 3D del planeta con algún desplazamiento en el eje vertical y listo. Esa función te devolverá las coordenadas 2D que serán las que tienes que utilizar a la hora de pintar el texto (doy por hecho que tienes una función que pinta texto en una posición determinada).

Te tienes que asegurar que la componente Z de las coordenadas que te devuelve gluProject es mayor o igual que cero y menor o igual que uno, de lo contrario, si el texto está detrás de la cámara, se te proyectara delante.

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

marcode

 Aqui hay un ejemplo de como crear texto 3D en OpenGL
Text3D.c

Creo que lo unico que necesitas esta al principio de la funcion SetupRC, Despues lo dibujas como si fuera un objeto 3d mas de la forma en que sale en RenderScene.
size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

Mars Attacks

 Estaba pensando en billboarding con texto "real", pero tampoco es mala solución :)

zupervaca

 Si no recuerdo mal opengl da soporte a letras 3d indicandoles su tamaño de profundidad, ademas son muy rapidas ya que las memoriza en listas, en nehe tutorials fijo que hay algo de esto.






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.