Triangle de vision

Signaler
Messages postés
429
Date d'inscription
mardi 6 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2008
-
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
-
Salut,


J'ai un petit problème concernant les maths que je n'arrive pas à résoudre.


J'ai un triangle isocèle dans l'espace (en fait c'est un champ de vision) qui est horizontal(donc Y ne varie pas).


Ce triangle est attaché par le milieu de sa base à un ennemie dont je connais la position.


Comment est ce que je peux calculer les coordonnées des sommets de ce triangle en connaissant seulement l'angle de rotation de l'ennemi et sa position ???


C'est en OpenGl.


Vous avez une idée ???
A voir également:

14 réponses

Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Je te donne rapidement l'allure :)

La position du gas, on l'appelle M de coordonnées (x,y).

Le vecteur normal à la première face n1(x1,y1)

puis le deuxième (x2,y2).



On considère maintenant un objet P de coordonnées (a,b).

Le vecteur MP (du gas au point) c'est MP = (a-x , b-y)

Jusque la, ca va ? :)



Et bien l'objet est visible si et seulement si, le produit scalaire de MP par n1 et n2 est positif, c'est à dire :

if (

( (a-x)*x1 + (b-y)*y1 >= 0)

&&

( (a-x)*x2 + (b-y)*y2 >= 0)

)

alors l'objet est visible.

Voila comment gérer efficacement et
relativement simplement quand meme :), la champ de vision, sans calcul
de racine carré ou autre qui ralentisse le pc.



Si tu veux savoir comment définir les vecteurs n1 et n2, je peux détailler, si tu veux.
Messages postés
429
Date d'inscription
mardi 6 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2008

Petite rectification :
Ce triangle est attaché à l'ennemie par <STRIKE>le milieu de sa base</STRIKE> son sommet.
Messages postés
85
Date d'inscription
jeudi 7 février 2002
Statut
Membre
Dernière intervention
8 février 2007

mmm a premiere vu je dirai utilise plutot un arc de cercle qu'un triangle pour ton angle de vision
cela te permettra de verifier juste si d'une part la cible est dans l'angle de vision et d'autre part si elle est a distance pour la voir

et pour cela rien de plus simple, a partir des coordonnes de ta premiere entité et de la deuxieme, il suffit de determiner la distance les separants a l'aide d'un zoli petit... pythagore
(rappel: hypothenuse=racine(a²+b²))

ensuite a toi de trouver une maniere efficace pour determiner si il n'y a pas un objet assez imposant entre les deux entites pour les cachés l'une de l'autre...
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Un conseil, oubli les triangles isocèles, mais considère les vecteurs
normaux aux deux cotés de ton triangle isocèle (les deux cotés de meme
longueur), puis tu fais tourner ces vecteurs en fonction de l'angle de
rotation de la personne. Si alpha est l'angle de rotation et beta le
champ de vision. Si tu connais les matrices ou les lois de
transformation pour les rotations, tu appliques à un vecteur la
rotation alpha - beta/2 et l'autre alpha + beta/2.



La suite, pour savoir si quelque chose se trouve dans le champ de vision, deux produits scalaires font l'affaire.



++
Messages postés
429
Date d'inscription
mardi 6 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2008

A Erazor : ok pour Pythagore, ça me donne une distance mais si je suis derrière l'ennemie il doit pas me voir aussi bien que si j'étais devant lui.

Donc comment je vérifie si je suis dans le champ de vision de l'ennemie.

A Luthor : ta méthode à l'air efficace mais un peu trop compliquée pour moi ...
Messages postés
429
Date d'inscription
mardi 6 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2008

Ok merci pour ton explication.

Mais si le sommet du triangle est sur M alors P est visible seulement si les produits scalaires sont négatifs, non ???
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Le sommet du triangle dans mon explication c'est le point M, le sommet est ici sur le personnage.



Le fait que ce soit négatif ou positif, si tu changes la direction des
vecteurs en leur opposés, oui les test devront etre négatif. Mais moi
les vecteurs normal n1 et n2 je considère qu'ils pointent vers l'autre
coté du triangle.



Imagine tu es le point M (le sommet du triangle) face a toi, à droite:
un coté du triangle, un vecteur normal qui part du coté vers la gauche.
Le produit scalaire permet de séparer le plan est deux.

Le deuxième produit scalaire partant du coté gauche vers la droite, découpe également le plan en deux parties.

