TrianglesIntersect()?

Blitz3D Forums/Blitz3D Programming/TrianglesIntersect()?

JoshK(Posted 2005) [#1]
Does anyone have code for the intersection of two triangles?

This could be reduced to the intersection of a ray (AB) and a triangle (CDE).

I found some code in the archive. This should work:
Function RayIntersectsTriangle%(Px#,Py#,Pz#,Dx#,Dy#,Dz#,V0x#,V0y#,V0z#,V1x#,V1y#,V1z#,V2x#,V2y#,V2z#,Extend_To_Infinity=True,Cull_Backfaces=False)
E1x#=V2x#-V0x#
E1y#=V2y#-V0y#
E1z#=V2z#-V0z#
E2x#=V1x#-V0x#
E2y#=V1y#-V0y#
E2z#=V1z#-V0z#
Hx#=(Dy#*E2z#)-(E2y#*Dz#)
Hy#=(Dz#*E2x#)-(E2z#*Dx#)
Hz#=(Dx#*E2y#)-(E2x#*Dy#)
A#=(E1x#*Hx#)+(E1y#*Hy#)+(E1z#*Hz#)
If (Cull_Backfaces=True) And (A#>=0) Return False
If (A#>-0.00001) And (A#<0.00001) Return False
F#=1.0/A#
Sx#=Px#-V0x#
Sy#=Py#-V0y#
Sz#=Pz#-V0z#
U#=F#*((Sx#*Hx#)+(Sy#*Hy#)+(Sz#*Hz#))
If (U#<0.0) Or (U#>1.0) Return False
Qx#=(Sy#*E1z#)-(E1y#*Sz#)
Qy#=(Sz#*E1x#)-(E1z#*Sx#)
Qz#=(Sx#*E1y#)-(E1x#*Sy#)
V#=F#*((Dx#*Qx#)+(Dy#*Qy#)+(Dz#*Qz#))
If (V#<0.0) Or (U#+V#>1.0) Return False
T#=F#*((E2x#*Qx#)+(E2y#*Qy#)+(E2z#*Qz#))
If T#<0.0 Return False
If (Extend_To_Infinity=False) And (T#>1.0) Return False	
Return True
End Function

Function TrianglesIntersect%(A0x#,A0y#,A0z#,A1x#,A1y#,A1z#,A2x#,A2y#,A2z#,B0x#,B0y#,B0z#,B1x#,B1y#,B1z#,B2x#,B2y#,B2z#)
If RayIntersectsTriangle(A0x#,A0y#,A0z#,A1x#,A1y#,A1z#,B0x#,B0y#,B0z#,B1x#,B1y#,B1z#,B2x#,B2y#,B2z#,False) Return True
If RayIntersectsTriangle(A0x#,A0y#,A0z#,A2x#,A2y#,A2z#,B0x#,B0y#,B0z#,B1x#,B1y#,B1z#,B2x#,B2y#,B2z#,False) Return True
If RayIntersectsTriangle(A2x#,A2y#,A2z#,A1x#,A1y#,A1z#,B0x#,B0y#,B0z#,B1x#,B1y#,B1z#,B2x#,B2y#,B2z#,False) Return True
If RayIntersectsTriangle(B0x#,B0y#,B0z#,B1x#,B1y#,B1z#,A0x#,A0y#,A0z#,A1x#,A1y#,A1z#,A2x#,A2y#,A2z#,False) Return True
If RayIntersectsTriangle(B0x#,B0y#,B0z#,B2x#,B2y#,B2z#,A0x#,A0y#,A0z#,A1x#,A1y#,A1z#,A2x#,A2y#,A2z#,False) Return True
If RayIntersectsTriangle(B2x#,B2y#,B2z#,B1x#,B1y#,B1z#,A0x#,A0y#,A0z#,A1x#,A1y#,A1z#,A2x#,A2y#,A2z#,False) Return True
End Function