VoronoiFaces3D[pts_]:=Block[{minmax,padding,vpts,dm,prims,vnodes,conn,adj,vlines,mr1d,linepairs,normals,planar,faces},minmax=MinMax/@Transpose[pts];padding=Abs[Subtract@@@minmax];vpts=Join[pts,(minmax[[All,1]]-padding)IdentityMatrix[3],(minmax[[All,2]]+padding)IdentityMatrix[3]];dm=DelaunayMesh[vpts];prims=MeshPrimitives[dm,3,"Multicells"True][[1,1]];vnodes=First@*Circumsphere/@prims;conn=dm["ConnectivityMatrix"[3,2]];adj=conn.Transpose[conn];vlines=UpperTriangularize[adj,1]["NonzeroPositions"];mr1d=Quiet@MeshRegion[vnodes,Line[vlines]];conn=mr1d["ConnectivityMatrix"[0,1]];adj=Unitize[conn.Transpose[conn]]-IdentityMatrix[Length[conn],SparseArray];linepairs=Catenate[Insert[#1,2]/@Subsets[{##2},{2}]&@@@adj["MatrixColumns"]];normals=lpNormals[vnodes,linepairs];planar=GatherByList[linepairs,Round[normals,10^-8.]];(*thisismightnotworkforadjacentcoplanarfaces...*)faces=FindFundamentalCycles[Apply[UndirectedEdge,Catenate[Union@@@validEdges[planar,Range[Length[planar]]]],{1}]][[All,All,1,1]];Thread[Polygon[faces]/.Dispatch[Thread[Range[Length[vnodes]]vnodes]]]](*functionintroducedbelow*)GatherByList[list_,representatives_]:=Module[{func},func/:Map[func,_]:=representatives;GatherBy[list,func]]lpNormals=Compile[{{coords,_Real,2},{lp,_Integer,1}},Module[{cross,sgn},cross=Cross[coords[[lp[[2]]]]-coords[[lp[[1]]]],coords[[lp[[3]]]]-coords[[lp[[1]]]]];cross=cross/Sqrt[cross.cross];sgn=Sign[First[cross]];If[sgn0,sgn=Sign[cross[[2]]]];If[sgn0,sgn=Sign[cross[[3]]]];sgn*cross],RuntimeAttributes{Listable},CompilationTarget"C",ParallelizationTrue,RuntimeOptions"Speed"];validEdges=Compile[{{inds,_Integer,1},{k,_Integer}},Module[{i1,i2,i3},i1=inds[[1]];i2=inds[[2]];i3=inds[[3]];Which[i1>i2&&i3>i2,{{{i2,k},{i1,k}},{{i2,k},{i3,k}}},i2>i1&&i3>i2,{{{i1,k},{i2,k}},{{i2,k},{i3,k}}},i1>i2&&i2>i3,{{{i2,k},{i1,k}},{{i3,k},{i2,k}}},True,{{{i1,k},{i2,k}},{{i3,k},{i2,k}}}]],RuntimeAttributes{Listable},CompilationTarget"C",ParallelizationTrue,RuntimeOptions"Speed"];