The project is a set of scripts in Python to run in Blender and is designed to implement three-dimensional cellular automata with various rules.
The main idea of the project is the possibility of combining three-dimensional cellular automata with different rules in one space. For this purpose, it is possible to mark areas with such rules using primitive objects, which, after creation, are converted into three-dimensional matrices. These matrices dynamically recalculate their values when the primary object changes.
To make it easier to work with matrices, various functions have been implemented. You can combine and aggregate matrices using functions to combine, subtract, and produce a hollow object.
I would be glad if this project helps you create unique 3D cellular automata in Blender and opens up new possibilities for your creativity.
Проект представляет собой набор скриптов на языке Python для запуска в Blender и предназначен для реализации трехмерных клеточных автоматов с различными правилами.
Основная идея проекта заключается в возможности комбинирования трехмерных клеточных автоматов с различными правилами в одном пространстве. Для этого предусмотрена возможность разметки областей с такими правилами с помощью примитивных объектов, которые после создания преобразуются в трехмерные матрицы. Эти матрицы динамически пересчитывают свои значения при изменении первичного объекта.
Для удобства работы с матрицами реализованы различные функции. Вы можете сочетать и агрегировать матрицы, используя функции для объединения, вычитания и получения полого объекта.
Буду рад, если этот проект поможет вам создавать уникальные трехмерные клеточные автоматы в Blender и откроет новые возможности для вашего творчества.
- tensor.py - модуль для работы с трехмерными матрицами на основе
numpy
. (Схема) - virtual.py - модуль для преобразования объектов в трехмерные матрицы с возможностью задавать формулу сочетания матриц и пересчитывать результат при изменении первичных объектов. (Схема)
- rule.py - модуль для расчета правил клеточных автоматов и их применения
- instance.py - модуль реализующий отображение трехмерных матриц в Blender, каждому ненулевому значению матрицы сопоставляется объект. Также предусмотрено переиспользование объектов в целях оптимизации при создании анимации.
- utils.py - набор различных функций, инкапсулирующих логику работы с модулем
bpy
.
- Добавление класса
VirtualProperty
связывающего заданный пользователем параметр в Blender и Python объект. Таким образом возможно будет динамически изменять некоторые параметры CA (например, правила CA) без необходимости редактирования и перезапуска управляющего скрипта - Оптимизация функции
next_life
- Разработка интерфейса
- Методы для работы с правилами CA: поиск ближайших похожих; получение случайного по заданным коэффициентам выживаемости и рождаемости
- Скрипт: Growing-Sphere.py
- Blender файл: Growing-Sphere.blend
- Описание:
- Инициализируем сферу как VirtualObject экземпляр и заполняем значениями
sphere = VirtualObject(bpy.data.objects["Sphere"], grain)
vf_init = sphere.fill(1)
- Получаем трехмерную матрицу заполненную 1 в местах пересечения со сферой и 0 в прилегающих областях
- Аналогично инициализируем куб и заполняем случайным кодом клеточного автомата
cube = VirtualObject(bpy.data.objects["Cube"], grain)
vf_rule = cube.fill(code_rand)
- Код случайного правила можно увидеть в окне Outliner в коллекции Info. Расшифровки кода в скрипте нет, но можно использовать вызов:
CellRule.get_condition(code_rand)
- Создаем экземпляр клеточного автомата с данным правилом и начальными условиями в виде сферы
vf_life = VirtualLife(vf_rule, vf_init)
- В целях оптимизации и уменьшения количества отображаемых кубов в Blender, убираем все внутренние клетки. Эта функция никак не влияет на расчет состояний клеточного автомата
vf_life = vf_life.hollow()
- Время жизни клетки по умолчанию передается в
Custom Property
с именемvalue
, используем этот параметр в материале объекта для покраски клетки в разные цвета.
- Инициализируем сферу как VirtualObject экземпляр и заполняем значениями
- Скрипт: Basic-Cube.py
- Blender файл: Basic-Cube.blend
- Описание:
- Куб заполняем случайным образом значениями 0 и 1 в соотношении 90:10
vf_init = cube.random_fill([0, 1], weights=[0.9, 0.1])
- Полученную трехмерную матрицу отзеркаливаем по всем осям для получения симметрии
vf_init = vf_init.mirror()
- Тот же куб используем для создания матрицы заполненной кодом правила клеточного автомата
vf_rule = cube.fill(code_maze)
- Код можно расшифровать вызовом
CellRule.get_condition(8259390827203093)
, получим:- B =
[1, 6, 7, 9, 10, 13, 21, 22]
(условия рождения) - S =
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 15, 16, 18, 24, 25, 26]
(условия выживания)
- B =
- Создаем экземпляр клеточного автомата с данным правилом и случайными начальными условиями
vf_life = VirtualLife(vf_rule, vf_init)
- В целях оптимизации и уменьшения количества отображаемых кубов в Blender, убираем все внутренние клетки. Эта функция никак не влияет на расчет состояний клеточного автомата
vf_life = vf_life.hollow()
- Время жизни клетки по умолчанию передается в
Custom Property
с именемvalue
, используем этот параметр в материале объекта для покраски клетки в разные цвета.
- Куб заполняем случайным образом значениями 0 и 1 в соотношении 90:10
Также больше примеров можно увидеть в разделe: examples