PDA

Ver la versión completa : Problema para reconocer la pulsacion simultanea de teclas en OpenGL



Fergus1986
26/02/2008, 23:40
Buenas...

Estoy programando en C y utilizando OpenGL y GLUT. Quiero mover un objeto, para lo cual utilizo glutKeyboardFunc y glutSpecialFunc, y las constantes GLUT_KEY_LEFT, y demás... Hasta aquí todo perfecto. El problema reside en que no se como reconocer que se pulsan dos teclas a la vez (por ejemplo, flecha arriba, flecha izquierda, para hacer diagonales). He estado buscando en la API de OpenGL y GLUT y no he encontrado nada. Si sabéis algún modo de implementarlo me gustaría que me ayudáseis...

Estoy programando en GNU/Linux, por lo que, si se os ocurre alguna forma de detectar el doble evento de pulsación de teclado utilizando alguna otra biblioteca, estoy abierto a cualquier sugerencia.


:brindis:

Electric Dreams
26/02/2008, 23:46
En estos casos basta con el operador lógico AND... (no sé si me entiendes) :D

Fergus1986
27/02/2008, 00:19
No, no te entiendo

Yo tengo el siguiente código:


main(){

// El programa

glutSpecialFunc(girar);

// El resto del programa
}

void girar(int key, int x, int y){

switch(key){

case GLUT_KEY_RIGHT:
ejeY=-1.0;
incrementoY=1;
rotarY();
break;

case GLUT_KEY_LEFT:
ejeY=-1.0;
incrementoY=-1;
rotarY();
break;

case GLUT_KEY_UP:
ejeX=-1.0;
incrementoX=1;
rotarX();
break;

case GLUT_KEY_DOWN:
ejeX=-1.0;
incrementoX=-1;
rotarX();
break;

default:
break;

}
}

Si te refieres a introducir esto:

case GLUT_KEY_UP && GLUT_KEY_RIGHT:

ejeZ=1.0;
incrementoZ=1;
rotarZ();
break;

no funciona

Karkayu
27/02/2008, 00:30
Si esperas que arranque linux, te lo miro...

< - >

Creo que no es exactamente lo que buscas pero imagino que te ayudara.
Lo que yo hice fue usar la funcion glutGetModifiers(), la cual devuelve un entero predefinido por glut dependiendo del la tecla que tengas presionada al principio. Asi por ejemplo, GLUT_ACTIVE_CTRL indicaria que tienes pulsada la tecla control y que ademas vas a pulsar otra.

Si ves este sencillo ejemplo, te dar&#225;s cuenta de su uso:


