Pb avec la gestion de camera !

Résolu
cs_AmK Messages postés 368 Date d'inscription jeudi 13 mars 2003 Statut Membre Dernière intervention 27 janvier 2010 - 22 juil. 2004 à 12:36
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 - 25 oct. 2004 à 02:12
j'ai un petit problème ( voir gros ) avec la gestion de camera sous opengl , mais le pb ne vient pas de la , mon pb est purement c++ , ya qu"a voir les valeurs de positionX et positionY .... qui restent à zero !

voila les sources : http://site.voila.fr/allbrain/sourcesbis.zip

y'aurait t'il un sauveur ?

14 réponses

cs_AmK Messages postés 368 Date d'inscription jeudi 13 mars 2003 Statut Membre Dernière intervention 27 janvier 2010 1
30 juil. 2004 à 13:25
ça y'est problème reglé , il fallait juste ajouter avant le gluLookAt :
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

voila c'était tout con , le truc c'est que dans ma tete gluLookAt allait forcement avec la matrice de projection ... mais enfin bon :)
pour ta technique chouchou c'est ce que j'utilisais avant , mais à mon avis c'est une technique limitée , imagine que tu veuilles faire evoluer ton systeme de deplacement , ...... bref c'est inevitable le gluLookAt !
3
cs_Chouchou182 Messages postés 252 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 25 avril 2011 1
22 juil. 2004 à 16:16
Salut

J'ai pas compris l'utilité de la variable Game::rienafoutre.....

Le vrai problème c'est que j'ai pas pu compiler :
LINK : error LNK2001: unresolved external symbol _crtMainStartup
Je ne sais pas d'où ça vient (j'ai jamais rencontré cette erreur avant ...)

Si quelqu'un connais, merci de prévenir.

A++

Chouchou
0
cs_LordBob Messages postés 2865 Date d'inscription samedi 2 novembre 2002 Statut Membre Dernière intervention 11 mai 2009 9
22 juil. 2004 à 16:25
Chouchou182 << bah visiblement a premiere vu, tu as un erreurs parce que tu n'as pas ajouter une librairie a ton projet (librairie qui est necessaire a la compilation) !!!
Bob...

"La chance accorde ses faveur aux esprits avertis..."
0
cs_Chouchou182 Messages postés 252 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 25 avril 2011 1
22 juil. 2004 à 21:51
Salut

Je me doute bien qu'il manque une librairie mais laquelle ?
Etrangement j'ai pu compiler en mode release (en debug, voir erreur plus haut).

Voyons comment est initialisé lobjet gh_Camera qui semble bugger ; comme ceci :
Camera gh_Camera;

Quel est le constructeur par défaut ?
(0, 0, 0, 0.....0, 0 )

On a donc une caméra positionnée en l'origine qui regarde vers l'origine. La direction et le sens du regard (vecteurDirection - vecteurPosition ) donnent le sens de déplacement de la caméra.

Or un vecteur nul n'a ni direction ni sens, donc pas très utile pour un déplacement.

Ceci est un premier problème ; car la caméra ce déplace désormais (après modification) mais sur l'image, rien ne semble changer (seul l'objet camera donne de bons résultats via les printf...)

Je n'ai malheureusement pas trouvé...

A++

Chouchou
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_AmK Messages postés 368 Date d'inscription jeudi 13 mars 2003 Statut Membre Dernière intervention 27 janvier 2010 1
23 juil. 2004 à 19:26
ben non regarde dans main.h et tu verras que j'ai passé des paramètres au constructeur !
voila sinon j'ai trouvé l'origine du pb , le constructeur de camera était appelé trois fois , comme le montraient les printf ! et donc en virant l'héritage , apparement le constructeur n'est appelé que deux fois !
maintenant j'ai un autre pb avec gluLookAt les valeurs changent mais ...... aucune influence sur la sphere :(
0
cs_AmK Messages postés 368 Date d'inscription jeudi 13 mars 2003 Statut Membre Dernière intervention 27 janvier 2010 1
24 juil. 2004 à 16:49
lol en fait c'est evident avant avec l'héritage le constructeur par defaut de camera était appellé via l constructeur de vecteur !
enfin bref , c'était la cause du pb !
0
cs_Chouchou182 Messages postés 252 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 25 avril 2011 1
26 juil. 2004 à 13:05
Hello

