goutbouyo
Messages postés429Date d'inscriptionmardi 6 juillet 2004StatutMembreDernière intervention12 janvier 2008
-
19 févr. 2005 à 00:38
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 2008
-
21 févr. 2005 à 18:14
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 ???
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 19 févr. 2005 à 22:17
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.
cs_erazor
Messages postés85Date d'inscriptionjeudi 7 février 2002StatutMembreDernière intervention 8 février 2007 19 févr. 2005 à 10:55
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...
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 19 févr. 2005 à 15:21
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.
++
Vous n’avez pas trouvé la réponse que vous recherchez ?
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 19 févr. 2005 à 23:44
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 :)
cs_erazor
Messages postés85Date d'inscriptionjeudi 7 février 2002StatutMembreDernière intervention 8 février 2007 20 févr. 2005 à 12:16
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 :-)
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 20 févr. 2005 à 13:26
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 :)
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 21 févr. 2005 à 18:14
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)