Collision 3D

Généralités sur la programmation 3D
Polo
Messages : 612
Inscription : sam. 03/juil./2004 20:14

Collision 3D

Message par Polo »

Salut !
Je n'utilise pas Ogre, mais vous pouvez peut être m'aider quand même ;)
Donc voila, j'ai une dll qui vérifie s'il y a une collision avec n'importe quel triangle que je lui fournit, et elle le fait très bien. Le problème, c'est qu'elle n'est pas vraiment adaptée pour les jeux, et elle ne me dit que s'il y a une collision, et si oui, avec quel triangle. Le truc que je voudrais, c'est que l'objet glisse quand il y a collision, est ce que je peux calculer ça avec les données que j'ai (cad avec les coordonnées du triangle en collision et des normales de ce triangle) ?

Merci :)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

pour ma lib m3d_matrix , une fois que je connais le triangle sur lequel je me trouve , je connais les 3 points de ce triangle, et donc je peux déterminer l'équation du plan pour ce triangle, et j'utilise l'équation du plan pour calculer des déplacements à la surface du triangle , et donc de la matrice en passant d'un triangle à l'autre.

ce n'est pas vraiment une collision glissante , mais bon , c'est une piste .. :)
Polo
Messages : 612
Inscription : sam. 03/juil./2004 20:14

Message par Polo »

euh... t'aurais pas un bout de code là ? parce dès qu'on parle de maths, je suis bcp moins fort :)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Voila le code, faudrait que je me replonge dedans pour les explications
et surtout que je retrouve l'adresse des sites sur lesquels j'ai trouvé les équations utiles .

l'équation du plan avec 3 points
a.f = (Xp - Matrice()\Largeur / 2) - P1\x
d.f = P3\x - P1\x
g.f = P4\x - P1\x
e.f = P3\y - P1\y
h.f = P4\y - P1\y
c.f = (Zp - Matrice()\Profondeur / 2) - P1\z
f.f = P3\z - P1\z
i.f = P4\z - P1\z
y.f = (((c * e * g) - (c * d * h) + (a * f * h) - (a * e * i)) / (f * g - d * i)) + P1\y
je fais un else , parce que je travaille avec les facettes de la matrice , donc deux triangles, au départ , je sais sur quelle facette je suis , il me reste à déterminer sur quel triangle , pour ça j'utilise une autre équation .

faudrait que je retrouve le site sur lequel j'ai appris ça :)

; - Matrice()\Largeur / 2 => Pour mettre l'entity dans le même repère que les facettes
Xw.f = (Xp - Matrice()\Largeur / 2) - P1\x - (Matrice()\TailleFacetteX / 2)
Zw.f = (Zp - Matrice()\Profondeur / 2) - P1\z - (Matrice()\TailleFacetteZ / 2)
If Zw - Xw < 0

Code : Tout sélectionner

 ;Determine les points du plan 
  x = Int(Xp / Matrice()\TailleFacetteX)
  z = Int(Zp / Matrice()\TailleFacetteZ)
  If x < 0 Or x >= Matrice()\NbFacetteX Or z < 0 Or z >= Matrice()\NbFacetteZ
    ProcedureReturn 0
  EndIf
  
  P1.M3D_Vecteur
  P2.M3D_Vecteur
  P3.M3D_Vecteur
  P4.M3D_Vecteur
   
  NoFacette = x + Matrice()\NbFacetteX * z
  NoPoint = NoFacette * 4
  AdrPoint = Matrice()\PointIDMemory + NoPoint * 12
  
  P1\x = PeekF(AdrPoint) 
  P1\y = PeekF(AdrPoint + 4) 
  P1\z = PeekF(AdrPoint + 8) 
  AdrPoint + 12
  P2\x = PeekF(AdrPoint) 
  P2\y = PeekF(AdrPoint + 4) 
  P2\z = PeekF(AdrPoint + 8) 
  AdrPoint + 12
  P3\x = PeekF(AdrPoint) 
  P3\y = PeekF(AdrPoint + 4) 
  P3\z = PeekF(AdrPoint + 8) 
  AdrPoint + 12
  P4\x = PeekF(AdrPoint) 
  P4\y = PeekF(AdrPoint + 4) 
  P4\z = PeekF(AdrPoint + 8) 
  ; - Matrice()\Largeur / 2 => Pour mettre l'entity dans le même repère que les facettes
  Xw.f = (Xp - Matrice()\Largeur / 2) - P1\x - (Matrice()\TailleFacetteX / 2)
  Zw.f = (Zp - Matrice()\Profondeur / 2) - P1\z - (Matrice()\TailleFacetteZ / 2)  
  If Zw - Xw < 0
    a.f =(Xp - Matrice()\Largeur / 2) - P1\x
    d.f = P2\x - P1\x
    g.f = P4\x - P1\x
    e.f = P2\y - P1\y
    h.f = P4\y - P1\y
    c.f = (Zp -Matrice()\Profondeur / 2) - P1\z
    f.f = P2\z - P1\z
    i.f = P4\z - P1\z
    y.f = (((c * e * g) - (c * d * h) + (a * f * h) - (a * e * i)) / (f * g - d * i)) + P1\y
  Else
    a.f = (Xp - Matrice()\Largeur / 2) - P1\x
    d.f = P3\x - P1\x
    g.f = P4\x - P1\x
    e.f = P3\y - P1\y
    h.f = P4\y - P1\y
    c.f = (Zp - Matrice()\Profondeur / 2) - P1\z
    f.f = P3\z - P1\z
    i.f = P4\z - P1\z
    y.f = (((c * e * g) - (c * d * h) + (a * f * h) - (a * e * i)) / (f * g - d * i)) + P1\y
  EndIf  
  ProcedureReturn y
