I\'m writing a game which uses 3D models to draw a scene (top-down orthographic projection), but a 2D physics engine to calculate response to collisions, etc. I have a few 3
Since your meshes are not convex, the resulting cross-section may be disconnected, so actually consist of multiple polygons. This means that every triangle must be checked, so you'll need at least O(n) operations for n triangles.
Here's one way to do it:
T <- the set of all triangles
P <- {}
while T is not empty:
t <- some element from T
remove t from T
if t intersects the plane:
l <- the line segment that is the intersection between t and the plane
p <- [l]
s <- l.start
while l.end is not s:
t <- the triangle neighbouring t on the edge that generated l.end
remove t from T
l <- the line segment that is the intersection between t and the plane
append l to p
add p to P
This will run in O(n) time for n triangles, provided that your triangles have pointers to their three neighbours, and that T
supports constant-time removals (e.g. a hash set).
As with all geometric algorithms, the devil is in the details. Think carefully about cases where a triangle's vertex is exactly in the plane, for example.