Logo Espacio Linux Paypal - Acepta pagos con tarjeta en tu negocio      
Portada Manuales Linux Descargas Foros Buscar Mapa del sitio Ayuda BlogEL
   Iniciar sesión | Registrarse    
 
Principal

Patrocinadores

Boletín Espacio Linux
Las novedades del sitio y el mundo Linux en tu email.


Usuarios
Bienvenido, Anónimo

     Miembros:
Último: javierdish
Nuevos hoy: 8
Nuevos ayer: 10
Total: 30524

     Navegando:
Anónimos: 412
Miembros: 11
Total: 423


Miembros conectados:

01: principe-ante
02: Ayax
03: yoyofv
04: greg1973
05: johpunk
06: PoL_666
07: Cronlyen
08: punx21
09: oriol1993
10: virxisolso
11: artzneo

Mensajes recientes
 Instalación de distribuciones
 Instalacion Kubuntu
 Problema con el grub No inicia windows
 Software
 clonar disco duro scii a otro scii
 Emulacion programa de comunicación wifi sobre Linux
 Hardware
 no puedo iunstalar mi segunda tarjeta de red
 Chip de video via chrome 9 hc igp
 Programación
 compilar una libreria con otro gcc
 Problema para abrir archivo binario
 Sistema
 Cómo crear usuarios con RedHat?
 desviacion en el reloj
 Seguridad
 como administro mis coneciones wifi
 usuario y contraseña en ubuntu
 Redes y Servidores
 Servidor Freeradius
 Acceso a diversos equipos de trabajo
 Proyectos
 Crear Un Sistema Operativo...
 como programar el puerto serial en matlab?
 Debates
 Andrew S. Tanenbaum(cread or de minix) El heroe no proclamado
 10 cosas linux debería mejorar...
 El Café
 ¿cual crees que es la mejor antena direccional PCI?
 ¿Qué tontería has intentado hacer con GNU/Linux?
 Desarrollo Web
 Intentando mostrar una imagen: problema con rutas
 Intentando imprimir todas las filas de una tabla
 Documentación
 busco este libro pero en español, ¿alguno de uds lee libr...
 kernel a fondo
 Screenshots
 IceWM en Debian Lenny
 Mi desk del siglo pasado
 KDE
 Problema con sesion en KDE 3.5
 Aplicaciones para KDE4 en KDE3 ¿Se puede?
 GNOME
 XVNC o control remoto multiusuario
 Problema apariencia Ubuntu Hardy
 Otros escritorios y entornos
 Mejor escritorio para linux
 (SOLUCIONADO) Ayuda con fluxbox, no puedo iniciarlo
 X Window
 Debian Lenny+Compiz= Problemas con los videos
 Ubuntu 8.4+compiz
 Vídeos
 Kill -9
 Soy un PC, pero uso Linux

[ Entrar a los foros ]
Buscar

Sitios amigos

Espacio Linux :: Ver tema - OPENGL CON C++ Y ECLIPSE...o en ultima instancia Visual c++
ReglamentoReglamento general de los foros
 FAQFAQ  BuscarBuscar  Grupos de usuariosGrupos de usuarios  Miembros  PerfilPerfil
  Mensajes privadosMensajes privados  

OPENGL CON C++ Y ECLIPSE...o en ultima instancia Visual c++

Publicar nuevo tema  Responder al tema  Foros de discusión -> Programación
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
daniel_fisi
Forista Nuevo
Forista Nuevo



Miembro No. 27634
Registrado: Apr 28, 2008
Mensajes: 7
Ubicación: Lima

MensajePublicado: Jue May 08, 2008 9:58 am    Asunto: OPENGL CON C++ Y ECLIPSE...o en ultima instancia Visual c++ Responder citando

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 Confundido 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:

glutInitWindowSize( , )
glutInitWindowPosition( , )

con esos comando...y otro que ahorita la verda no recuerdo ¡Uy estoy apenado! 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***
Volver arriba
Ver perfil de usuario Enviar mensaje privado
akodo
Forista Medio
Forista Medio



Miembro No. 25400
Registrado: Nov 28, 2007
Mensajes: 279

MensajePublicado: Vie May 09, 2008 4:38 pm    Asunto: Re: OPENGL CON C++ Y ECLIPSE...o en ultima instancia Visual Responder citando