P1,P2,P3,P4 c'est les 4 points qui composent ma facette
ma facette est composée de deux triangles
P1,P2,P4
et
P1,P3,P4
Polo
Messages : 612
Inscription : sam. 03/juil./2004 20:14

Message par Polo »

Hmm :oops:
J'ai du mal a comprendre :)
Vé chercher un peu sur le web si je trouve pas des explications :)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

en fait l'équation du plan passant par les points P1(x1,y1,z1) P2(x2,y2,z2) et P3(x3,y3,z3) est
| x -x1 y -y1 z -z1|
| x2-x1 y2-Y1 z2-z2| = 0
| x3-x1 y3-y1 z3-z1|
Polo
Messages : 612
Inscription : sam. 03/juil./2004 20:14

Message par Polo »

Oui, ça je vois, mais j'en fait quoi de l'équation ?
:oops: Désolé, j'ai un peu de mal :)

une fois qu'on a l'équation, en fait, si je me gourre pas, on a le produit scalaire de la direction et de la droite qui passe par le triangle et qui est colinéaire au triangle, non ?
On fait quoi de ce produit scalaire après ?

C'est fort probable que je dise des conneries :D
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

je ne suis pas en mesure de te contredire , tout ce que j'ai utilisé dans ce code , je ne le connaisais pas , j'ai dû faire des recherches sur le net .

J'avais juste l'intuition que l'équation du plan dans l'espace me serait utile , j'ai donc cherché tout ce qui parlait de plans dans l'espace , j'ai fini par trouvé l'équation que je t'ai donné , et j'ai fait mon code à partir de ça , pour le reste ,je ne comprends rien du tout à ce que tu me racontes :)
Polo
Messages : 612
Inscription : sam. 03/juil./2004 20:14

Message par Polo »

ah bon, donc je saurais pas si je disais des conneries ou pas :)
J'ai juste vu que tu faisait xx'+yy'+zz', et il me semble que c'est le produit scalaire d'un vecteur de 3 points :) (je suis pas trop sur remarque :))
Ben, v" aller faire un tour, je verrai cet après midi ton code d'1 peu plus près :)
Si tu retrouves les pages qui t'ont aidé... pense à moi ;)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Je me suis servi de ce théorème pour déterminer sur quel triangle de la facette on se trouve .

http://tanopah.jo.free.fr/seconde/region.html

mais ça tu n'en a pas besoin , puisque tu travailles déjà avec des triangles :)
Polo
Messages : 612
Inscription : sam. 03/juil./2004 20:14

Message par Polo »

BOn, en fait, j'ai dit des conneries juste avant :)
Mais je comprend toujours pas ton code :(

Voila ce que j'ai quand il y a une collision :

entityx(camera),entityy(camera),entityz(camera) - la position de la camera

ax,ay,az,bx,by,bz,cx,cy,cz - les coordonnées du triangle où la collision a été faite

nx,ny,nz - La normale du triangle où la collision a été faite

Je peux faire quoi de ça pour que la camera glisse ?? :)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

ben mon code me permet de déterminer la hauteur d'un point sur une matrice en connaissant x et z , c'est l'équivalent de la commande TerrainHeight() .

pour ton problème , je ne sais pas trop , je pense qu'il faut aussi tenir compte du déplacement de la caméra , un vecteur déplacement et le combiner avec la normale du triangle en collision, ça devrait te donner le sens du déplacement à effectuer et la longueur du déplacement ?
Polo
Messages : 612
Inscription : sam. 03/juil./2004 20:14

Message par Polo »

Ben, vé essayer :)
En tout cas, comme ça me saoulait, j'ai bossé sur mon moteur 3d et ait éliminé quelque bug, comme quoi ç a a du bon de bosser sur les collisions :D
Polo
Messages : 612
Inscription : sam. 03/juil./2004 20:14

Message par Polo »

Salut,
pour que ça soit un peu plus parlant, je te poste un exe avec un "début" de collision : dès qu'une collision est détectée par la librairie, je fait juste :
TranslateEntity(camera,nx,ny,nz)

TranslateEntity change la position de l'entity par rapport à l'ancienne, équivalent de
PositionEntity(camera,entityx(camera)+nx,entityy(camera+ny,entityz(camera)+nz)

Comme tu le vois sur l'exe (si ça marche chez toi :)), en faisant ce système (qui n'est évidemment pas le bon), la camera glisse, comme il faut, sauf que ça "sautille"... Faut que je rajoute quoi maintenant ??

http://mitstudio.free.fr/Test.zip

Merci encore, ddésolé pour toutes ces questions :D
Polo
Messages : 612
Inscription : sam. 03/juil./2004 20:14

Message par Polo »

comtois a écrit :Je me suis servi de ce théorème pour déterminer sur quel triangle de la facette on se trouve .

http://tanopah.jo.free.fr/seconde/region.html

mais ça tu n'en a pas besoin , puisque tu travailles déjà avec des triangles :)
Salut !
J'aurai besoin de savoir comment tu as fait, pour un autre projet ;)
J'ai un peu laissé tombé les collisions pour l'instant, par contre ton truc peut m'intéressé pour autre chose :P
Je comprend pas grand chose à la page que tu m'as passé, mais grâce a ton algorithme, tu obtiens le triangle à partir de quoi exactement ? Juste des valeurs x, y et z ? Si c'est ça, ben ça m'intéresse énormément :)
Répondre