我正在尝试为由 3 个向量位置组成的多边形实现裁剪算法。这个多边形被 3d 空间中的一个平面裁剪。
我遇到的问题是,在裁剪过程中,裁剪位置的缓冲区有时没有完全填满。函数完成后,裁剪多边形的位置少于 3 个并且可能为零个位置。
void
SplitPolygon(const polygon& Poly, vec4 SplitPlane, std::vector<polygon>& FrontPolygons, std::vector<polygon> BackPolygons)
{
uint32_t NumFront = 0, NumBack = 0;
std::vector<vec3> FrontVerts;
std::vector<vec3> BackVerts;
vec4 TempA = Poly.V[2].Pos;
vec3 A = TempA.xyz;
uint32_t ASide = ClassifyPointToPlane(A, SplitPlane);
for(int VertIdx = 0;
VertIdx < 3;
++VertIdx)
{
vec4 TempB = Poly.V[VertIdx].Pos;
vec3 B = TempB.xyz;
uint32_t BSide = ClassifyPointToPlane(B, SplitPlane);
if(BSide == POINT_IN_FRONT_OF_PLANE)
{
if(ASide == POINT_BEHIND_PLANE)
{
vec3 IntersectionP = EdgePlaneIntersection(B, A, SplitPlane);
//assert(ClassifyPointToPlane(IntersectionP, SplitPlane) == POINT_ON_PLANE);
FrontVerts.push_back(IntersectionP);
BackVerts.push_back(IntersectionP);
}
else if(ASide == POINT_ON_PLANE || ASide == POINT_IN_FRONT_OF_PLANE)
{
FrontVerts.push_back(A);
}
FrontVerts.push_back(B);
}
else if(BSide == POINT_BEHIND_PLANE)
{
if(ASide == POINT_IN_FRONT_OF_PLANE)
{
vec3 IntersectionP = EdgePlaneIntersection(A, B, SplitPlane);
//assert(ClassifyPointToPlane(IntersectionP, SplitPlane) == POINT_ON_PLANE);
FrontVerts.push_back(IntersectionP);
BackVerts.push_back(IntersectionP);
}
else if(ASide == POINT_ON_PLANE)
{
BackVerts.push_back(A);
}
else
{
BackVerts.push_back(A);
}
BackVerts.push_back(B);
}
else
{
FrontVerts.push_back(B);
if(ASide == POINT_BEHIND_PLANE)
{
BackVerts.push_back(B);
}
else if(ASide == POINT_ON_PLANE || ASide == POINT_IN_FRONT_OF_PLANE)
{
FrontVerts.push_back(A);
}
A = B;
ASide = BSide;
}
}
// NOTE: Filling out polygon data
static uint32_t QuadIndices[6] = {0, 1, 2, 3, 2, 0};
uint32_t FrontSize = FrontVerts.size() == 3 ? 1 : 2;
uint32_t BackSize = BackVerts.size() == 3 ? 1 : 2;
polygon NewPolygon = {};
for(uint32_t i = 0;
i < FrontSize;
++i)
{
for(uint32_t j = 0;
j < (FrontVerts.size() & 3);
++j)
{
NewPolygon.V[j].Pos = vec4(FrontVerts[QuadIndices[i*2+j]], 1);
NewPolygon.V[j].Norm = Poly[0].Norm;
NewPolygon.V[j].Col = Poly[0].Col;
}
FrontPolygons.push_back(NewPolygon);
}
for(uint32_t i = 0;
i < BackSize;
++i)
{
for(uint32_t j = 0;
j < (BackVerts.size() & 3);
++j)
{
NewPolygon.V[j].Pos = vec4(BackVerts[QuadIndices[i*2+j]], 1);
NewPolygon.V[j].Norm = Poly[0].Norm;
NewPolygon.V[j].Col = Poly[0].Col;
}
BackPolygons.push_back(NewPolygon);
}
}
基本上,我想要最少的完全填充的三元组位置,以便进一步的计算是正确的。谢谢