Código:
/* GLUT menu sub-API. */
GLUTAPI int APIENTRY glutCreateMenu(void (GLUTCALLBACK *func)(int));
#if defined(_WIN32) && !defined(GLUT_DISABLE_ATEXIT_HACK)
GLUTAPI int APIENTRY __glutCreateMenuWithExit(void (GLUTCALLBACK *func)(int), void (__cdecl *exitfunc)(int));
#ifndef GLUT_BUILDING_LIB
static int APIENTRY glutCreateMenu_ATEXIT_HACK(void (GLUTCALLBACK *func)(int)) { return __glutCreateMenuWithExit(func, exit); }
#define glutCreateMenu glutCreateMenu_ATEXIT_HACK
#endif
#endif
GLUTAPI void APIENTRY glutDestroyMenu(int menu);
GLUTAPI int APIENTRY glutGetMenu(void);
GLUTAPI void APIENTRY glutSetMenu(int menu);
GLUTAPI void APIENTRY glutAddMenuEntry(const char *label, int value);
GLUTAPI void APIENTRY glutAddSubMenu(const char *label, int submenu);
GLUTAPI void APIENTRY glutChangeToMenuEntry(int item, const char *label, int value);
GLUTAPI void APIENTRY glutChangeToSubMenu(int item, const char *label, int submenu);
GLUTAPI void APIENTRY glutRemoveMenuItem(int item);
GLUTAPI void APIENTRY glutAttachMenu(int button);
GLUTAPI void APIENTRY glutDetachMenu(int button);

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.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
daniel_fisi
Forista Nuevo
Forista Nuevo



Miembro No. 27634
Registrado: Apr 28, 2008
Mensajes: 7
Ubicación: Lima

MensajePublicado: Dom May 11, 2008 3:27 pm    Asunto: Re: OPENGL CON C++ Y ECLIPSE...o en ultima instancia Visual Responder citando

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 Confundido ...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.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
akodo
Forista Medio
Forista Medio



Miembro No. 25400
Registrado: Nov 28, 2007
Mensajes: 279

MensajePublicado: Lun May 12, 2008 3:25 pm    Asunto: Re: OPENGL CON C++ Y ECLIPSE...o en ultima instancia Visual Responder citando

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.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
daniel_fisi
Forista Nuevo
Forista Nuevo



Miembro No. 27634
Registrado: Apr 28, 2008
Mensajes: 7
Ubicación: Lima

MensajePublicado: Mar May 20, 2008 2:26 pm    Asunto: Re: OPENGL CON C++ Y ECLIPSE...o en ultima instancia Visual Responder citando

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.

Espero puedan ayudarme. Hablamos.

Daniel
Volver arriba
Ver perfil de usuario Enviar mensaje privado
akodo
Forista Medio
Forista Medio



Miembro No. 25400
Registrado: Nov 28, 2007
Mensajes: 279

MensajePublicado: Mie May 21, 2008 3:04 pm    Asunto: Re: OPENGL CON C++ Y ECLIPSE...o en ultima instancia Visual Responder citando

¿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.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
daniel_fisi
Forista Nuevo
Forista Nuevo



Miembro No. 27634
Registrado: Apr 28, 2008
Mensajes: 7
Ubicación: Lima

MensajePublicado: Vie Jun 13, 2008 9:44 pm    Asunto: Re: OPENGL CON C++ Y ECLIPSE...o en ultima instancia Visual Responder citando

Hola denuevo. Despues de tiempo que vuelvo a escribir sobre este tema. es que ya no tenia problemas, hasta ahora Confundido . 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
Volver arriba
Ver perfil de usuario Enviar mensaje privado
akodo
Forista Medio
Forista Medio



Miembro No. 25400
Registrado: Nov 28, 2007
Mensajes: 279

MensajePublicado: Mie Jun 25, 2008 3:46 pm    Asunto: Re: OPENGL CON C++ Y ECLIPSE...o en ultima instancia Visual Responder citando

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.
Código:

//variables globales
GLfloat elevacion =   45.0;
GLfloat azimitud  =   0.0;
GLfloat giro      =   -45.0;
GLfloat lejania   =   0.0;

