曲面细分器

在 1.9.0 版本加入.

_images/tesselator-filled.png _images/tesselator-debug.png

警告

此功能目前处于实验阶段,只要此警告提示存在,其内容就可能发生变化。目前仅支持 TYPE_POLYGONS。

Tesselator 是一个用于多边形镶嵌的库,基于 libtess2。它通过先将凹多边形镶嵌为凸多边形来渲染填充的凹多边形,并且还支持孔洞。

用法

首先,你需要创建一个 Tesselator 对象并添加轮廓。第一个轮廓是你的形状的外部轮廓,而所有后续的轮廓则应为孔洞::

from kivy.graphics.tesselator import Tesselator

tess = Tesselator()
tess.add_contour([0, 0, 200, 0, 200, 200, 0, 200])
tess.add_contour([50, 50, 150, 50, 150, 150, 50, 150])

其次,调用 Tesselator.tesselate() 方法来计算点。有可能细分器无法正常工作,在这种情况下,它可能返回 False:

if not tess.tesselate():
    print("Tesselator didn't work :(")
    return

在细分之后,你有多种方式遍历结果。最佳方法是使用 Tesselator.meshes 获取可直接用于 Mesh 的格式:

for vertices, indices in tess.meshes:
    self.canvas.add(Mesh(
        vertices=vertices,
        indices=indices,
        mode="triangle_fan"
    ))

或者,您可以通过 Tesselator.vertices() 获取“原始”结果,其中仅包含多边形及 x/y 坐标::

for vertices in tess.vertices:
    print("got polygon", vertices)
class kivy.graphics.tesselator.Tesselator

基类:object

Tesselator 类。有关用法的更多信息,请参阅模块。

add_contour(self, points)

向镶嵌器中添加一个轮廓。它可以是:

  • 一个 [x, y, x2, y2, ...] 坐标列表

  • 一个浮点数组:array("f", [x, y, x2, y2, ...])

  • 任何包含浮点数的缓冲区。

element_count

返回凸多边形的数量。

meshes

遍历 tesselate() 的结果,以生成一个可以轻松推入 Kivy 的 Mesh 对象的结果。

这是一个列表,格式为:[[vertices, indices], [vertices, indices], ...]。其中顶点格式为 [x, y, u, v, x2, y2, u2, v2]

注意,u/v坐标与x/y坐标相同。如果需要用于纹理映射,您需要自行更改它们。

你可以像这样创建Mesh对象:

tess = Tesselator()
# add contours here
tess.tesselate()
for vertices, indices in self.meshes:
    self.canvas.add(Mesh(
        vertices=vertices,
        indices=indices,
        mode="triangle_fan"))
tesselate(self, int winding_rule=WINDING_ODD, int element_type=TYPE_POLYGONS, int polysize=65535) int

计算所有通过 add_contour() 添加的轮廓,并生成多边形。

参数:
winding_rule:枚举

绕数规则根据区域的绕数是否属于所选类别来判定其是否在内部。可选值包括 WINDING_ODD、WINDING_NONZERO、WINDING_POSITIVE、WINDING_NEGATIVE、WINDING_ABS_GEQ_TWO。默认值为 WINDING_ODD。

element_type:枚举

结果类型,您可以使用TYPE_POLYGONS生成多边形,或使用TYPE_BOUNDARY_CONTOURS生成轮廓。默认值为TYPE_POLYGONS。

返回:

如果进行了细分,则为1;否则为0。

返回类型:

int

vertex_count

返回生成的顶点数量。

这是原始结果,然而,由于Tesselator会以每个多边形的 meshesvertices 格式为您处理结果,因此结果中会有更多的顶点。

vertices

遍历 tesselate() 的结果,以仅提供 [x, y, x2, y2, ...] 多边形列表。