detecter collisions ds un monde en 3d - Algo - Programmation
Marsh Posté le 10-02-2005 à 13:08:27
pour de la detection de collision d'homme, faut du bsp ou ot chose (octree, bounding box, ce genre de truc)
Marsh Posté le 10-02-2005 à 13:32:12
alors pour trouver une équation de plan pour un triangle.
tu chopes deux vecteurs V0->V1 et V0->V2 (dumoins p1->p2 & p1->p3)
tu fais le produit vectoriel (ou croisé)-> ça te donnes la normale N.
dont la norme = 2*la surface du triangle.
ensuite comme "V0.x* N.x + V0.y*N.y + V0.z*N.z + d" est censé être = 0
d = - V0.x* N.x + V0.y*N.y + V0.z*N.z;
(soit - le produit scalaire V0.N ).
si je dis pas de bêtises.
tu peux aussi normaliser N pour des calculs d'éclairages ultérieurs ou autre, avant le calcul de d. (et vérifier que N pointe bien vers l'extérieur matière => vers le volume où la caméra peut évoluer).
ensuite pour la collision avec la caméra, tu as le point initial I, le nouveau point I' après déplaçement.
si I' inséré dans l'équation de plan est positif, tu est dans le volume évoluable => pas de collision.
si avec I' c'est négatif (valeur a) et I c'est positif (valeur b), y'a collision (I->I' traverse le plan), tu as le point de collision en faisant le barycentrage par rapport aux valeus a & b qui sont les distances au plan. (dumoins -a & b).
voilà j'ai rien vérifié, donc si je m'ai gourré je m'en fous.
my 2 cents.
(sinon oui après le mieux c'est d'utiliser des techniques plus évolués, mais pour commençer ça te fera un bon exo)
Marsh Posté le 14-04-2005 à 03:10:44
Salut. Jai fais un petit prog en C++ & OpenGL qui maffiche des cercles qui se deplacent aleatoirement, avec des couleurs qui leurs sont propres et des entrées clavier.
Mais je voudrais pouvoir gerer les collisions entre tous ces cercles, sachant quil y en a plusieurs centaines...et je doute que tester les collisions en tous mes cercles soit une bonne chose, mais bon, passons, je verrais ça plus tard.
Ce qui minterresse cest de savoir comment je pourrais detecter les collisions entre ces deux cercles...je connais leur rayon, leur position. Sachant que jai 15 ans et que je suis une quiche en maths :-/. Auriez vous un lien (appliqué a la prog 2D/3D si possible) expliquant ce que sont les "produits scalaires" et ce quest normaliser un vecteur par exemple...car je nai pas bien capté les explications de bjone...
En tout cas merci ;-)
A bientot
Marsh Posté le 14-04-2005 à 09:34:36
pour des cercles, pas besoin, pour chaque couple de cercles que tu veux tester, tu prends la distance entre les centres et si elle inférieure à la somme des deux rayons c'est qu'il y a collision.
Marsh Posté le 14-04-2005 à 09:42:21
On fait plus le produit scalaire et les vecteurs au lycée o_O ??
A.B = A.x*B.x + A.y*B.y + A.z*B.z
Norm(A) = SQRT(A.A);
Normaliser A => A' = A/Norm(A) = A/SQRT(A.A)
Marsh Posté le 14-04-2005 à 13:37:54
bjone==> oui javais compris quil fallait faire comme ça...cest ce que je cherche a faire mais je narrive pas trop a retranscrir ça en C++...les quelques tests que jai fait ne fonctionnaient pas..
Joel F==>Si, on doit en faire je pense, mais je suis en seconde et jusqua present on a rien fait sur les vecteurs...a par en 3eme ou ça navait rien a voir, cetait vraiment les bases..
Ca veut dire quoi ça ? => "Norm(A) = SQRT(A.A);"
Merci
@+
Marsh Posté le 14-04-2005 à 13:41:28
Norme(A) = racine carré de (A produit scalaire A)
norme d'un vecteur = sa "longueur"
produit scalaire de deux vecteurs normalisé (donc avec une norme de 1) = cosinus de l'angle entre ces deux vecteurs
cette derniere formule, c'est le bonheur sur terre
Marsh Posté le 14-04-2005 à 13:51:56
coincoin1307 a écrit : |
c'est une blague j'espere o_O ...
Marsh Posté le 14-04-2005 à 13:57:37
Joel F a écrit : c'est une blague j'espere o_O ... |
bein non?
les produits scalaires c'est en seconde/première il me semble?
en collège les vecteurs ça se limite à la loi de chasles de crois??
Marsh Posté le 14-04-2005 à 13:59:23
mouais mais bon si en seconde au mois d'avril ils ont pas entamé les vecteurs ...
et je me rappelles avoir vu : A.B = |A||B|cos(AB) en 3e
Marsh Posté le 14-04-2005 à 19:28:57
Citation : A.B = |A||B|cos(AB) en 3e |
Et bien lecole a bien changé ! lol
Bien sur on fait des fonctions ce genre de choses, mais je peux tassurer qu'on a encore pas touché aux vecteurs; ils sont au chapitre suivant, je vais regarder mon livre de maths
De plus, schnapsmann a raison, en 3eme les vecteurs s'sarrete a la relation de Chasles...et rien de plus. Et l'an prochain je ferais ES (plus de physique), donc je n'entendrais (je pense) pas parler de produits scalaires et autres formules durant ma scolarité...nest-ce pas ?
Mais la nest pas la question, je vais essayer de voir ce que je peux trouver sur le net.
Merci pour vos interventions ;-)
Marsh Posté le 15-04-2005 à 00:40:58
Et oui, c'est malheureux...
Je te sens un peu comme... lol
Marsh Posté le 04-05-2005 à 09:32:55
Joel F a écrit : mouais mais bon si en seconde au mois d'avril ils ont pas entamé les vecteurs ... |
il me semble avoir vu c en 1ère S ^^
(c'est il y a dire a 4 ans)
Marsh Posté le 10-02-2005 à 13:05:12
salut a ts
voila je travail en ce momment sur un projet de monde en 3d .
je suis en train d'essayer de détecter les collisions .
j'ai deja reussi à gerer tout sa en 2d , cad negliger z. Mais j'aimerais pouvoir gérer les collisions avec le sol et le plafond. je pourrais ainsi faire plusieurs étages ds mon monde.
il faudrait donc que j'arrive a détecter les collisions entre la camera ( que je considere comme un point ) et les murs que je considere comme des plans.
j'ai stocker ds une liste 3 points appartenant a chaque mur.
Mais je n'arrive pas trouver l'équation du plan qui passe par ces 3 points.
p1(x1,y1,z1)
p2(x2,y2,z2)
p3(x3,y3,z3)
je sais que :
x1*a+y1*b+z1*c+d = 0
x2*a+y2*b+z2*c+d = 0
x3*a+y3*b+z3*c+d = 0
mais comment je peux resoudre cela ?
si qq1 a une autre solution plus simple je suis preneur
( je programme en c++ avec opengl sous windows )
merci d'avance
@+