TrianglesIntersect()?
Blitz3D Forums/Blitz3D Programming/TrianglesIntersect()?
| ||
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 |