//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.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
daniel_fisi
Forista Nuevo
Forista Nuevo



Miembro No. 27634
Registrado: Apr 28, 2008
Mensajes: 7
Ubicación: Lima

MensajePublicado: Vie Jun 27, 2008 9:37 am    Asunto: Re: OPENGL CON C++ Y ECLIPSE...o en ultima instancia Visual Responder citando

Hola pues Akodo, a los años Bromeando. 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;

AxB != BxA

y mi codigo es asi:

glRotatef(ang, 1,0,0);
glRotatef(ang, 0,1,0);
glRotatef(ang, 0,0,1);

(exactamente no es asi, pero esa es la idea)

(copiaria parte de mi codigo, pero tendria que pegar otras partes de mi codigo, y esa parte de mi codigo obligaria a pegar otras partes....jeje)

la cosa es que cambiando el orden de las transformaciones, desaparecia el problema, pero aparecia en otro lado.

La verda estaba pensando en presentar mi proyecto asi, pero lo que yo quiero saber, es porque pasa esto????? no quiero quedarme con la duda.

Ablamos
Volver arriba
Ver perfil de usuario Enviar mensaje privado
akodo
Forista Medio
Forista Medio



Miembro No. 25400
Registrado: Nov 28, 2007
Mensajes: 279

MensajePublicado: Jue Jul 10, 2008 7:42 am    Asunto: Re: OPENGL CON C++ Y ECLIPSE...o en ultima instancia Visual Responder citando

Creo que sé lo que puede pasar.
Lo que pasa es que las rotaciones se multiplican para hacer un único movimiento. No se gira para un lado y luego para el otro, sino que se gira directamente.
El código que pusistes de las rotaciones se aplica siempre al cuerpo en la posición inicial que estuviera, de tal forma que aunque le gires 45º en x y luego 45º en z el resultado es el que te da a ti.

La forma que se me ocurre de solucionarlo (en principio bastante compleja) es que al aplicar la transformación deseada dibujes el objeto en función de su posición. Por ejemplo: tienes el cuerpo en una posición, lo dibujas aplicando las trasformaciones, "fotografías" el cuerpo y lo guardas como una nueva posición inicial. De esta forma al aplicar la siguiente transformación la realizas sobre el cuerpo en la posición actual.

La otra forma (más simple, aunque no puedo garantizar que funcione) es de guardar la matriz de transformación. Esto se puede hacer con la función glPushMatrix(), pero como seguramente apliques demasiadas trasformaciones es fácil que se llene la pila y que cause problemas. Para esto deberías guardar la matriz en una variable y sacarla con la función glGetMatrix(GL_MODELVIEW) (creo que es así) a la variable. Para la siguiente vez que apliques una transformación cargas la matriz guardada mediante glLoadMatrix(m), donde m es la variable donde está la matriz, y aplicas las siguientes transformaciones.

De todas formas, sobre las transformaciones, se aplican en orden inverso al que se pone en el programa. Por ejemplo: si tienes un objeto en el centro y pones gltranslatef(1,0,0); glRotatef(..); primero rota (desde el centro) y luego traslada, lo que se traduce en un objeto trasladado con un cierto ángulo de inclinación en la posición 1,0,0.
En el caso contrario, (glRotatef(..); gltraslatef(1,0,0)Guiñando un ojo primero trasladas a 1,0,0 y luego rotas (desde el centro).
Con "desde el centro" es que la rotación se aplica tomando como punto fijo en el centro (0,0,0) y no la figura

A ver si así sale...
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes anteriores:   
Publicar nuevo tema  Responder al tema  Foros de discusión -> Programación Todas las horas son GMT - 6 Horas

Página 1 de 1



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



Powered by phpBB © 2001 phpBB Group
phpBB port v2.1 based on Tom Nitzschner's phpbb2.0.6 upgraded to phpBB 2.0.4 standalone was developed and tested by:
ArtificialIntel, ChatServ, mikem,
sixonetonoffun and Paul Laudanski (aka Zhen-Xjell).

Version 2.1 by Nuke Cops © 2003 http://www.nukecops.com

Forums ©
 

Copyright | Términos de uso | Política de privacidad | Publicidad | Contáctanos | Blog