Publicado: Jue May 08, 2008 9:58 amAsunto: OPENGL CON C++ Y ECLIPSE...o en ultima instancia Visual c++
Hola a todos, bueno tengo un problema. He prometido a mi profesor de Computacion grafica hacer un Graficador 3D...y si no lo hago bien me jala Bueno el problema que tengo es este....cuando trabajo con OPENGL y las librerias glut y glu, se acostumbra a dejar la ventana de lado...es decir la ventana donde aparecen los graficos se sacrifica....no se acostumbra a trabajar sobre ella......y se crea asi:
con esos comando...y otro que ahorita la verda no recuerdo jaja...bueno la cosa es que cuando pense hacer ese graficador me imaginaba una interfaz como la de autocad jeje....solo la interfaz pues no creo llegar a hacer algo tan complejo....pero tampoco quiero hacer algo tan simple. Bueno lo que quiero saber es si puede trabajarse esa ventana que se crea, es decir si puedo ponerle botones, menus, cuadros de textos, etc...y claro trabajar con ellos. O si es posible...la verda me pareceria mas facil.... si se pudiera poner esa ventana (aunke es ventana no??) dentro de un Frame creado en Visual c++ (es el unico programa donde se hacer interfaz :S). Ojala puedan ayudarme....y disculpen que me haya extendido tando jeeeeee. _________________ ***Daniel***
Eso es para menus (yo no he trabajado con eso)
No obstante si tienes el glut.h puedes mirar todo lo que puedes hacer ahi.
Lo del boton lo veo factible, aunque no es sencillo. Lo que tendrias que hacer seria algo como capturar el click del raton, comprobar si esta en los limites del boton, y ejecutar lo que sea. Tambien podrias modificar ligeramente el boton al pulsarlo, pero eso es optativo.
Publicado: Dom May 11, 2008 3:27 pmAsunto: Re: OPENGL CON C++ Y ECLIPSE...o en ultima instancia Visual
Gracias Akodo. Estuve indagando por la internet y encontre algunos tutoriales y ejemplos en los que se usan los comandos que me has proporcionado. Pero por lo que he visto, hasta ahora, solo se puede acceder a los menus interactuando de alguna manera con el programa....mouse, teclado....bueno, lo veo factible. Y estoy pensando hacerlo asi. Pero, por lo que he visto hasta el momento, puedo hacer rotar, trasladar y escalar...pero tambien necesito algo como: ingresar objetos 3D y darle los valores necesarios. Por ejemplo si kiero ingresar una esfera...proporcionar el radio...si es un cubo ...el lado...etc. Es decir necesito digitar valores....como? si no hay cajas de texto ...a menos que sea por consola, bueno, esa es mi ultima opcion. Bueno...por ahora experimentare con los conocimientos recien adkiridos. Pero cualkier ayuda es bienvenida. Gracias nuevamente.
Miembro No. 25400 Registrado: Nov 28, 2007 Mensajes: 154
Publicado: Lun May 12, 2008 3:25 pmAsunto: Re: OPENGL CON C++ Y ECLIPSE...o en ultima instancia Visual
Lo que puedes hacer es darle un valor inicial al radio de la esfera, por ejemplo, y modificarla mediante la pulsacion de una tecla. Podrías crear un efecto de interactividad bastante interesante.
El código sería a grandes rasgos:
Código:
//variable global
GLfloat radio = 1.0;
void dibujar_esfera (){
GLUQuadricObj *esf;
esf=gluNewQuadric();
gluSphere(radio,1000,1000);
}
void keyboard(unsigned char key, int x, int y){ //función que va dentro del glutKeyboardFunc(...)
switch(key)
case '+' : radio+=0.5;
glutPostRedisplay();
break;
case '-' : radio-=0.5;
gultPostRedisplay();
break;
}
void display(){
//matrices de transformacion
dibujar_esfera();
glFlush();
glutSwapBuffers();
}
Esto tambien lo puedes hacer parametrizando vértices, por ejemplo, para modificar el aspecto de un cubo...
De todas maneras, es algo simple de hacer. Para empezar yo lo haría así, y si encuentro otra manera mejor de hace de esa otra manera.
Saludos.
Publicado: Mar May 20, 2008 2:26 pmAsunto: Re: OPENGL CON C++ Y ECLIPSE...o en ultima instancia Visual
Hola otra vez. Gracias Akodo, por la ayuda. He estado experimentando como dije que haria, y bueno...he decidido hacer mi graficador 3D asi: utilizar menus para las transformaciones mas comunes, como trasladar, rotar y escalar...pero como complemento de eso necesitare la consola. Me explico: cuando se haga click en el menu rotar, trasladar o escalar...(si es que solo uso esos 3) mediante consola se pedira los datos a ingresar, respectivamente. O sino, poder rotar, trasladar o escalar con el mouse. Pero esto no es lo unico que tengo pensado, sino que quiero que mediante consola se puedan ingresar comandos para ingresar, borrar o transformar objetos.Me parece que es lo ideal...y lo mas conveniente, considerando que no tengo mucho tiempo para hacer este trabajo. Bueno, pero eso en si no es el problema....el problema es, ¿como hago para que la consola siempre este esperando el ingreso de un comando?
Por ejemplo, supongamos estoy trasladando un objeto (con el mouse)...entonces decido dejar de trasladar, ahora quiero rotar. Pero no quiero escoger la opcion rotar de un menu. Sino ingresar en consola "rotar" (para rotar un objeto), e inmediatamente me pida los datos a ingresar o de ser el caso....inmediatamente poder rotar el objeto con el mouse. Eso es lo que me aqueja ahora. Todo lo anterior ya se como hacerlo. Aunque no lo tengo implementado todo aun, se que ya puedo hacerlo. Pero necesito poder trabajar con la consola para hacerlo mas practico.
Miembro No. 25400 Registrado: Nov 28, 2007 Mensajes: 154
Publicado: Mie May 21, 2008 3:04 pmAsunto: Re: OPENGL CON C++ Y ECLIPSE...o en ultima instancia Visual
¿Por qué no usar el glutKeyboardFunc para saber lo que tiene que hacer?
Si por ejemplo, quieres rotar, que pulse la tecla 'r' y se ponga una variable a true indicando que se esta rotando el objeto. De esta forma te evitarias usar el teminal.
Si lo vas a hacer con el terminal, como lo has planteado, intentaría poner el menu y todo eso dentro del glutIdleFunc. El efecto es que estaría esperando siempre alguna entrada desde el terminal para procesarla. No se si funcionará como esperas, pero no se me ocurre otra forma.
El código sería algo así:
Código:
void myidle (){
mostrar_menu();
respuesta=leer_respuesta();
procesar_respuesta(respuesta);
modificar parametros de estado
glutPostRedisplay();
glutSwapBuffers();
}
int main(...){
----inicializacion-----
glutDisplayFunc(mydisplay);
glutIdleFunc(myidle);
}
El problema de este código es que no estoy seguro de si seguiría respondiendo a eventos, porque siempre se quedaría esperando una respuesta del terminal.
Publicado: Vie Jun 13, 2008 9:44 pmAsunto: Re: OPENGL CON C++ Y ECLIPSE...o en ultima instancia Visual
Hola denuevo. Despues de tiempo que vuelvo a escribir sobre este tema. es que ya no tenia problemas, hasta ahora . Ojala que alguien pueda ayudarme con esto...pues esta bastante complicado. Bueno, prosegui con mi proyecto (el graficador 3D, con openGL y c++) y esta bastante respetable...esta mucho mejor de lo que yo esperaba...en realidad, esta chevere ! jeje. Me gusta bastante. Bueno, el problema es este....en mi proyecto hay la opcion rotar un objeto 3D...con el mouse...por ejemplo rotacion en los ejes "x" e "y"....con un movimiento del mouse (movimiento vertical) se maneja la rotacion en el eje X...mientras que con el otro movimiento del mouse (movimiento horizontal) se maneja la rotacion en el eje Y. Lo que sucede es esto...supongamos que roto primero en el eje Y...mmm....90 grados. Luego roto en el eje X, y todo funciona a la perfeccion. No hay nada raro...PERO, cuando roto primero en el eje X....mmm...90 grados. Luego roto en el eje Y...pasa algo bastante frustrante, se pierde el eje Y. Con SE PIERDE...me refiero a que la rotacion en realidad no se esta dando en el eje Y...sino en el eje Z (si hemos rotado 90 grados en el eje X, claro esta). Pues el eje Y del objeto kedaria en el eje Z de la escena. La verda no se si me entenderan !...es algo bastante confuso...es necesario ver, MIRAR el movimiento del objeto para darse cuenta. Espero que si alguien tiene tiempo...intente hacer algo como eso....rotar en dos ejes, y vean si ocurre lo mismo que conmigo. Pues ni mi profe me sabe explicar porké funciona asi. Estoy pensando que asi funciona el OPENGL,,,entonces seria un problema del open GL????....un error??...ojala alguien pueda explicarme
Miembro No. 25400 Registrado: Nov 28, 2007 Mensajes: 154
Publicado: Mie Jun 25, 2008 3:46 pmAsunto: Re: OPENGL CON C++ Y ECLIPSE...o en ultima instancia Visual
Segun lo cuentas, lo que creo que pasa es que mueves el objeto, y con el los ejes. Al hacer un rotate en el eje x de 90 grados, el eje y queda en la posición del eje z según tu visión.
Seguro que al hacer las rotaciones tienes el glMatrixMode(GL_MODELVIEW), lo que creo que deberias hacer es mover la cámara en vez del objeto.
//al comienzo del display
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glTranslatef (0.0, 0.0, -9.0-lejania);//Establecemos la posicion de la camara
glRotatef(-elevacion, 1.0, 0.0, 0.0);//Rota la camara en el eje x
glRotatef(-giro, 0.0, 1.0, 0.0);//Rota la camara en el eje y
glRotatef(azimitud,0.0, 0.0, 1.0);//Rota la camara en el eje z
glMatrixMode(GL_MODELVIEW);
<continua el display>
void onMouse(int button, int state, int x, int y)
//Recoje eventos del raton
{
if ( (button == GLUT_LEFT_BUTTON) & (state == GLUT_DOWN) )//Recoje las coordenadas del puntero mientras mantengo el boton izquerdo del raton pulsado
{
pero = x;
yo = y;
bizq=1;
}
if ( (button == GLUT_RIGHT_BUTTON) & (state == GLUT_DOWN) )//Recoje las coordenadas del puntero mientras mantengo el boton derecho del raton pulsado
{
io = x;
jo = y;
bder=1;
}
if ( (button == GLUT_LEFT_BUTTON) & (state == GLUT_UP) )//Indica que el boton izquerdo del raton ha dejado de ser pulsado
{
bizq=0;
}
if ( (button == GLUT_RIGHT_BUTTON) & (state == GLUT_UP) )//Indica que el boton derecho del raton ha dejado de ser pulsado
{
bder=0;
}
}
void onMotion(int x, int y)
//Metodo en el cual indicamos que se hace cuando se realizan las acciones indicadas por el raton
{
if(bizq==1)//Si mantengo pulsado el boton izquerdo
{
elevacion = (elevacion + (y - yo));//Si la y cambia modifica la elevacion de la camara
giro = (giro + (x - pero));//Si la y cambia modifica el angulo de giro de la camara
}
if(bder==1)//Si mantengo pulsado el boton derecho
{
lejania = (lejania + (y - jo));//Si la y cambia modifica la lejania de la camara
azimitud = (azimitud + (x - io)); //Si la y cambia modifica el angulo azimut de la camara
}
pero = x; yo = y; io = x; jo = y;
glutSwapBuffers();//utilizamos doble buffer
glutPostRedisplay();//tras actualizar los valores volvemos a lanzar el display
}
Este es el código que uso para mover la camara. Mira a ver si te sirve.
El problemilla que tengo yo es muy parecido. Mover una bola en los ejes x z, mediante teclas, de tal forma que al pulsar una se mueve para el eje x positivo y al pulsar otra va al lado contrario. Al mover la cámara, lo que pasa es que la bola sigue igual, pero la impresión del usuario es que los controles están cambiados.
Publicado: Vie Jun 27, 2008 9:37 amAsunto: Re: OPENGL CON C++ Y ECLIPSE...o en ultima instancia Visual
Hola pues Akodo, a los años . Bueno lei tu idea, la verdad pense que podria funcionar. Se que funciona, lo que pasa es que, en el proyecto que estoy haciendo ya tengo una opcion para mover la camara, con las teclas en realidad (UP, DOWN, RIGHT, LEFT) y el otro problema es que en la escena puede haber mas de un objeto, entonces no se moveria uno, sino todos los objetos. Bueno, me dieron otra idea: es que en mi proyecto no he utilizado nada de PUSHMATRIX ni POPMATRIX, la verda no se como usarlos correctamente, pero me han dicho que usando esas funciones pueda arreglar el problema. No he tenido tiempo de hacerlo.
Y con respecto a lo que dijiste, que pueda estar moviendo el objeto con todos los ejes, no es asi. Estoy seguro (creo...jeje). Bueno, se que PUSHMATRIX y POPMATRIX es para empilar una matriz de transformacion en toda la escena, o eliminarla. Entonces, como no estoy usando esas funciones no estoy rotando el objeto y los ejes a la vez. Ademas me he tomado la precaucion de dibujarle los ejes a la escena (con rojo) y los ejes de cada objeto que ingreso (con verde). Y al rotar el objeto se ve que no se mueven los ejes de la escena, sino del objeto.
Otra cosa a la que llegamos mi profe, yo y otro "patita" que quiso ayudar, es que si las transformaciones son matrices, entonces;
No puedes publicar nuevos temas en este foro No puedes responder a temas en este foro No puedes editar tus mensajes en este foro No puedes borrar tus mensajes en este foro No puedes votar en encuestas en este foro