Использование коллекций для создания случайных зданий с помощью Blender - PullRequest
1 голос
/ 26 апреля 2019

У меня была идея создать фэнтезийный город, чтобы не иметь один и тот же дом снова и снова, но мне не нужно было вручную создавать сотни домов, о которых я думал, создавая такие коллекции, как "окна", "двери", "крыши" "и т. д., а затем создайте объекты с вершинами, назначенными определенным группам с одинаковыми именами (группы вершин" windows ", группы вершин" doors "и т. д.), а затем с помощью блендера выберите для каждого экземпляра дома случайное окно для каждого вершины в группе, то же самое для дверей, крыш и т. д.

Есть ли способ сделать это? (ничего не могу найти в Интернете), или мне нужно создать собственное дополнение? Если да, какая-нибудь хорошая ссылка или отправная точка, где что-то близко к этому сделано?

Я думал о системах частиц или дочерних объектах, но не смог найти способ прикрепить к вершине случайную часть коллекции. Также рассматривается логическое значение, но у него нет возможности присоединяться к определенной вершине или использовать коллекции. Так что у меня нет идей, как к этому подойти.

Что я имею в виду:

Создание базовой фигуры и назначение вершины группе вершин "windows": https://i.imgur.com/DAkgDR3.png

И затем к этой вершине присоединяются случайные объекты в коллекции «Windows» в виде частицы или модификатора:

https://i.imgur.com/rl5BDQL.png

Спасибо за любую помощь:)

1 Ответ

1 голос
/ 27 апреля 2019

Хорошо, я нашел способ сделать это.

Я использую 3 системы частиц (двери, крыши и окна), каждая из которых использует вершину в качестве излучателей, и использует векторные группы, чтобы определить, кудаотображать один из различных параметров.

Чтобы избежать создания эмиттером частиц более чем одного объекта на вершину, я создал небольшой скрипт, который подсчитывает количество вершин каждой группы вершин и обновляет каждую систему частицНомер выброса соответственно.

import bpy

o = bpy.data.objects["buildings"]

groups = ["windows", "doors", "roofs"]

for group in groups:
    vid = o.vertex_groups.find(group)
    vectors = [ v for v in o.data.vertices if vid in [ vg.group for vg in v.groups ] ]
    bpy.data.particles[group].count = len(vectors)

Я использовал чей-то код из переполнения стека для подсчета количества векторов в группе векторов, но не могу снова найти ссылку на конкретный вопрос, поэтому, если вы видитеВаш код здесь, пожалуйста, прокомментируйте, и я обновлю свой ответ с соответствующим кредитом.

...