В записи “Считаем угол между ребрами при помощи Blender Geometry Nodes” меня спросили, как быть в более общем случае, когда из одной точки меша выходят несколько ребер? Эту задачу так же возможно решить с помощью Geometry Nodes, однако подход к решению здесь требуется немного другой.
Для начала из того дерева нодов, которое у нас уже имеется, выделим основную часть, для определения угла по трем точкам и обернем ее в нодовую группу (Ctrl + g). Назовем ее “angle_by_3_points”.
На вход нашей нодовой группы подаются координаты векторов трех точек, а на выходе мы получаем угол между ними в градусах. Обратите внимание, что порядок подключения точек на вход группы важен! Средняя точка (та, которая как раз угловая) должна подключаться в средний сокет группы. Иначе результат подсчета будет неверный.
Теперь в новой сцене создадим какой-нибудь простой меш, однако имеющий точки, к которым прилегает больше двух ребер.
Назначим на него модификатор Geometry Nodes и создадим начальное нодовое дерево.
В отличие от предыдущего варианта, здесь мы не можем начинать работу с индексов точек. Мы не знаем порядка следования ребер, прилегающих к каждому конкретному вертексу меша, и поэтому не можем однозначно определить угол отталкиваясь только от вертекса.
Нам нужно отталкиваться именно от угла. И здесь нам поможет нод Edges of Corners, который как раз работает в домене Face Corner – углы полигона.
Добавим этот нод в нодовое дерево (shift + a – Mesh – Topology – Edges of Corner). На входе этот нод получает индекс угла полигона, а на выходе выдает индексы двух ребер, которые собственно и образуют данный угол.
Добавим также нод Index (shift + a – Geometry – Read – Index) и подключим его на вход нода Edges of Corner.
Для просмотра результатов добавим нод Viewer (shift + a – Output – Viewer), откроем дополнительную рабочую область Spreadsheet. И для нода и для Spreadsheet переключимся в работу с доменом Face Corners, чтобы получить привязку результатов работы, как нам требуется – к углам полигонов.
Теперь мы для каждого угла имеем ссылки на оба ребра, которые его образуют. Остается перейти от индексов ребер к координатам.
Для получения координат, как и прежде, мы будем использовать нод Position. Добавим его в нодовое дерево (shift + a – Geometry – Read – Position).
Чтобы получить координаты по индексам ребер, воспользуемся нодом Evaluate at Index. Он возвращает нам поданное на вход значение для указанного индекса. Добавим этот нод в нодовое дерево (shift + a – Utilities – Field – Evaluate at Index).
В сокет Value подключим значение с выходного сокета нода Position, а в сокет Index – значение индекса одного из ребер угла, которые мы получаем на выходе нода Edges of Corners.
Чтобы нод выдавал нам правильный результат, переключим его в режим работы Vector – Edges.
Теперь для каждого угла мы имеем координату точки одного из образующих этот угол ребер.
Сделаем копию нода Evaluate at Index (shift + d) и подадим на него индекс второго ребра с нода Edges of Corner.
Теперь у нас есть координаты двух точек для двух ребер, образующих угол.
Осталось найти координаты центральной (угловой) точки.
И получить их очень просто, опять же используя нод Evaluate at Index. Сделаем еще одну копию этого нода (shift + d), но переключим его в режим Vector – Face Corner. На входной сокет Value все так же подаем Position, а на индексный вход подадим индекс с начального нода Index.
В этом случае мы по индексу угла получаем его положение, что как раз соответствует координате его угловой точки.
Итак, мы получили координаты для все трех точек для каждого угла геометрии меша. Осталось подсчитать собственно значение угла.
Импортируем (File – Append) и добавим в наше нодовое дерево (shift + a – Group – …) созданную в самом начале нодовую группу “angle_by_3_points”. На ее входные сокеты подадим полученные координаты (помните, что соответствие подаваемых координат сокетам важно соблюсти). Результат с выходного сокета отправим на нод Viewer.
Так как в 3D вьюпорте атрибуты углов при отображении накладываются друг на друга, результаты удобнее всего смотреть в рабочей области Spreadsheet.
И здесь мы видим, что для всех углов теперь считается правильный результат, независимо от того, сколько ребер выходит из образующей угол точки.

.blend file on Patreon





