Версия 2.1.0

Quick search

Table Of Contents

Tesselator

Новое в версии 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 не работает :(")
    return

После тесселяции у вас есть несколько способов итерации по результату. Лучший подход - использование Tesselator.meshes для получения формата, который можно легко использовать в объекте Mesh Kivy:

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

Или вы можете получить "сырой" результат, содержащий только многоугольники и координаты x/y, с помощью Tesselator.vertices():

for vertices in tess.vertices:
    print("получен многоугольник", vertices)
class kivy.graphics.tesselator.Tesselator

Базовый класс: builtins.object

Класс Tesselator. См. модуль для получения дополнительной информации о использовании.

add_contour(points)

Добавить контур в тесселирователь. Это может быть:

  • список координат [x, y, x2, y2, …]

  • массив с плавающей запятой: array("f", [x, y, x2, y2, …])

  • любой буфер с плавающей запятой.

element_count

Возвращает количество выпуклых многоугольников.

meshes

Итерация по результату tesselate() для предоставления результата, который можно легко передать в объект Mesh Kivy.

Это список: [[vertices, indices], [vertices, indices], …]. Вершины в формате [x, y, u, v, x2, y2, u2, v2].

Будьте осторожны, координаты u/v такие же, как x/y. Вы должны изменить их для настройки текстурного сопоставления, если это необходимо.

Вы можете создавать объекты Mesh следующим образом:

tess = Tesselator()
# добавьте контуры здесь
tess.tesselate()
for vertices, indices in self.meshes:
    self.canvas.add(Mesh(
        vertices=vertices,
        indices=indices,
        mode="triangle_fan"))
tesselate(int winding_rule=WINDING_ODD, int element_type=TYPE_POLYGONS, int polysize=65535) int

Вычислить все контуры, добавленные с помощью add_contour(), и сгенерировать многоугольники.

Parameters
winding_rule: enum

Правило намотки классифицирует область как внутреннюю, если ее число намоток принадлежит выбранной категории. Может быть одним из WINDING_ODD, WINDING_NONZERO, WINDING_POSITIVE, WINDING_NEGATIVE, WINDING_ABS_GEQ_TWO. По умолчанию WINDING_ODD.

element_type: enum

Тип результата, можно генерировать многоугольники с помощью TYPE_POLYGONS или контуры с помощью TYPE_BOUNDARY_CONTOURS. По умолчанию TYPE_POLYGONS.

Returns

1, если произошла тесселяция, 0 в противном случае.

Return type

int

vertex_count

Возвращает количество созданных вершин.

Это сырой результат, однако, так как Tesselator форматирует результат для вас с помощью meshes или vertices для каждого многоугольника, в результате будет больше вершин.

vertices

Итерация по результату tesselate() для получения только списка многоугольников в формате [x, y, x2, y2, …].