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.
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
|