void teclasEspeciales(int key, int x, int y){

//Control de dos teclas pulsadas
int modificadores = glutGetModifiers();

//Control+tecla especial
if (modificadores == GLUT_ACTIVE_CTRL) {

switch (key) {
case GLUT_KEY_LEFT: if (move) anteriorPunto(1);
break;
case GLUT_KEY_RIGHT: if (move) siguientePunto(1);
break;

//reset de la vista
case GLUT_KEY_F1: resetVista(vista); //reseteamos vista
break;


//Escalado 1:10
case GLUT_KEY_F2: if (!e110){
e110 = 1; //ya he escalado 1:10
grado_escalax = 10;
grado_escalay = 1;
colocarVista(vista);
}//if

... ... ...


M&#237;rate la documentaci&#243;n de glutGetModifiers() porque recuerdo que pod&#237;a devolver varios valores predefinidos (GLUT_ACTIVE_SHIFT tambian lo devolvia si manten&#237;as la tecla mayusculas).

No es exactamente lo que buscas pero espero que te ayude.

Un saludo
:brindis:

Fergus1986
27/02/2008, 01:00
Gracias por la respuesta tan r&#225;pida...

La funci&#243;n glutGetModifiers la utilizo para detectar que pulso Ctrl+A. Y en principio no me sirve para lo que necesito. De todas maneras, me volver&#233; a mirar la especificaci&#243;n para esa funci&#243;n, a ver si saco algo...

Electric Dreams
27/02/2008, 01:45
No, no te entiendo

Si te refieres a introducir esto:

case GLUT_KEY_UP && GLUT_KEY_RIGHT:

ejeZ=1.0;
incrementoZ=1;
rotarZ();
break;

no funciona

Perdón, porque yo uso una función propia para leer las pulsaciones del teclado en mis programas y al no ver código cuando lo lei, la tome "por defecto".

En tal caso, anida un SWITCH con los dos CASEs pertinentes en cada uno de los CASEs del SWITCH principal.

KaosOverride
27/02/2008, 04:06
Si no me equivoco, esas funciones devuelven las teclas que se van pulsando, y van de uno en uno, no puedes ver "dos a la vez" porque no se generan dos a la vez, se ponen en cola y la funcion va sacando uno en uno...

Sospecho que tendras que usar variables que se actualicen segun pulsas (Poner a true o 1) y sueltas (Poner a false o 0) y despues operar con dichas variables

Si son 2 o 3 combinaciones solo, puedes usar variables sueltas, o peque&#241;as matrices, si quieres aspirar a algo mas general igual tendras que currarte una matriz que contemble todas las teclas posibles y despues evaluar las combinaciones.

A ver si te sirve de pista... :)

EDIT: He encontrado esto:

HOWTO: Check if a Key is Down

One thing I liked in both Allegro and DirectInput, is that you could determine if any key on the keyboard was down at any time by simply looking up an entry in an array. You can do the exact same thing with GLUT by setting up two callback functions. This is shown below. You will need GLUT 3.7 for this to work, as glutKeyboardUpFunc is required to set the necessary callback.

int KeyDown[256];

void keyboard(unsigned char key, int x, int y)
{
KeyDown[key] = 1;
}

void keyboardUp(unsigned char key, int x, int y)
{
KeyDown[key] = 0;
}

...

memset( KeyDown, 0, sizeof( KeyDown ) );
glutKeyboardFunc( keyboard );
glutKeyboardUpFunc( keyboardUp );

...

if ( KeyDown['a'] )
shootGun();

...



Usando esa matriz, verificas las teclas que te haga falta con operandos, ya que las glutKeyboardFunc y glutKeyboardUpFunc las usas esclusivamente para actualizar tu matriz de teclado y verificarla despues

Para las felchas de cursor, usas otra funcion, pues en ella usa otra matriz de manera similar y la actualizas y compruebas despues. Al loro a poner la callback tambien para los eventos de liberar la tecla ;)

A ver si asi te funciona :brindis:

Ñuño Martínez
27/02/2008, 10:52
GLUT es malo. Te recomiendo que te pases a AllegroGL (http://allegrogl.sf.net/) o a SDL (http://www.libsdl.org/).

Karkayu
27/02/2008, 11:14
GLUT es malo. Te recomiendo que te pases a AllegroGL (http://allegrogl.sf.net/) o a SDL (http://www.libsdl.org/).

Malo porque? Depende de para que se use, no?

Yo programo aplicaciones basadas en la geodesia que luego mi empresa vende a sus clientes y por ahora no ha habido ninguna queja.

Hasta donde yo se, AllegroGL y SDL estan mas orientadas a videojuegos, no?
&#191;Que otras alternativas hay (Bajo C) que no sean las antes mencionadas?

Un saludo
:brindis:

Fergus1986
27/02/2008, 13:32
Si no me equivoco, esas funciones devuelven las teclas que se van pulsando, y van de uno en uno, no puedes ver "dos a la vez" porque no se generan dos a la vez, se ponen en cola y la funcion va sacando uno en uno...

Sospecho que tendras que usar variables que se actualicen segun pulsas (Poner a true o 1) y sueltas (Poner a false o 0) y despues operar con dichas variables

Si son 2 o 3 combinaciones solo, puedes usar variables sueltas, o peque&#241;as matrices, si quieres aspirar a algo mas general igual tendras que currarte una matriz que contemble todas las teclas posibles y despues evaluar las combinaciones.

A ver si te sirve de pista... :)



Gracias por la aclaraci&#243;n y la explicaci&#243;n... Yo ya me estaba imaginando que por ah&#237; iban los tiros, pero como estoy empezando con la programaci&#243;n gr&#225;fica, y los eventos, pues estoy todav&#237;a demasiado verde... Ahora me mirar&#233; el c&#243;digo para ver si puedo implementarlo.


GLUT es malo. Te recomiendo que te pases a AllegroGL (http://allegrogl.sf.net/) o a SDL (http://www.libsdl.org/).


Respecto a lo de Glut, yo como he dicho acabo de empezar, y seg&#250;n mis profesores Glut es la mejor para empezar por su sencillez e integraci&#243;n con OpenGl.

Ñuño Martínez
27/02/2008, 15:11
Malo porque? Depende de para que se use, no?

Yo programo aplicaciones basadas en la geodesia que luego mi empresa vende a sus clientes y por ahora no ha habido ninguna queja.

Hasta donde yo se, AllegroGL y SDL estan mas orientadas a videojuegos, no? S&#237;, est&#225;n para juegos. No sab&#237;a que era para una aplicaci&#243;n geod&#233;sica de esas.


Respecto a lo de Glut, yo como he dicho acabo de empezar, y seg&#250;n mis profesores Glut es la mejor para empezar por su sencillez e integraci&#243;n con OpenGl. AllegroGL tambi&#233;n es muy sencilla, de echo mucho m&#225;s que SDL y ahora que van a integrar AllegroGL en la versi&#243;n 5 de Allegro (http://alleg.sf.net/) pues m&#225;s todav&#237;a.

Y mi experiencia me ha ense&#241;ado a no fiarme un pelo de lo que diga un profesor sobre la calidad de un programa, sistema o lenguaje de programaci&#243;n. Ahora bien, si es para un trabajo universitario o escolar sigue a rajatabla las indicaciones del profesor, que una vez hayas aprobado ya podr&#225;s olvidarlo y trabajar bien.

Aviso: Todo esto lo he escrito siguiendo mi experiencia, que no es poca.