Данные.

02_Структура данных Сверчка.

В Сверчке есть документация, она находится в папке ~...addons.../sverchok-master/docs. В этой папке мы строим документацию, отдельно в папке 'nodes' начали описывать узлы. Но есть папка 'old', в которой нам нужен файл 'list_join wiki', кстати вот он. Это текстовой файл, в нём схематично описана структура данных, и все преобразования, которые с данными можно делать. Схема разрабатывалась при проектировании узлов, она может быть полезна пользователю пока не переписана в более внятный формат. На рисунке изображена часть описания.

Перед тем, как приступить к разбору самой иерархии данных, прошу обратить внимание на три основных сокета. Вектор - это вершина, это три координаты, x,y,z, больше ничего. Рёбра и полигоны - это индексы вершин, если индексы превышают количество вершин, оно не работает. Матрица - это объект. Если предыдущие два сокета - это сетка, mesh, то матрица - это объект в блендере. Вот так просто.

Без понимания структуры передаваемых данных вы вряд ли сможете свободно делать геометрию в сверчке. Давайте разберём что есть что, тем более, это достаточно просто. Для примера возьмём матрёшку. Мы все знаем принцип, по которому она работает, это вложенность.

Обычная матрёшка выглядит примерно так, в неё входит не так много "дочек". В данном случае 4 уровня матрёшек, 4 поколения.

Столько же вложений и в данных, передаваемых сверчком между узлами. Создавая серию или передавая векторы, рёбра, грани, матрицы, вы передаёте одинаковую структуру вложений. Но первая матрёшка - это контейнер самих данных, она не несёт в самой себе смысловой нагрузки, и служит только для передачи внутренних частей, её порядковый номер 0. А вот второй уровень нас интересует больше:

Каждая вложенная матрёшка - список, она соответсвует одному объекту. Если предыдущий список был только контейнером, то это является объектом, грубо говоря. И количество списков внутри контейнера - это и есть количество объектов. В програмном коде это выглядит как двойная скобка [[]], где внешняя скобка - контейнер, а внутренние скобки - это объект. Порядковый номер уровня - 1.

Вот так выглядит матрица в узле Viewer Draw:

Если мы откроем объект, то увидим группы матрёшек, эти группы представляют собой последний список, группирующий числа, а значит, он представляет собой ни что иное, как вектор или ребро или грань или одну из четырёх строчек матрицы:

Когда мы пересчитываем этот уровень списков, то количество этих списков будет соответствовать количеству векторов, или количеству рёбер или количеству полигонов, а для матрицы всегда четыре. Порядковый номер этого уровня 2. Важно помнить порядковые номера уровней для пользования инструментами работы со списками.

Вершины объекта в узле Viewer Draw

И вот наконец-то мы подошли к самим числам, это целые или дробные числа, для вектора они являют значения X,Y,Z координат. Для ребра их количество всегда равно двум, и представляет собой индексы, для грани число их может быть бесконечно большим, и тоже представляет собой индексы вершин, которые указаны в оранжевом сокете. И если вы не подключили оранжевый сокет с векторами, то списки рёбер бесполезны, они не сформируют вам поверхность. Во вьювере можно увидеть матрицы, можно вершины, но никогда рёбра сами по себе, как и грани. Если у вас в ребре всего одно значение - то вы не построите ребро никогда. И если индекс вершины в ребре или полигоне-грани превышает количество вершин, то не построите геометрию.

Но учтите, что индексируются вершины и вообще всё в сверчке от нуля, то есть если у вас три вершины, их индексы будут 0,1,2, если же вы дадите тройку на ребро, то геометрия не построится. Матрицы на этом уровне тоже представляют собой числа, дробные числа, и этих чисел всегда четыре. Все манипуляции с абстрактными числами или списками, не относящимися к вершинам или матрицам следует производить через сокет данных, средний зелёный сокет, который несёт обычно рёбра или грани. Порядковый же номер этого уровня - 3.

Давайте взглнем на нашу структуру со стороны, мы увидим всего 4 уровня:

Нулевой - контейнер, первый - объекты, второй - вершины, рёбра, грани и уровни матриц. Третий - числа, целые и дробные.

Вы можете увеличивать или уменьшать количество уровней через узлы ListLevels, а также ListJoin со включённым wrap, через ListZip узел. Списки можно генерировать через Series, обращать через ListReverse, и смещать с ListShift, в разработке ListItem и другие полезные узлы.

Здесь же мы видим представленные данные в тексте. Пользуясь узлом ViewerText, мы сохраняем контроль над данными и если что-то идёт не так, причина становится очевидной. В данном случае это куб, импортирован из блендера, у него 8 вершин, 6 полигонов по четыре индекса, одна матрица. На один объект приходится одна матрица, и если бы было две матрицы - было бы два одинаковых объекта с одной сеткой. Так в сверчке можно множить сетку. На снимке видно, что куб сдвинут по оси Y на 3,4071896076202393 единиц, это записано в матрице, но никак не в сетке объекта, которая сохраняет свои точки относительно локального нуля, то есть относительно матрицы. И если матрица несёт в себе информацию о масштабе, вращении, положении, то они никак не влияют на сетку объекта, а лишь представляют сетку в 3Д пространстве. Кроме того, матрица в Сверчке используется для сечения CrossSection сетки объекта. Сечётся объект относительно плоскости, которую матрица задаёт своими XY локальными осями, то есть поворот и положение матрицы играют здесь решающую роль. Призываю вас экспериментировать с узлами просмотра и генерации в Сверчке.

Да пребудет с вами сила Сверчка.

  • Development!
  • Development!!
  • Development!!!
  • /Steven Anthony Ballmer/
  • Архитектор, дизайнер и Человек...
  • Все права защищены (с)
    • Земля
    • 2013 г.