A quoi sert PushMatrix ?
A placer la caméra en l'origine du repère...

Rajoute gh_Camera.placerCamera(); apres le glPushMatrix et ça marche !!

A++

Chouchou
0
cs_AmK Messages postés 368 Date d'inscription jeudi 13 mars 2003 Statut Membre Dernière intervention 27 janvier 2010 1
27 juil. 2004 à 13:17
ça ne marche toujours pas :(
bref je suis obligé de passer les varPos dans le glTranslate !
0
xarier Messages postés 688 Date d'inscription jeudi 26 décembre 2002 Statut Membre Dernière intervention 19 mai 2005
30 juil. 2004 à 03:05
salut
Amk-->He cher ami je v voir ca demain est posé une sources
de la gestion de camera complete avec opengl :D

aller @+
Life is Short 8-)
0
cs_Chouchou182 Messages postés 252 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 25 avril 2011 1
30 juil. 2004 à 10:42
Salut

J'ai effectivement écrit une grosse bétise. glPushMatrix() ne modifie pas la matrice active.

Pourtant les modifications que j'ai apportées, à savoir le constructeur par défaut et un nouvel appel à gluLookAt() ont fait marcher l'application. C'est pourquoi j'ai voulu expliquer le pourquoi de la réussite.

Or mon explication était erronée mais mes modifications fonctionnaient (et je ne sais toujours pas pourquoi).

Personnellement je n'utilise pas gluLookAt() mais une composition de translations et rotations (ce qui revient au final au même) mais ainsi je sais quelles transformations j'applique à ma scène.

J'ai vu ta correction et je pense que tes calculs pour récupérer Z et faire une translation supplémentaire ne doivent pas être. Imagine quand ta caméra bougera dans les trois coordonnées de l'espace.

Une petite amélioration : remplace
if(scaled==0)
scaled=1;
else if(scaled==1)
scaled=0;

par :
scaled = 1 - scaled ;

Un petit exemple en C aui gère une caméra

#include <GL/glut.h>
#include <stdio.h>
#pragma comment (lib, "opengl32")
#pragma comment (lib, "glut32")

struct Camera
{
float x, y, z ;
} camera ;

static float spin = 0.0f ;

void ComputeCamera()
{
glTranslatef(camera.x, camera.y, camera.z) ;
}

void display(void)
{
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity() ;
ComputeCamera() ;
glRotatef(spin, 0.0f, 1.0f, 0.0f) ;
glutWireSphere(1.0f, 20, 16) ;
glFlush ();
}

void init (void)
{
glClearColor (0.0, 0.0, 0.0, 0.0);
glEnable(GL_DEPTH_TEST) ;
glColor3f(1.0f, 0.0f, 0.0f) ;
camera.x = 0.0f ;
camera.y = 0.0f ;
camera.z = -10.0f ;
}

void Reshape(int w, int h)
{
glViewport(0, 0, w, h) ;
glMatrixMode(GL_PROJECTION) ;
glLoadIdentity() ;
glFrustum(-1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 10.0f) ;
glMatrixMode(GL_MODELVIEW) ;
}

void keybord(unsigned char key, int i, int j )
{
switch ( key )
{
case 27:
exit(0) ;
break ;
case 'R':
case 'r':
spin+=10.0f ;
break ;
case 'x':
camera.x += 1.0f ;
break ;
case 'X':
camera.x -= 1.0f ;
break ;
case 'y':
camera.y += 1.0f ;
break ;
case 'Y':
camera.y -= 1.0f ;
break ;
case 'z':
camera.z += 1.0f ;
break ;
case 'Z':
camera.z -= 1.0f ;
break ;
}
printf("x : %3.1f, y : %3.1f, z : %3.1f\n", camera.x, camera.y, camera.z) ;
glutPostRedisplay() ;
}

int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize (250, 250);
glutInitWindowPosition (100, 100);
glutCreateWindow ("hello");
init ();
glutDisplayFunc(display);
glutReshapeFunc(Reshape) ;
glutKeyboardFunc(keybord) ;
glutMainLoop();
return 0;
}
0
cs_Chouchou182 Messages postés 252 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 25 avril 2011 1
30 juil. 2004 à 14:52
Salut

