平面切割--FMeshPlaneCut
平面定义: 面上一个点 + 法线
算法流程如下
求几何体所有顶点和面的有向距离(Signs)
Sign计算:
float Sign = (VertexPos - PlaneOrigin).Dot(PlaneNormal);
遍历所有几何体所有交叉边, 进行SplitEdge
对于位于切割面两侧的交叉边(SignA和SignB符号相异),进行按比例SplitEdge
Split比例计算:
const double DistA = Signs[EdgeV.A];
const double DistB = Signs[EdgeV.B];
double Param = DistA / (DistA - DistB);
对几何体进行SplitEdge分为两种情况
EMeshResult SplitEdge(int EdgeAB, FEdgeSplitInfo& SplitInfo, double SplitParameterT = 0.5);
边界边按比例切割
非边界边比例切割
切割得到新的顶点(位置,法线,UV, 颜色等)计算
按Edge切割距离比例对两端顶点进行Lerp计算得到新的顶点信息
剔除Sign为正的所有顶点,切割完成
FMeshPlaneCut代码使用案例
FMeshPlaneCut Cut(&EditMesh, CutPlaneOrigin, PlaneNormal);
Cut.UVScaleFactor = 1.0 / Options.UVWorldDimension;
bSuccess = Cut.Cut();
资料参考
[1]UE5.5 FMeshPlaneCut.