Le plan est donc séparé en 4 parties, la partie qui nous intéresse
c'est celle du milieu devant le point M, donc la positivité des 2
produits scalaires. J'espère avoir été clair :)
Messages postés
85
Date d'inscription
jeudi 7 février 2002
Statut
Membre
Dernière intervention
8 février 2007

pour ce qui est de ma méthode il te suffit de verifier si angle 1 champ de vision<angle visee autre entitee<angle 2 champ de vision

et s'il est pas compris dedans ba la c sur qu'il peut pas le voir
c meme a mon avis le premier test a faire

pour ce qui est de l'explication de luthor, desolé mais mes connaissances en maths étant un peu faibles (quoi? qui a dit que j'ai passé u bac S SI?) je suis desolé mais je ne peux pas aider :-)
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Erazor, en fait, ca dépend si on veut que ce soit rapide. Ta méthode va
demander les fonctions arcsinus, arccosinus, et arctangente. :), voila
le problème. Enfin c'est pas vraiment pas un problème, mais on peut
faire beaucoup plus rapide et plus élégant je pense :) Note également,
qu'avec ces fonctions on va etre "emmerdé" par les problèmes de
définitions :)

Exemple:

arctan(90°) c'est l'infini, donc il va apparaitre des bugs, ou alors,
ca va demander beaucoup de précaution, de cas particulier, bref, vous
imaginez :) Alors vous allez me dire, bas on utilise arccos et arcsin,
qui sont plus sympa. Ben oue, mais va falloir faire le rapport, et la
division par zero est pas loin :)



voila :)
Messages postés
85
Date d'inscription
jeudi 7 février 2002
Statut
Membre
Dernière intervention
8 février 2007

effectivement maintenant que tu m'en parle ma méthode est peut être légèrement ...chiantes a mettre en oeuvre
Messages postés
429
Date d'inscription
mardi 6 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2008

Ok je comprends ta méthode mais je sèche sur la méthode pour trouver les coordonnées des vecteurs normaux ...
Messages postés
85
Date d'inscription
jeudi 7 février 2002
Statut
Membre
Dernière intervention
8 février 2007

mmm voila une question interressante a laquelle malheureusement je ne peux te repondre, etant moi meme en trai nde me la poser lol
Messages postés
429
Date d'inscription
mardi 6 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2008

Lol, j'espère que Luthor va venir nous donner cette réponse ...
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Bon alors deux méthode ici: les matrices ou les complèxes,

Ca revient exactement au meme. En fait, tu t'en fou :) tu veux le résultat toi ^^ En complexe c'est plus simple sur le plan.



Si on prend un vecteur V = (a, b) du plan. On veut lui faire une rotation de "x" radian ou degré peut importe.

Le nouveau vecteur que l'on obtient, ca a dire tourné de x radian dans le sens trigonométrique, (je l'appelle T):

V = ( a, b )

T = ( a*cos(x) - b*sin(x) , b*cos(x)+a*sin(x) )



Donc dans le cas de ton truc:

On peut appeler "alpha", l'angle dans lequelle regarde ton personnage, et "beta"
son champ angulaire de vision. En fait ici, la formule du dessus permet
facilement de trouver les vecteurs "colinéraires" à coté de ton
triangle isocèle. Mais nous on veut les vecteurs nomaux à ces cotés, un
des vecteurs va donc subir une rotation de Pi/2 (90°) vers la gauche et
l'autre vers la droite, de facon à ce que la flèche de chacun de ses
vecteurs pointent vers le coté opposé, pour obtenir un test positif.



Les deux vecteurs normaux sont donc:

( note que la longeur des vecteurs normaux n'influe en rien, on s'en
fou, je les prend donc unitaire, c'est à dire de longueur 1. Le vecteur
que je fais tourner, je prend le vecteur (1 , 0), c'est plus simple.
Sur une feuile, je place l'axe x horizontal et y vertical)

n1 = ( 1*cos(alpha - beta/2 + Pi/2) - 0 , 1*sin(alpha - beta/2 + Pi/2)

cad:

n1 = ( cos(alpha - beta/2 + Pi/2), sin(alpha - beta/2 + Pi/2) )

n2 = ( cos(alpha + beta/2 - Pi/2), sin(alpha + beta/2 - Pi/2) )


Voila, si tu as un doute, contact moi. Si jamais j'ai fais une erreur, je te le ferais savoir, mais je pense pas :)