gluLookAt n'est pas indispensable et même limité ; voici de quoi illustrer mes propos :

Tu modélises un système solaire avec une étoile fixe et des planètes en orbite autour. Le but est de montrer ce système solaire, pas d'y voyager.

Admettons une caméra qui regarde toujours vers l'étoile (simple avec gluLookAt, le vecteur At est constant).
On veut pouvoir se déplacer autour de l'étoile dans toutes les directions et se rapprocher ou s'éloigner du système pour voir plus ou moins de planètes...

Puisque la caméra est en orbite, le plus simple pour se repérer est d'utiliser des mesures d'angles. Comment transformer les angles en positions dans l'espace ? Un peu de trigo nous donne la position ; nous pouvons donc toujours utiliser gluLookAt (avec des calculs supplémentaires de sinus et cosinus).

Reste à renseigner le vecteur Up. Pour que l'utilisateur ne soit pas perdu, il faut qu'il soit orthogonal au rayon de l'orbite passant par la position de la caméra. Comment faire ? Je ne sais pas.

Voici une méthode pour remplacer des calculs inutiles :

typedef struct
{
float Orbit ; // Rayon de l'orbite de la caméra
float Elevation ; // Angle avec le plan de l'écliptique
float Rotation ; // Angle avec le plan x=0
} Camera ;

// Fonction de positionnement de la camera
int CApp::ComputeCamera()
{
glMatrixMode(GL_MODELVIEW) ;
glLoadIdentity() ;
glTranslatef(0.0f, 0.0f, -m_Camera.Orbit) ;
glRotatef(m_Camera.Elevation, 1.0f, 0.0f, 0.0f) ;
glRotatef(-m_Camera.Rotation, 0.0f, 1.0f, 0.0f) ;
return 0 ;
}

Ni glu, ni mathématiques horibles.

J'attend la version pour gluLookAt avec impatience.

A++

Chouchou
0
cs_AmK Messages postés 368 Date d'inscription jeudi 13 mars 2003 Statut Membre Dernière intervention 27 janvier 2010 1
30 juil. 2004 à 18:48
je n'ai pas dit qu'on pouvait se passer des glTranslate et autres glRotate loin de la, mais qu'il est indispensable que le systeme de gestion camera s'appuie sur gluLookAt , ce qui est bien sur utilisé dans tous les grands programmes OpenGL que j'ai pu voir !
0
xarier Messages postés 688 Date d'inscription jeudi 26 décembre 2002 Statut Membre Dernière intervention 19 mai 2005
30 juil. 2004 à 20:31
salut
en lisant un peu de cours sur le quaternion j'ai pas comprie un trucs :
il disent qu'il a 4dimention mais moi je connais que X,y,Z pour la profondeur alors c koi la 4eme (W) ca sert a koi expliquer moi tous car la je comprend plus rien :'(
Merci

"v" represents a vector (x, y, z), and "w" is a scalar. Just when you think you are
// starting to understand what a quaternion is, a stumbling block is placed in front of you.
// That is, you can't think of the vector (x, y, z) as a 3 dimensional vector, but a vector
// in 4 dimensions. You can't visualize this because we can't really comprehend a fourth
// dimension. This is one of those things that you need to just accept, and move on (while
// playing Quake 3 and barreling your rail gun into your opponent's chest, which if it happens
// to be the Angelina Jolie version of Lara Croft, a big one at that).

Life is Short 8-)
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
25 oct. 2004 à 02:12
Chouchou -> Reste à renseigner le vecteur Up. Pour que l'utilisateur ne soit pas perdu, il faut qu'il soit orthogonal au rayon de l'orbite passant par la position de la caméra. Comment faire ? Je ne sais pas

Il me semble qu'un petit produit vectoriel fasse l'affaire. Connaissant le vecteur vers le centre du soleil (S), et accrochez vous:
le vecteur tangeant au cercle de centre le soleil et passant par la camera (T), on obtient N en faisant S vectoriel T.
0
Rejoignez-nous