Создание регулятора в Blender

8 февраля 2017 38 комментариев Артем Слаква Скриптинг на Python

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

Этап моделирования

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

Расположите 3D-курсор в центре регулятора и добавьте в сцену пустышку. Привяжите лампочку и регулятор к данной пустышке (Ctrl + P). Благодаря этому мы сможем перемещать по сцене пустышку и вся наша конструкция будет сохраняться. Для регулятора примените вращение (Ctrl + A → Rotation) и убедитесь, чтобы режим вращения был XYZ Euler (значение по умолчанию, но все же).
knob-led-1
Для лампочки создайте материал с настройками по умолчанию (назовите его led), его мы будет изменять немного позже. Убедитесь, чтобы 3D-курсор оставался в центре регулятора и измените точку вращения на 3D-курсор.

Теперь необходимо вставить данный код в текстовый редактор Blender, выделить лампочку и нажать кнопку Run Script. Но перед тем, как сделать это, давайте разберем этот самый код и изменим некоторые переменные при желании:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import bpy
from math import radians
 
# range covered (in degrees)
rangecovering = 270
 
# number of leds
leds = 20
 
##############################"
# step calculated
steprad = radians(rangecovering/leds)
 
#the override comes from http://blender.stackexchange.com/questions/6969/rotate-object-around-cursor-with-python
 
def get_override(area_type, region_type):
    for area in bpy.context.screen.areas: 
        if area.type == area_type:             
            for region in area.regions:                 
                if region.type == region_type:                    
                    override = {'area': area, 'region': region} 
                    return override
    #error message if the area or region wasn't found
    raise RuntimeError("Wasn't able to find", region_type," in area ", area_type,
                        "\n Make sure it's open while executing script.")
 
#we need to override the context of our operator    
override = get_override( 'VIEW_3D', 'WINDOW' )
 
for N in range(0,leds) :
 
    # do a duplicate link
    bpy.ops.object.duplicate_move_linked(OBJECT_OT_duplicate={"linked":True, "mode":'TRANSLATION'}, TRANSFORM_OT_translate={"value":(0, 0, 0)})
 
    # rotation of the duplicate
    bpy.ops.transform.rotate(override, value=steprad, axis=(-0, -0, -1), constraint_axis=(False, False, False), constraint_orientation='GLOBAL')
 
    # change pass index obj
    bpy.context.object.pass_index = N+1

В 5-й строке мы указываем диапазон, в котором будут располагаться наши лампочки (270°). На 8-й строке в переменной leds мы задаем число создаваемых лампочек.

Стоит заметить, что одна у нас уже есть, и при данном значении переменной мы в итоге получим 21 лампочку.

На 12-й строке мы вычисляем шаг, на котором будут располагаться лампочки и сохраняем его в переменную steprad. Воспринимайте это значение, как угол вращения, вокруг 3D-курсора.

Сейчас у нас есть все, для того, чтобы начать дублировать и вращать нашу лампочку, но если мы запустим цикл в текущем виде, то вращение будет происходит вокруг центра объекта (центра лампочки), а не 3D-курсора. Исправить это можно с помощью функции get_override, результат работы которой мы в итоге сохраняем в переменную override на 28 строке.

Последняя часть, это непосредственно сам цикл, который и выполняет за нас эту рутинную работу. Длится он в диапазоне от 0 до 19 (потому как мы задали 20 в переменную leds). На каждом из своих шагов он выполняет три действия:

  1. Создает связанный дубликат лампочки (все объекты имеют общий меш). Мы делаем тоже самое, дублируя объект с помощью сочетания клавиш Alt + D.
  2. Вращает объект вокруг 3D-курсора. Первое, что мы видим в скобках, это переменная override, которая хранит в себе результат работы функции get_override. При традиционном вращении сразу же после открытия скобок идет значение value. И да, после идет то самое значение value, которое в нашем случае равно 13,5°.
  3. Увеличивает индекс объекта на 1. По умолчанию все объекты в Blender имеют индекс 0 и таким образом мы получаем 21 лампочку с индексами от 0 до 20.

Теперь, когда мы разобрались с тем, что же здесь происходит, установите желаемые значения для переменных, выделите лампочку и нажмите Run Script.

Так как все объекты имеют общий меш, вы в любой момент можете изменить форму одной из лампочек и они все изменятся соответствующим образом.

Этап настройки материалов

Помните, мы в самом начале создали материал для лампочки? Откройте редактор нодов и сделайте из него следующее:
knob-led-2
Сначала коротко суть. В правой части у нас есть два шейдера, соответствующих зажженной лампочке и выключенной. В левой части у нас есть 4 входных значения, а по середине сухая математика.

Все дерево выполняет одну задачу: выдает в качестве фактора смешивания двух шейдеров 0 или 1. Теперь чуть-чуть подробнее…

Первое входное значение (range of strip led) равно значению переменной rangecovering. В нашем случае это 270°. Number of leds это число наших лампочек и у нас их 21. Нод Object Info выдает нам индексы наших лампочек, а они, как мы знаем, находятся в диапазоне от 0 до 20. И последнее входное значение (фиолетовое), будет генерироваться нашим драйвером, который мы скоро создадим. Пока оставьте там значение 0.

И далее мы вычитаем, умножаем и сравниваем эти числа, чтобы определить какой из двух шейдеров использовать для лампочки. Последний нод Math (Less Than) сравнивает два значения и на выходе дает белый цвет (0), если верхнее значение меньше нижнего. В остальных случаях на выходе — черный цвет (1).

Для первого нода Multiply установите значение -0,5 (как и на изображении), для второго равное переменной rangecovering, а для нода Divide установите отрицательное значение числа Пи.

Этап настройки драйвера

Для регулятора также назначьте материал лампочки (особенно, если вы создавали указатель/метку, которая в дальнейшем также будет загораться/гаснуть в зависимости от положения регулятора). В окне 3D-вида откройте панель свойств и разверните меню Transform. Нам нужно видеть угол вращения по оси Z (по X и Y можете вовсе заблокировать). Нажмите ПКМ по 4-му входному значению материала (сейчас в значении 0) и выберите Add Driver → Single from Target. Появившейся пипеткой ткните на угол вращения по оси Z для регулятора. Все, драйвер мы установили и теперь осталось лишь настроить его:
knob-led-3
Найдите меню с драйверами в окне Graph Editor и в качестве выражения укажите переменную var. В качестве объекта укажите регулятор, тип Z Rotation (вращение по оси Z) и локальные координаты.

Все! Две заметки:

  1. Если индекс регулятора равен 0, то его указатель будет загораться вместе с первой лампочкой.
  2. В самом начале мы создали пустышку и все к ней привязали. Теперь перемещайте пустышку по сцене как угодно и регулятор с лампочками будут следовать за ней.


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

Обязательно поделитесь в комментариях своими творениями! Всем удачи ;)

источник урока

О сайте

На данном сайте Вы сможете найти множество уроков и материалов по графическому
редактору Blender.

Контакты

Для связи с администрацией сайта Вы можете воспользоваться следующими контактами:

Email:
info@blender3d.com.ua

Следите за нами

Подписывайтесь на наши страницы в социальных сетях.

На сайте Blender3D собрано огромное количество уроков по программе трехмерного моделирования Blender. Обучающие материалы представлены как в формате видеоуроков, так и в текстовом виде. Здесь затронуты все аспекты, связанные с Blender, начиная от моделирования и заканчивая созданием игр с применением языка программирования Python.

Помимо уроков по Blender, Вы сможете найти готовые 3D-модели, материалы и архивы высококачественных текстур. Сайт регулярно пополняется новым контентом и следит за развитием Blender.