目录
曲面细分器¶
在 1.9.0 版本加入.
警告
此功能目前处于实验阶段,只要此警告提示存在,其内容就可能发生变化。目前仅支持 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¶
基类:
objectTesselator 类。有关用法的更多信息,请参阅模块。
- 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
- vertices¶
遍历
tesselate()的结果,以仅提供 [x, y, x2, y2, ...] 多边形列表。