Геометрия как массив структур: points, primitives, vertices, detail
core Читать данные геометрии в Geometry Spreadsheet и определять, на каком уровне (point/prim/vertex/detail) хранится нужный атрибут
Геометрия в Houdini — это не «меш» в смысле «набор треугольников», а набор из четырёх связанных таблиц данных. Если бы ты писал это на C, у тебя было бы что-то вроде массива структур Point pts[N] плюс отдельный массив, описывающий, как эти точки собираются в грани. Houdini формализует это разделение в четыре уровня, и именно с них начинается вся процедурная логика.
| Уровень | Что хранит | Аналогия в C | Кардинальность |
|---|---|---|---|
| Point | позицию и прочие данные точки, обязателен @P |
struct Point { vec3 P; ... }; Point pts[N]; |
N уникальных точек |
| Primitive | грань/кривую/объём, список индексов точек | struct Prim { int ptIdx[]; }; — как index buffer |
M примитивов |
| Vertex | связь primitive↔point + свои данные (UV, нормаль на угол) | index buffer + per-corner payload | K вершин, обычно K > N |
| Detail | глобальные данные всей геометрии, один экземпляр | глобальная переменная/структура | ровно 1 |
Ключевой момент, который ломает интуицию «point = vertex»: точка — это уникальная позиция в пространстве, а вершина — это конкретное использование точки внутри конкретного примитива. Угол куба — это одна точка, но три вершины (по одной на каждую примыкающую грань), потому что на каждой грани у этого угла может быть своя нормаль или UV.
graph TD
D[Detail: 1 экземпляр, глобальные атрибуты] --> P1[Primitive 1]
D --> P2[Primitive 2]
P1 --> V1[Vertex]
P1 --> V2[Vertex]
V1 --> PT1[Point]
V2 --> PT2[Point]
P2 --> V3[Vertex]
V3 --> PT1Количество элементов всегда выводится из параметров генератора: например, Grid с сеткой 10×10 точек даёт 100 точек и 9×9 = 81 примитив-квад. Меняешь параметры узла — меняются массивы данных на выходе.
Geometry Spreadsheet — это не «просмотрщик», а дебаггер данных: у него отдельные вкладки Points / Primitives / Vertices / Detail, и в каждой строка = элемент, столбец = атрибут. Это твой printf для геометрии, только с фильтрами и сортировкой.
Разобранный пример
Задача: понять, почему у стандартного Box SOP 8 точек, но 24 вершины.
Рассуждение: у куба 6 граней (примитивов), каждая — квад из 4 углов. Каждый угол куба физически общий для 3 граней (один @P), но каждая грань видит его как свою собственную вершину, потому что нормаль этой вершины смотрит в направлении данной грани, а не «усреднённо». Поэтому: 6 примитивов × 4 вершины = 24 вершины, но уникальных позиций — только 8. В Geometry Spreadsheet это видно буквально: на вкладке Points — 8 строк, на вкладке Vertices — 24 строки, и у каждой вершины есть ссылка на индекс одной из 8 точек.
Попробуй сейчас
Создай Box SOP, подключи к нему Geometry Spreadsheet. Пройди по вкладкам Points, Primitives, Vertices, Detail и запиши количество строк в каждой. Затем добавь Subdivide SOP после Box и, глядя на Geometry Spreadsheet, предположи, во сколько раз вырастет число точек и примитивов, прежде чем нажать пересчёт.
Ожидаемый результат: 8 points / 6 primitives / 24 vertices / 1 detail на Box; после Subdivide — заметно больше points и primitives, но структура (4 уровня) та же.
Получилось, если…
Ты можешь объяснить без подсказки, почему число вершин у куба (24) не равно числу точек (8), используя слова «точка — уникальная позиция», «вершина — использование точки в примитиве», и без труда переключаешься между вкладками Points / Primitives / Vertices / Detail.
Вывод
Геометрия = 4 плоские таблицы (point/primitive/vertex/detail), связанные индексами, а не одна структура «меш». Geometry Spreadsheet — первый инструмент, который открываешь при любой непонятной ситуации.
AI-generated · source-grounded review
🛡 Fact-checked: 2 risky claims verified · 2 removed · confidence: high · figures: 1
A second opinion has not checked this lesson.
On your own course these buttons answer instantly, quizzes track what you've mastered, and lessons adapt to your gaps. Write my course