1

Nous y voilà... je veux gérer des collisions super simples en 3D: un perso avec un cube (en l'occurence j'ai choisi le modèle sphère-plan qui me semble logique) mais je n'y arrive pas. J'arrive à détecter avec le produit scalaire la distance du point au plan (enfin je crois que c'est ça) mais après je crois qu'il faut projeter mon point sur le plan pour tester s'il appartient au quad, et pas moyen de retrouver cette damnée formule pour le faire (sur Internet chacun l'explique à sa manière, je ne comprends plus rien), je me rappelle que c'est super simple, mais je ne peux pas baser mes calculs sur une incertitude.
Est-ce que quelqu'un a un bon tuto sur les collisions 3D qui explique depuis le départ et n'utilise pas de formules trop compliquées comme la résolution d'équations différentielles (sicksick), ce serait vraiment sympa parce que là je nage depuis un bon moment smile
Merci d'avance!
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

2

?call momotte
pour le moteur 3D
et
?call hippopotame
pour les maths
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

3

Tes cubes bougent ou bien il s'agit d'un décor fixe ? Dans le deuxième cas, ce que j'aurais eu tendance à faire ne vaut peut-être pas grand chose, mais j'aurais dans un premier temps calculé les équations des plans contenant les faces de ton cube (donc un vecteur à 3 coordonnées et une distance soit 4 valeurs par face). Comme tes cubes ne bougent pas tu n'as besoin de faire ça qu'à l'initialisation, et tu conserves les valeurs une bonne fois pour toutes.

