gestion clavier/souris [OpenGL] - Programmation
Marsh Posté le 05-05-2001 à 12:17:59
up up up
je sais qu'il y a des gens compétants ici, alors help please !!!!!!
Marsh Posté le 06-05-2001 à 18:01:04
Slt, pour deplacement style quake, un bon depart c'est le site de nehe, lecon 10, tu auras des equations de mouvement:
http://nehe.gamedev.net, bon code
Marsh Posté le 08-05-2001 à 11:29:32
Quelques infos parce que la tu n'as pas l'air de maitriser trop ce que tu ecris:
>> draw, reshape, et gestion_clavier sont des fonctions de type callback, c'est a dire que tu fournis un pointeur vers la fonction pour qu'elle puisse etre "rappelee" plus tard.
C'est pas illegal de redefinir le pointeur a l'interieur d'une fonction callback mais bon c'est vrai que c'est plus logique de le faire a l'exterieur surtout qu'il ne change pas!
>> gluLookAt(10,10,10,x,y,0,0,1,0);
La aussi il est mal place: Il est appele lorsque tu appuies sur une touche mais son emplacement dans la sequence de definition des matrices est imprecis et certainement incorrect. De toute facon comme avant tout affichage tu as un loadIdentity, tu te rends compte qu'il ne sert a rien!
gluLookAt est une fonction avec un comportement precis que je te conseille de relire dans la doc OpenGL.
>> glutPostredisplay, il ne sert a rien la encore la ou il est place, parce qu'entre le moment ou tu as affiche la scene et envoye le redisplay la scene n'a pas change!
Je te propose les remaniements suivants:
Tu mets le glutKeyboardFunc dans ta fonction main,
tu definis une variable globale X et Y qui correspondent a ton deplacement.
Tu mets le gluLookAt(avec X et Y) juste apres le LoadIdentity dans ta fonction draw et tu deplaces le glmaxtrixmode(modelView) dans le reshape.
Dans gestion clavier, tu changes les valeurs de X et Y en fonction de tes x et y et tu fais suivre ce changement par un glutPostRedisplay. (que tu vires de ta fonction draw, si tu ne changes rien a la scene..)
Apres, il faudra definir une vraie fonction de deplacement
parce que ton gluLookAt ne va pas te mener tres loin.
A+
LEGREG
Marsh Posté le 08-05-2001 à 14:12:03
merci legreg, mais j'avais fait ça avant et j'ai voulu voir si mon pb venait de là en changeant tout, mais ça ne changeait rien.
Mais c'est bon, maintenant j'ai fait un prg qui fonctionne à peu près, un cube qui tourne d'après une action sur la souris, qui se déplage suivant les fléches, page up et page down. Le problême c'est pour la rotaion en fait, il faudrait que je redéfinisse le répère après chaque translation mais ca sera pour une prochaine fois, là j'ai des exams pour la semine prochaine à préparer.
Marsh Posté le 04-05-2001 à 19:14:27
salut tlm, j'ai fais un petit programme de base qui affiche un carré. Jusque là rien de difficile. Je fais un petit truc pour gérer une touche (ici echappe pour quitter le prg), ça fonctionne. Ce que j'aimerais, ce seait le point de vue avec clavier/souris. J'ai essayé via gluLookAt, mais ça n'a pas l'air de fonctionner. Voilà le prog :
[source]
#include <gl/glut.h>
#include <iostream.h>
void reshape(int largeur, int longueur);
void draw();
void gestion_clavier(unsigned char touche, int x, int y);
void gestion_clavier_special(int touche, int x, int y);
void dep_lat_droite(int x);
void mouse_func(int x, int y);
void InitGL();
int fenetre_nom;
int main ( int argc, char *argv[], char *envp[] )
{
glutInit ( &argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(1024,768);
fenetre_nom = glutCreateWindow("test2" );
glutFullScreen();
glutReshapeFunc(reshape);
glutDisplayFunc(draw);
InitGL();
glutMainLoop();
return 0;
}
void reshape(int largeur, int longueur)
{
glViewport(0,0,largeur,longueur);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45, float(largeur/longueur), 1, 100);
glMatrixMode(GL_MODELVIEW);
}
void draw()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glutKeyboardFunc(gestion_clavier);
glBegin(GL_QUADS);
glColor3f(1,0,0);
glVertex3i(-1,-1,-1);
glVertex3i(-1,1,-1);
glVertex3i(1,1,-1);
glVertex3i(1,-1,-1);
glColor3f(0,1,0);
glVertex3i(-1,-1,1);
glVertex3i(-1,1,1);
glVertex3i(1,1,1);
glVertex3i(1,-1,1);
glColor3f(0,0,1);
glVertex3i(-1,-1,1);
glVertex3i(-1,-1,-1);
glVertex3i(1,-1,-1);
glVertex3i(1,-1,1);
glColor3f(1,1,0);
glVertex3i(-1,1,1);
glVertex3i(-1,1,-1);
glVertex3i(1,1,-1);
glVertex3i(1,1,1);
glColor3f(1,0,1);
glVertex3i(-1,-1,1);
glVertex3i(-1,-1,-1);
glVertex3i(-1,1,-1);
glVertex3i(-1,1,1);
glColor3f(0,1,1);
glVertex3i(1,-1,1);
glVertex3i(1,-1,-1);
glVertex3i(1,1,-1);
glVertex3i(1,1,1);
glEnd();
glutSwapBuffers();
glutPostRedisplay;
}
void gestion_clavier(unsigned char touche, int x, int y)
{
if (touche == 27)
exit (0);
gluLookAt(10,10,10,x,y,0,0,1,0);
}
void InitGL()
{
glEnable(GL_DEPTH_TEST);
glClear(GL_DEPTH_BUFFER_BIT);
}
[/source]
si j'initialise les valeurs de x et y à 0, il m'affiche le cube, mais le point que je veux regarder ne change pas.
Si je n'initialise pas x et y, l'écran est tout rouge, en fait je pense qu'on est dans le cube et que l'on voit la face arrière.
Quelqu'un a une idée, une @ vers un tutorial expliquant très bien ce genre de truc, ou un bouquin ?
Merci