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 :

Calcul de l'angle de vue haut/bas


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 277
    Par défaut Calcul de l'angle de vue haut/bas
    Bonjour,

    J'ai un petit problème de 3D:

    - A l'aide d'une heightmap, j'ai créé un univers 3D formé de collines.
    - Je me déplace dans cette univers, et je positionne ma hauteur en fonction du niveau de gris du point sur lequel je suis.
    - Chaque point de mon image heightmap représente un carré, en fait 2 triangles (B, C, D et A, B, D)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    A       B
     .____.
     |   /|
     |  / |
     | /  |
     ./___.
    D       C
    J'affiche une texture dans ces 2 triangles.
    Cependant il me reste un problème, j'aimerai orienter la camera vers le haut ou vers le bas suivant que je monte ou descend d'une colline.
    Je dispose de l'angle, de la position X et Y et de la hauteur des point A, B, C et D.
    Hors si je suis dans ce cas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	   a 0° b
         .____.____.
         |   /|    |
    270° |  / |    | 90°
         | /  | \  |
         ./___.__X_.c
         |   d|    |
         |    |    |
         |    |    |
         .____.____.
               180°
    Je suis représenté par le X, et je regarde dans la direction du \, le point a a une hauteur de 2, et b, c et d ont une hauteur de 1, je devrais donc regarder vers le haut, me dirigeant d'un point c en hauteur=1 vers un point a avec hauteur = 2.
    Comment trouver l'angle de vu bas/haut en fonction de ma position dans le carré formé par a, b, c et d ?

    Cordialement !

  2. #2
    Membre extrêmement actif

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 408
    Par défaut
    bonjour,

    tu sais ou se trouve X, et tu connais la direction D' (sans tenir compte de la pente) vers laquelle tu voudrais regarder.

    grâce à la position de X tu peux déterminer le triangle sur lequel tu te trouve, donc tu peux calculer la normale N de ce triangle.

    il ne te reste plus qu'à projeter D' sur un plan de normale N pour avoir la direction réelle en fonction de la pente, et ayant un vecteur tu peux récupérer un angle assez facilement.

    j'espère que c'est assez clair ^^

    cordialement

  3. #3
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 277
    Par défaut Heu...
    Bonjour,

    Tu peux me donner un exemple concret ? Genre j'ai:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    (h=1)
    A_______B (h=2)
    |      /
    | !-> /
    |    /
    |   /
    |  /
    | /
    |/
    C (h=1)
    Donc si:
    h représente la hauteur du point
    A est en x = 0, y = 1
    B est en x = 1, y = 1
    C est en x = 0, y = 0
    Je suis représenté par le ! et je regarde à 90°, le 0° étant en haut, 180° en bas.
    On va dire que je suis en x = 0.2 et y = 0.7.
    Donc la normal se serai une droite perpendiculaire au triangle qui passe par mon point (!) ? Ta direction D' c'est aussi une droite ? Qui va de mon point ! jusqu'à l'intersection avec la droite BC ?

    J'ai un peu de mal avec les maths et c'est une sacrée lacune pour faire de la 3D...

    Cordialement.

  4. #4
    Membre extrêmement actif

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 408
    Par défaut
    bonjour,

    donc je récapitule :
    A(0, 1, 1)
    B(1, 1, 2)
    C(0, 0, 1)

    tu voudrais regardé dans la direction D'(1, 0, 0) en tenant compte de la pente (on appellera D ce vecteur corrigé)

    ensuite oui N la normale serait la droite perpendiculaire à ton plan en n'importe quel point de celui-ci, pour la calculer, il suffit de faire le produit vectoriel entre 2 "cotés" de ton triangle, par exemple entre AB et AC.

    calculons AB et AC (vecteur) :

    AB(1, 0, 1) et en le normalisant AB(0.707, 0, 0.707) (j'écris le vecteur normalisé juste pour illustrer le calcul)
    AC(0, -1, 0) qui a déjà une norme à 1, ok

    donc ensuite le produit vectoriel, rappel le produit vectoriel (cross product) entre 2 vecteur a et b se défini tel que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    a ^ b = ( a.y*b.z - b.y*a.z, 
              a.z*b.x - b.z*a.x,
              a.x*b.y - b.x*a.y)
    donc pour nos vecteurs AB et AC cela donne :
    N = AB ^ AC = (0.7, 0, -0.7)

    N est un vecteur normal, il ne montre pas forcément le "haut" du triangle, mais pour nous la normale suffit.


    donc ensuite je parlais de projection sur un plan de normale N, voici la formule (http://www.jdotec.net/s3i/Mecanique/...on_vecteur.php) :

    D = N ^ (D' ^ N) = (0.707, 0, 0.707) après normalisation du résultat, et donc ça c'est le vecteur de la direction vers laquelle tu regarde en tenant compte de la pente.

    ne sachant pas trop comment sont les angles que tu voudrais je m'arrèterai ici, mais tout est là pour calculer ce dont tu as besoin.

  5. #5
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 277
    Par défaut Alors ce que je trouve...
    Re,

    Donc j'ai fais ce bout de code:

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    	struct Point {
    		float x;
    		float y;
    		float z;
    	};
    	struct Point pointA;
    	struct Point pointB;
    	struct Point pointC;
     
    	struct Vecteur {
    		float x;
    		float y;
    		float z;
    	};
    	struct Vecteur vecteurAB;
    	struct Vecteur vecteurAC;
     
    	struct Normale {
    		float x;
    		float y;
    		float z;
    	};
    	struct Normale normale;
     
    	struct Direction {
    		float x;
    		float y;
    		float z;
    	};
    	struct Direction direction;
     
    	float magnitude;
     
    	// A(0, 1, 1)
    	pointA.x = 0.0f;
    	pointA.y = 1.0f;
    	pointA.z = 1.0f;	// hauteur
     
    	// B(1, 1, 2)
    	pointB.x = 1.0f;
    	pointB.y = 1.0f;
    	pointB.z = 2.0f;
     
    	// C(0, 0, 1)
    	pointC.x = 0.0f;
    	pointC.y = 0.0f;
    	pointC.z = 1.0f;
     
    	// Y
    	// ^
    	// |  ->
    	// |
    	// _______>X
    	direction.x = 1.0f;
    	direction.y = 0.0f;
    	direction.z = 0.0f;
     
    	vecteurAB.x = pointB.x - pointA.x;
    	vecteurAB.y = pointB.y - pointA.y;
    	vecteurAB.z = pointB.z - pointA.z;
     
    	printf ( "vecteurAB x=%f, y=%f, z=%f\n", vecteurAB.x, vecteurAB.y, vecteurAB.z );
     
    	vecteurAC.x = pointC.x - pointA.x;
    	vecteurAC.y = pointC.y - pointA.y;
    	vecteurAC.z = pointC.z - pointA.z;
     
    	printf ( "vecteurAC x=%f, y=%f, z=%f\n", vecteurAC.x, vecteurAC.y, vecteurAC.z );
     
    	// Calcul de la normale
     
    	normale.x = ( vecteurAB.y * vecteurAC.z ) - ( vecteurAB.z * vecteurAC.y );
    	normale.y = ( vecteurAB.z * vecteurAC.x ) - ( vecteurAB.x * vecteurAC.z );
    	normale.z = ( vecteurAB.x * vecteurAC.y ) - ( vecteurAB.y * vecteurAC.x );
     
    	printf ( "Normale x=%f, y=%f, z=%f\n", normale.x, normale.y, normale.z );
     
    	// Normalisation du vecteur ( Norme = 1 ) ???
    	magnitude = sqrt ( normale.x * normale.x + normale.y * normale.y + normale.z * normale.z );
    	normale.x /= magnitude;
    	normale.y /= magnitude;
    	normale.z /= magnitude;
     
    	printf ( "Normale normalise x=%f, y=%f, z=%f\n", normale.x, normale.y, normale.z );
    Qui me donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    vecteurAB x=1.000000, y=0.000000, z=1.000000
    vecteurAC x=0.000000, y=-1.000000, z=0.000000
    Normale x=1.000000, y=0.000000, z=-1.000000
    Normale normalise x=0.707107, y=0.000000, z=-0.707107
    Donc je trouve la même normale que toi, au passage ça consiste en quoi de "normaliser " ?

    C'est après je ne vois pas trop comment faire la projection, car tu écris:

    D = N ^ (D' ^ N)

    Mais D on le connait, c'est la direction, et N aussi c'est la normale, donc on cherche quoi ?

    J'aurais besoin d'une variable variant entre -90 et +90 en fonction de l'angle de vu, 0 étant l'horizontale.

    Merci beaucoup pour ton aide !

    Cordialement.

  6. #6
    Membre extrêmement actif

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 408
    Par défaut
    attention !!! (surement mes notations confuses)

    D' : vecteur direction du regard ne prenant pas en compte la pente
    D : vecteur direction du regard prenant en compte la pente, c'est celui là que l'on cherche à déterminer !!

    normaliser ça sert à ce que la norme (longueur) du vecteur soit égale à 1

    à quoi ça sert?
    en fait les formules du produit scalaire et du produit vectoriel donnent respectivement le cosinus et le sinus entre les 2 vecteurs d'entrée si ceux ci sont normalisés.
    de plus c'est une bonne habitude de normaliser les vecteurs car nombreuses sont les opérations nécessitant des vecteurs normalisés.

    ensuite tu veux un angle pour la verticale de la caméra entre -90 et +90, 0 étant l'horizontale, le +90 tu le veux pour la direction positive de l'axe?
    (un dessin serait plus clair pour savoir ce que tu veux)

    concernant ton code, juste une remarque, la normale et la direction sont tous les 2 des vecteurs, faire des types différents n'est, à mon avis, pas du tout conseillé.
    (pareil, différencier point et vecteur fait juste écrire du code en plus, mais ça se défend point de vue définition)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réalité augmentée - Calculer l'angle de vue
    Par baton dans le forum Moteurs 3D
    Réponses: 2
    Dernier message: 04/05/2012, 18h17
  2. Calcul de l'angle entre trois points en fonction du sens
    Par NeraOne dans le forum Mathématiques
    Réponses: 4
    Dernier message: 10/07/2007, 17h27
  3. Effet d'ombre haut, bas, droite et gauche
    Par kaiser59 dans le forum Imagerie
    Réponses: 2
    Dernier message: 15/03/2007, 12h59
  4. calcul de l'angle dièdre
    Par hamoudasafira dans le forum Mathématiques
    Réponses: 12
    Dernier message: 21/02/2007, 17h00
  5. Calcul d'un angle
    Par adrien954 dans le forum C++Builder
    Réponses: 2
    Dernier message: 05/09/2006, 15h08

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