Page 1 sur 1
Collision 3D
Publié : sam. 05/févr./2005 10:26
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

Publié : sam. 05/févr./2005 10:42
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 ..

Publié : sam. 05/févr./2005 10:49
par Polo
euh... t'aurais pas un bout de code là ? parce dès qu'on parle de maths, je suis bcp moins fort

Publié : sam. 05/févr./2005 11:01
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
Publié : sam. 05/févr./2005 11:05
par Polo
Hmm
J'ai du mal a comprendre

Vé chercher un peu sur le web si je trouve pas des explications

Publié : sam. 05/févr./2005 11:08
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|
Publié : sam. 05/févr./2005 11:17
par Polo
Oui, ça je vois, mais j'en fait quoi de l'équation ?

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

Publié : sam. 05/févr./2005 11:22
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

Publié : sam. 05/févr./2005 11:29
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

Publié : sam. 05/févr./2005 11:52
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

Publié : sam. 05/févr./2005 16:56
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 ??

Publié : dim. 06/févr./2005 0:15
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 ?
Publié : dim. 06/févr./2005 10:23
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

Publié : dim. 06/févr./2005 12:05
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

Publié : dim. 15/mai/2005 20:05
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
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
