IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenGL Discussion :

Rotation de camera - problème d'écran qui se renverse


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    DSI
    Inscrit en
    Mai 2009
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DSI

    Informations forums :
    Inscription : Mai 2009
    Messages : 120
    Par défaut Rotation de camera - problème d'écran qui se renverse
    Bonjour,

    je réalise un petit programme sous Android avec OpenGL et je me trouve confronté à un problème de rotation de la caméra.

    Je souhaite que lorsque l'utilisateur tourne son appareil une rotation de la caméra soit exécutée. Afin de réaliser cette rotation j'applique une matrice de rotation (prise sur la FAQ) à mon vecteur center (de lookAt). Tout semble bien se passer jusqu'à ce que mon angle avoisine les 350 degrée. A ce moment l'écran se renverse sans en comprendre la raison.

    Pour information, je n'utilise que les angles de rotation en X et Y, Z est toujours à 0.

    Pouvez vous m'éclairer ?

    Merci

  2. #2
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 817
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 817
    Par défaut
    Salut

    Citation Envoyé par e-fitz Voir le message
    Pouvez vous m'éclairer ?
    Sans code, non.
    Sauf si on trouve un petit chat...

    Enfin, si, on aurait bien quelques idées, mais plutôt que de partir dans de grandes discussions philosophiques pour savoir ce que tu as bien pu faire dans ton code, autant nous montrer de suite comment tu as géré ta caméra. Ca ira plus vite.
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  3. #3
    Membre expérimenté
    Profil pro
    DSI
    Inscrit en
    Mai 2009
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DSI

    Informations forums :
    Inscription : Mai 2009
    Messages : 120
    Par défaut
    Oui evidement, j'aurais du mettre le code directement.

    Voici les parties ou je fais les opérations :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
     
     
    public void onSensorChanged(SensorEvent event) {
    	//Compute azimuth pitch roll
     	if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
     		acceleromterVector = event.values.clone();
     	} else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
     		magneticVector = event.values.clone();
     	}else if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {
     		yaw = event.values[0] * Deg2Rad;
     	}
     
     	SensorManager.getRotationMatrix(resultMatrix, null, acceleromterVector, magneticVector);
     	SensorManager.getOrientation(resultMatrix, values);
     	pitch = Math.floor(values[1] * 100.0) / 100.0;
     	roll = values[2];
     
     	center.rotate((float)yaw, (float)pitch, 0);
     
    }
    public void rotate(float yaw, float pitch, float roll){
    	float A       =  (float) Math.cos(pitch);	// angle x
    	float B       = (float) Math.sin(pitch);
    	float C       = (float) Math.cos(yaw);	// angle y
    	float D       = (float) Math.sin(yaw);
    	float E       = (float) Math.cos(roll);	// angle z
    	float F       = (float) Math.sin(roll);
     
    	float AD      =   A * D;
    	float BD      =   B * D;
     
    	float mat[] = new float[16];
    	mat[0]  =   C * E;
    	mat[1]  =  -C * F;
    	mat[2]  =  -D;
    	mat[4]  = -BD * E + A * F;
    	mat[5]  =  BD * F + A * E;
    	mat[6]  =  -B * C;
    	mat[8]  =  AD * E + B * F;
    	mat[9]  = -AD * F + B * E;
    	mat[10] =   A * C;
     
    	mat[3]  =  mat[7] = mat[11] = mat[12] = mat[13] = mat[14] = 0;
    	mat[15] =  1;
    	multMatrix(mat);
    }
     
    public void multMatrix(float m[]){
    	float tmpX = m[0] * x + m[1] * y + m[2] * z;
    	float tmpY = m[4] * x + m[5] * y + m[6] * z;
    	z = m[8] * x + m[9] * y + m[10] * z;
    	x = tmpX;
    	y = tmpY;
    }
    Merci encore.

  4. #4
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 817
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 817
    Par défaut
    Manque pas un "event." devant de values[1] pour le calcul du pitch?

    Il faudrait que tu traces l'évolution de tes angles, et voir lequel change brutalement quand la caméra se retourne. Ca aiderait à savoir ce qui buggue...

    Je n'aime pas trop avoir un floor sur le pitch, ça a un comportement non-linéaire cette chose...
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  5. #5
    Membre expérimenté
    Profil pro
    DSI
    Inscrit en
    Mai 2009
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DSI

    Informations forums :
    Inscription : Mai 2009
    Messages : 120
    Par défaut
    Bonsoir,

    j'ai retiré le floor pour vérifier, aucun changement.

    Il ne manque pas de event devant le values car ça correspond au retour de la fonction getOrientation qui remplis le tableau values.

    J'ai testé avec un pitch tout le temps à 0, le problème ne se produit plus.

    J'ai fait une trace sur l'angle yaw et le problème se produit au passage de 360 à 0 (quand l'utilisateur fait un tour complet avec son appareil).

    Est ce que si je fais une vidéo de l'affichage cela peut vous aider ?

  6. #6
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 817
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 817
    Par défaut
    Citation Envoyé par e-fitz Voir le message
    J'ai testé avec un pitch tout le temps à 0, le problème ne se produit plus.
    Donc le problème est sur le pitch...
    Si le floor n'est pas la source, peut-être que ça vient de la valeur utilisée dans le floor... elle correspond à quoi exactement? Avec le code que tu as fourni, on voit que c'est le getOrientations qui le donne, mais comment?

    Pourquoi d'ailleurs calculer le yaw avec le SensorEvent, et le pitch avec le SensorManager? Si tu calcules le yaw avec le SensorManager (comme conseillé dans la doc), est-ce que le problème subsiste?


    Citation Envoyé par e-fitz Voir le message
    Est ce que si je fais une vidéo de l'affichage cela peut vous aider ?
    Si ça montre juste que l'affichage s'inverse, j'ai bien peur que ça n'aide pas beaucoup...
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

Discussions similaires

  1. Problème avec VBO (écran qui clignote)
    Par laurencew dans le forum OpenGL
    Réponses: 6
    Dernier message: 25/02/2010, 17h10
  2. [MySQL] problème avec les ' qui font \'
    Par Rocco-biblio dans le forum PHP & Base de données
    Réponses: 16
    Dernier message: 02/04/2006, 22h06
  3. HTML : problème de tableaux qui se superposent
    Par paprika dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 13/10/2005, 15h55
  4. un fond d'écran qui ne se multiplie pas
    Par lnikolanta dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 23/09/2005, 16h03
  5. (jsp) problème avec sql qui contient la date
    Par future dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 31/08/2005, 16h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo