如何在SFML中绘制带褶皱边缘的填充多边形?
在SFML中绘制带褶皱边缘的填充多边形
核心问题分析
LineStrip仅负责绘制连续轮廓,本身不支持填充,所以只能看到形状但无法填充。TriangleStrip依赖特定的顶点顺序,仅适合绘制连续的条带状三角形区域,直接复用LineStrip的顶点顺序会导致凹多边形(你的褶皱形状属于凹多边形)出现错误的填充,丢失褶皱区域或产生凹陷。Triangles需要明确指定每个三角形的三个顶点,若顶点顺序或拆分逻辑错误,会出现混乱的绘制结果。
可行解决方案
方案1:手动三角剖分(适合简单褶皱形状)
你的目标形状可以拆分为3个独立的三角形,通过sf::Triangles类型的VertexArray实现填充。以下是对应你给出的顶点的代码:
sf::VertexArray filledShape(sf::Triangles, 9); // 三角形1:矩形右上区域 filledShape[0] = sf::Vector2f(10.f, 20.f); filledShape[1] = sf::Vector2f(110.f, 20.f); filledShape[2] = sf::Vector2f(110.f, 120.f); // 三角形2:矩形左下基础区域 filledShape[3] = sf::Vector2f(10.f, 20.f); filledShape[4] = sf::Vector2f(110.f, 120.f); filledShape[5] = sf::Vector2f(10.f, 120.f); // 三角形3:褶皱凹陷区域 filledShape[6] = sf::Vector2f(10.f, 20.f); filledShape[7] = sf::Vector2f(10.f, 120.f); filledShape[8] = sf::Vector2f(80.f, 80.f); // 可选:统一设置填充颜色 for (auto& vertex : filledShape) { vertex.color = sf::Color::DarkBlue; }
绘制时直接将这个VertexArray传给窗口的draw方法即可,会得到带褶皱的填充多边形。
方案2:自动三角剖分库(适合复杂多褶皱形状)
如果你的形状有多个褶皱或更复杂的凹陷,手动剖分效率低,可以使用Poly2Tri这类专门的三角剖分库:
- 导入你的多边形顶点(注意顶点需按顺时针/逆时针顺序排列)
- 调用库的剖分接口生成三角形集合
- 将生成的每个三角形的三个顶点依次添加到SFML的
VertexArray中
为什么你的TriangleStrip尝试失败?
TriangleStrip的绘制逻辑是每新增一个顶点,就和前两个顶点组成新三角形(比如顶点0-1-2、1-2-3、2-3-4、3-4-5)。你的顶点顺序会导致生成的三角形覆盖掉褶皱区域,或者产生反向的填充面,无法正确匹配你想要的褶皱形状。对于凹多边形,调整顶点顺序适配TriangleStrip的成本远高于手动剖分。
内容的提问来源于stack exchange,提问作者KitChaos
相关产品推荐
相关产品推荐

