This requires my 3D math library, available at www.leadwerks.com/code. It will split any mesh along an arbitrary plane, creating two new meshes. Triangle normals are retained, but the new mesh will be pretty segmented. A WeldMesh() function is coming next to merge the vertices back into an optimized mesh.
This is useful for CSG, BSP, and I myself am going to be using this for real-time shadows.
This is useful for CSG, BSP, and I myself am going to be using this for real-time shadows.
nx#=0.5 ny#=-0.5 nz#=1 d#=0 Graphics3D 800,600,16,2 Global resulta,resultb cam=CreateCamera() CameraClsColor cam,255,255,255 TurnEntity cam,45,45,0 MoveEntity cam,0,0,-15 m=LoadMesh("car.x") EntityColor m,255,0,0 sliceplane=CreateCube() ScaleMesh sliceplane,6,6,0 EntityAlpha sliceplane,0.5 EntityColor sliceplane,200,200,200 EntityFX sliceplane,1 AlignToVector sliceplane,nx,ny,nz,3 CreateLight() RenderWorld Flip WaitKey splitmesh m,nx,ny,nz,d FreeEntity m EntityColor resulta,0,255,0 EntityColor resultb,0,0,255 EntityParent resulta,sliceplane EntityParent resultb,sliceplane While Not KeyHit(1) TurnEntity sliceplane,0,1,0,True MoveEntity resulta,0,0,0.01 MoveEntity resultb,0,0,-0.01 RenderWorld Text 0,0,split Flip Wend Function SplitMesh(m,nx#,ny#,nz#,d#) resulta=CreateMesh() resultb=CreateMesh() For s=1 To CountSurfaces(m) surf=GetSurface(m,s) surfa=CreateSurface(resulta) surfb=CreateSurface(resultb) SplitSurface(surf,surfa,surfb,nx,ny,nz,d) Next End Function Function SplitSurface(surf,surfa,surfb,nx#,ny#,nz#,d#) For t=0 To CountTriangles(surf)-1 A=TriangleVertex(surf,t,0) B=TriangleVertex(surf,t,1) C=TriangleVertex(surf,t,2) SplitTriangle(surfa,surfb,VertexX(surf,A),VertexY(surf,A),VertexZ(surf,A),VertexX(surf,B),VertexY(surf,B),VertexZ(surf,B),VertexX(surf,C),VertexY(surf,C),VertexZ(surf,C),nx,ny,nz,d) Next End Function Function SplitTriangle(surfa,surfb,Ax#,Ay#,Az#,Bx#,By#,Bz#,Cx#,Cy#,Cz#,nx#,ny#,nz#,d#) pa#=PointOnPlane(ax,ay,az,nx,ny,nz,d) pb#=PointOnPlane(bx,by,bz,nx,ny,nz,d) pc#=PointOnPlane(cx,cy,cz,nx,ny,nz,d) If Sgn(pa)=Sgn(pb) And Sgn(pb)=Sgn(pc) If pa>0.0 A=AddVertex(surfa,ax,ay,az) B=AddVertex(surfa,bx,by,bz) C=AddVertex(surfa,cx,cy,cz) AddTriangle surfa,a,b,c Else A=AddVertex(surfb,ax,ay,az) B=AddVertex(surfb,bx,by,bz) C=AddVertex(surfb,cx,cy,cz) AddTriangle surfb,a,b,c EndIf Return False EndIf If Sgn(pa)=Sgn(pb);AB|C If pa<0.0 surf=surfa surfa=surfb surfb=surf EndIf RayIntersectsPlane(ax,ay,az,cx,cy,cz,nx,ny,nz,d) dx#=VectorX() dy#=VectorY() dz#=VectorZ() RayIntersectsPlane(bx,by,bz,cx,cy,cz,nx,ny,nz,d) ex#=VectorX() ey#=VectorY() ez#=VectorZ() A=AddVertex(surfa,ax,ay,az) B=AddVertex(surfa,bx,by,bz) C=AddVertex(surfb,cx,cy,cz) D=AddVertex(surfa,Dx,Dy,Dz) E=AddVertex(surfa,Ex,Ey,Ez) AddTriangle surfa,D,A,B AddTriangle surfa,D,B,E D=AddVertex(surfb,Dx,Dy,Dz) E=AddVertex(surfb,Ex,Ey,Ez) AddTriangle surfb,C,D,E ElseIf Sgn(pa)=Sgn(pc);AC|B If pa<0.0 surf=surfa surfa=surfb surfb=surf EndIf RayIntersectsPlane(ax,ay,az,bx,by,bz,nx,ny,nz,d) dx#=VectorX() dy#=VectorY() dz#=VectorZ() RayIntersectsPlane(bx,by,bz,cx,cy,cz,nx,ny,nz,d) ex#=VectorX() ey#=VectorY() ez#=VectorZ() A=AddVertex(surfa,ax,ay,az) B=AddVertex(surfb,bx,by,bz) C=AddVertex(surfa,cx,cy,cz) D=AddVertex(surfa,Dx,Dy,Dz) E=AddVertex(surfa,Ex,Ey,Ez) AddTriangle surfa,A,D,C AddTriangle surfa,D,E,C D=AddVertex(surfb,Dx,Dy,Dz) E=AddVertex(surfb,Ex,Ey,Ez) AddTriangle surfb,B,E,D ElseIf Sgn(pb)=Sgn(pc);BC|A If pa>0.0 surf=surfa surfa=surfb surfb=surf EndIf RayIntersectsPlane(ax,ay,az,cx,cy,cz,nx,ny,nz,d) dx#=VectorX() dy#=VectorY() dz#=VectorZ() RayIntersectsPlane(bx,by,bz,ax,ay,az,nx,ny,nz,d) ex#=VectorX() ey#=VectorY() ez#=VectorZ() A=AddVertex(surfb,ax,ay,az) B=AddVertex(surfa,bx,by,bz) C=AddVertex(surfa,cx,cy,cz) D=AddVertex(surfa,Dx,Dy,Dz) E=AddVertex(surfa,Ex,Ey,Ez) AddTriangle surfa,B,C,D AddTriangle surfa,B,D,E D=AddVertex(surfb,Dx,Dy,Dz) E=AddVertex(surfb,Ex,Ey,Ez) AddTriangle surfb,A,E,D EndIf Return True End Function