Comme promis voici un petit code qui permet de faire deux test sur une boite englobante.
Savoir si un point se trouve dedans (facile), et savoir si il y a une intersection entre une droite
et la boite. C'est une adaptation d'un code Irrlicht. Pour l'intersection entre une droite et un triangle, le code
que je fournie dans le post dont je donne le lien au dessus marche bien, il donne en plus les
coordonnées de traversé du triangle par le vecteur.
code:
Code : Tout sélectionner
Structure VECTOR3
x.f
y.f
z.f
EndStructure
Macro VECTOR3_(dest,v1,v2,v3)
dest\x = v1
dest\y = v2
dest\z = v3
EndMacro
Structure AABBOX
min.VECTOR3
max.VECTOR3
EndStructure
Macro AABBOX_(dest,minx, miny, minz, maxx, maxy, maxz)
dest\min\x = minx
dest\min\y = miny
dest\min\z = minz
dest\max\x = maxx
dest\max\y = maxy
dest\max\z = maxz
EndMacro
Procedure.l isPointInside( *ab.AABBOX, px.f, py.f, pz.f)
If ( px>= *ab\min\x And px<= *ab\max\x)
If ( py>= *ab\min\y And py<= *ab\max\y)
If ( pz>= *ab\min\z And pz<= *ab\max\z)
ProcedureReturn 1
EndIf
EndIf
EndIf
ProcedureReturn 0
EndProcedure
Procedure.l intersectWithLine( *ab.AABBOX, x1.f, y1.f, z1.f, x2.f, y2.f, z2.f)
; prend le milieu de la ligne
Protected middle.VECTOR3
Protected line_vect.VECTOR3
Protected halflength.f
Protected e.VECTOR3
Protected t.VECTOR3
; point milieu
middle\x = (x1 + x2)/2.0
middle\y = (y1 + y2)/2.0
middle\z = (z1 + z2)/2.0
; vecteur
line_vect\x = x2-x1
line_vect\y = y2-y1
line_vect\z = z2-z1
; normalize
length.f = (line_vect\x * line_vect\x) + (line_vect\y * line_vect\y) + (line_vect\z * line_vect\z)
If length=0 : ProcedureReturn 0 : EndIf
length = 1.0 / Sqr( length )
line_vect\x = line_vect\x * length
line_vect\y = line_vect\y * length
line_vect\z = line_vect\z * length
; calcul de halflength
halflength = Sqr( ((x1-x2)*(x1-x2)) + ((y1-y2)*(y1-y2)) + ((z1-z2)*(z1-z2)) ) / 2.0
; nous avons: middle/ line_vect / halflength
e\x = (*ab\max\x - *ab\min\x)*0.5
e\y = (*ab\max\y - *ab\min\y)*0.5
e\z = (*ab\max\z - *ab\min\z)*0.5
t\x = ((*ab\max\x + *ab\min\x)*0.5)-middle\x
t\y = ((*ab\max\y + *ab\min\y)*0.5)-middle\y
t\z = ((*ab\max\z + *ab\min\z)*0.5)-middle\z
If Abs(t\x) > e\x + halflength * Abs(line_vect\x)
ProcedureReturn 0
EndIf
If Abs(t\y) > e\y + halflength * Abs(line_vect\y)
ProcedureReturn 0
EndIf
If Abs(t\z) > e\z + halflength * Abs(line_vect\z)
ProcedureReturn 0
EndIf
r.f = e\y * Abs(line_vect\z) + e\z * Abs(line_vect\y)
If Abs( t\y * line_vect\z - t\z*line_vect\y) > r
ProcedureReturn 0
EndIf
r.f = e\x * Abs(line_vect\z) + e\z * Abs(line_vect\x)
If Abs( t\z * line_vect\x - t\x*line_vect\z) > r
ProcedureReturn 0
EndIf
r.f = e\x * Abs(line_vect\y) + e\y * Abs(line_vect\x)
If Abs( t\x * line_vect\y - t\y*line_vect\x) > r
ProcedureReturn 0
EndIf
ProcedureReturn 1
EndProcedure
;===========================
; tests:
;===========================
Global box.AABBOX
; test pour la fonction isPointInside
AABBOX_(box, -2,-2,-2, 2,3,4)
Debug isPointInside( @box, 0,0,0)
Debug isPointInside( @box, 2,3,5)
Debug isPointInside( @box, -2.5,0,0)
; test pour la fonction intersectWithLine
AABBOX_(box, -2,-2,-2, 2,2,2)
Debug intersectWithLine( @box, -4,2,0,4,0,0)
Debug intersectWithLine( @box, 0,5,3, 0,-5,2)
A tester, j'ai pas vraiment poussé les essais du code ci-dessus

(PS: ce tuto t'aurais-t-il inspiré ?
ray tracer interactif)