Ensuite au moment de tester une collision avec un point (ou avec une sphère, puisqu'au rayon près tu vas procéder de la même façon), tu n'as plus qu'à tester si il est situé à "l'intérieur" du cube délimité par tes 6 plans : si il est situé du même coté pour tous les plans (un simple produit scalaire à calculer à chaque fois), alors il est dans le cube (donc en collision avec lui), sinon non. Tu peux généraliser cette méthode d'ailleurs, puisqu'elle fonctionne avec n'importe quel polygone convexe et pas seulement des cubes.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

4

Soient u et v 2 vecteurs non colinéaires (et a fortiori non nuls) de ton plan. Alors:
n = u × v est un vecteur normal (c'est-à-dire orthogonal) non nul à ton plan. (Si tu as un autre moyen d'obtenir un vecteur normal, tu peux faire la suite avec n'importe quel n non nul et orthogonal au plan.)
Soit P ton point et Q un point quelconque de ton plan. Soit p = ((PQ · n)/(n · n)) n (c'est la formule du projeté orthogonal d'un vecteur sur un autre). Alors H = P + p (quand j'ajoute un point et un vecteur, c'est une simple addition de coordonnées - en terme de vecteurs, ça correspond à OH = OP + p) est le projeté orthogonal de P sur ton plan et ||p|| = (PQ · n)/||n|| est la distance de P à ton plan.
Tu remarqueras qu'on divise à chaque fois par la norme de n ou son carré (rappel: n·n=||n||²), donc travailler avec un vecteur normal normé à 1 peut être avantageux. Si tu prends (u,v) un repère orthonormé de ton plan (||u||=||v||=1 et u·v=0), alors tu auras automatiquement ||n||=1 ((u,v,n) sera un repère orthonormé de l'espace).
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

5

Tout comme dit kevin (j'ai l'habitude de noter le produit vectoriel 26d06b9a487df239c4d90df09c2b6f4e.png). Ensuite tu peut trouver le vecteur PH (P est ton point, H son projeté) avec le produit scalaire de PM avec le vecteur n trouvé avec26d06b9a487df239c4d90df09c2b6f4e.png/|26d06b9a487df239c4d90df09c2b6f4e.png| (avec M n'importe quels point tu plan dont tu connais les coordonnées)

6

Merci beaucoup des conseils. Zéphyr> je suis plutôt intéressé par la détection avec n'importe quel type de facettes, histoire de pouvoir ensuite le faire avec des pyramides, etc. wink
Kevin> Merci pour ton explication claire. J'ai testé un peu et effectivement ça me donne la projection du point sur le plan. En fait c'est plus compliqué que ce que je ne pensais parce que croyais qu'avec ça j'allais ramener le problème en 2D, mais en fait ce n'est pas le cas, j'ai encore pas mal à apprendre.
Par contre je suis quand même super étonné de ne pas avoir pu trouver ça sur internet :/ tout ça me fait dire que je dois pas m'y prendre très bien pour la recherche hum
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

7

Snifff mourn
J'ai vraiment l'impression de pédaler dans la semoule. J'ai essayé de suivre plein de tutos, mais à chaque fois je bloque, au milieu ils se lancent dans des trips que j'arrive pas à comprendre et je ne sais absolument pas ce qu'il me faudrait étudier pour savoir de quoi ils parlent.
Par exemple si je prends ça: http://gpwiki.org/index.php/Ray_Triangle_Collision
Ca a l'air sympa, et tout, donc au début ok, après quand il définit sa matrice T en disant "This is the matrix to convert from {a,b,c} coordinates to {x,y,z} coordinates.", ben je comprends que dalle. Comment il l'a trouvée? On dirait une matrice de translation, mais il a sorti d'où la division par A?
Bref je désespère, c'est quand même assez incroyable de penser que n'importe quel programmeur a dû se lancer dans un truc pareil mais que j'arrive même pas à lire le moindre tuto...
mur cry

[Edit] Je suis con, à propos de l'angle entre deux vecteurs je mélangeais deux trucs, en fait il n'y a qu'un angle, il m'a fallu crayonner pendant 2 arrêts de train pour m'en rendre compte grin
vince (./2) :
?call momotte
pour le moteur 3D
et
?call hippopotame
pour les maths

Momotte c'est sBibi? Je sais qu'il a changé en même temps que Vark (que je n'ai pas eu de peine à retrouver grin) mais je ne suis pas sûr de son nouveau pseudo. Si oui je l'appellerais volontiers smile
Et puis j'ai l'impression que vue la fréquentation je ne suis pas dans la bonne section (?) Est-ce que ça vaut une recréation dans Algorithmie ou Discussions générales, voire Maths?
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

8

oui, momotte c'est sbibi
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

9

Merci smile
Bon ben je vais l'appeler, j'espère qu'il ne m'en voudra pas doom
!call momotte
--- Call : momotte appelé(e) sur ce topic ...

Est-ce que tu aurais de bonnes références pour commencer au niveau détection de collisions / moteur 3D? smile
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

10

ah heu merde j'avais pas vu, dsl triso

c'est toujours d'actualite comme question? ou c'est bon? grin (vu que c'etait y a... heu... 3 mois..)

enfin sinon, dans le doute, pour des collisions avec des box, google SAT // Separation Axis Theorem
ton perso c'est quoi? une ellipsoide? une sphere? un point? Oo

(et en fait, heu.. non, j'ai pas vraiment une bonne list de references, genre grosse liste d'urls sous la main grin)

juste une precision: t'as deux grandes familles d'algos de detection de collisions: les detections de collisions dites "discretes" et "continues".

pour un point, un exemple de detection de collisions discrete serait: "est-ce que le point est dans la box?"
et continue: "est-ce que le rayon qui part du point de depart 'A' du point qui correspond a sa position actuelle vers le point d'arrivee 'B' ou il est cense aller a la fin de cette frame, intersecte la box, et si oui, en quel point?"

pour les spheres, au lieu d'un test avec un point ou un rayon, ca serait avec une sphere et une capsule.
apres, des que tu deformes une sphere pour en faire un ellipsoide, ou que tu prends d'autres formes plus complexes, ca devient rapidement beaucoup plus complexe/couteux.
si ton objet est assez simple, tu peux toujours calculer l'enveloppe convexe qui reunit l'objet au debut et a la fin de sa trajectoire, et ca approximera pas trop mal un sweep.

l'avantage evident de la detection de collisions continue, c'est que forcement, tu loupera pas de collisions, peu importe ton timestep et ta vitesse de deplacement. alors que si jamais tu vas trop vite, tu peux louper des collisions avec les methodes discretes, meme celles qui subdivisent le chemin de deplacement de ton objet en plusieurs segment et testent si il intersecte quelquechose en l'avancant progressivement de segment en segment.

apres, tu peux faire des melanges des deux: prendre la bounding sphere de ton objet, faire un sweep, ou le convex hull, et si tu trouves une collision, tu passes en mode discret, en t'eloignant progressivement du point d'intersection que t'as trouve.
enfin bref il y a plein de facons de faire.
et je parle de ca dans le sens ou selon ce que tu decides d'utiliser ca va pas mal changer les algos sur lesquels tu devra te pencher. les tests continus (sweeps), etant notablement plus difficiles..

t'as essaye d'aller voir sur des sites comme gamasutra.com ou le forum maths&physics de gamedev?
(tiens, sur gamasutra, je viens de tomber la dessus: http://www.gamasutra.com/view/feature/3190/advanced_collision_detection_.php )
pas lu, mais vu le titre "advanced", c'est ptetre pas ce que tu cherches... enfin il doit surement y en avoir d'autres qui prennent la chose depuis le debut...

(apres la detection, t'as aussi la reponse aux collisions, ou tu peux vouloir que tes objets rebondissent les uns sur les autres, etc.. c'est encore autre chose ca. mais generalement, c'est beaucoup plus simple. une fois que t'as ton point d'impact, la normale d'impact, eventuellement des coefficients de friction et de restitution pour chacun des deux surfaces, c'est assez trivial compare au code qu'il faut pour trouver le point d'impact)

(tiens, un autre article de gamasutra en vrac: http://www.gamasutra.com/features/19991018/Gomez_1.htm
(allez et puis un vieux thread sur gamedev, mais avec des posts d'une rare clarte: http://www.gamedev.net/community/forums/topic.asp?topic_id=346956&PageSize=25&WhichPage=1
(sinon, aussi, tu peux tenter les forums de www.developpez.com
(y a ptetre aussi des trucs sur le doctor dobb's journal: www.ddj.com ))))

ah et ton lien la: http://gpwiki.org/index.php/Ray_Triangle_Collision
c'est quoi que tu comprends pas avec les matrices?

la a vue de nez, il veut juste chopper une matrice qui lui permette de transformer son rayon (qui doit etre dans le meme systeme de coordonnees que les points de son triangle) dans un espace ou un des cotes du triangle est aligne avec l'axe X, et de longueur unitaire, et l'autre aligne avec, genre, l'axe Y, et de longueur unitaire aussi, pour pouvoir simplifier le test.

donc il prend juste les deux vecteurs correspondant aux deux cotes de son triangle, la translation qui permet de remettre le point commum des deux cotes a l'origine, il colle ca respectivement dans l'axe X, Y, et dans les translations de sa matrice de transformation, et il calcule l'axe Z en faisant le produit vectoriel des axes X et Y (ce qui lui donne un axe Z perpendiculaire au plan defini par X et Y).

et.. bah.. voila, il a sa matrice...
dans une matrice de transformations 4x4, en ignorant les coordonnees homogenes, la premiere ligne (ou colonne suivant ta notation) c'est l'axe X de l'espace represente, la deuxieme c'est l'axe Y, la troisieme l'axe Z, et la derniere ligne c'est l'endroit ou se trouve l'origine de cet espace (ie: les translations). et cette matrice permet de transformer un point defini dans l'espace qu'elle represente dans l'espace dans lequel se trouvent les axes X, Y, Z, et les translations...

apres, lui veut faire l'inverse: il veut convertir des coordonnees dans l'espace "global" jusque dans l'espace du triangle defini par cette matrice, donc vu que c'est la transformation inverse, il faut inverser la matrice, pour pouvoir transformer le rayon correctement.

mais bon, si ca se trouve, depuis le temps, maintenant, tu t'en fous... grin

EDIT: pas pris le temps de lire ca non plus, mais ca a l'air sympa aussi: http://www.harveycartel.org/metanet/tutorials/tutorialA.html

EDIT2: y a pas mal de liens dans la FAQ du forum maths&physics de gamedev.net, tu devrais aller voir ^^
avatar
HURRRR !

11

Heu oui c'est toujours d'actualité mais là j'ai pas trop le temps de voir malheureusement wink
Merci en tous cas, je te tiendrai au courant wink
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741