Сегодняшний урок не для новичков. В нем мы будем добиваться желаемого результата скриптингом на Python, легкой математикой с помощью нодов и управлять этим всем будет простенький драйвер. Если ничего из вышеперечисленного вас еще не испугало, тогда приступим.
Этап моделирования
Первым делом вам необходимо создать сам регулятор. Тут все предельно просто, берете круг/цилиндр и создаете из него то, что душе угодно. При желании можете создать указатель/метку, которая в дальнейшем также будет загораться/гаснуть в зависимости от положения регулятора. После этого создайте одну лампочку и добавьте плоскость в качестве пола. Можно продолжить дублировать лампочки и вращать их вокруг регулятора вручную, но мы автоматизируем данный шаг.
Расположите 3D-курсор в центре регулятора и добавьте в сцену пустышку. Привяжите лампочку и регулятор к данной пустышке (Ctrl + P). Благодаря этому мы сможем перемещать по сцене пустышку и вся наша конструкция будет сохраняться. Для регулятора примените вращение (Ctrl + A → Rotation) и убедитесь, чтобы режим вращения был XYZ Euler (значение по умолчанию, но все же).
Для лампочки создайте материал с настройками по умолчанию (назовите его 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 мы задаем число создаваемых лампочек.
На 12-й строке мы вычисляем шаг, на котором будут располагаться лампочки и сохраняем его в переменную steprad. Воспринимайте это значение, как угол вращения, вокруг 3D-курсора.
Сейчас у нас есть все, для того, чтобы начать дублировать и вращать нашу лампочку, но если мы запустим цикл в текущем виде, то вращение будет происходит вокруг центра объекта (центра лампочки), а не 3D-курсора. Исправить это можно с помощью функции get_override, результат работы которой мы в итоге сохраняем в переменную override на 28 строке.
Последняя часть, это непосредственно сам цикл, который и выполняет за нас эту рутинную работу. Длится он в диапазоне от 0 до 19 (потому как мы задали 20 в переменную leds). На каждом из своих шагов он выполняет три действия:
- Создает связанный дубликат лампочки (все объекты имеют общий меш). Мы делаем тоже самое, дублируя объект с помощью сочетания клавиш Alt + D.
- Вращает объект вокруг 3D-курсора. Первое, что мы видим в скобках, это переменная override, которая хранит в себе результат работы функции get_override. При традиционном вращении сразу же после открытия скобок идет значение value. И да, после идет то самое значение value, которое в нашем случае равно 13,5°.
- Увеличивает индекс объекта на 1. По умолчанию все объекты в Blender имеют индекс 0 и таким образом мы получаем 21 лампочку с индексами от 0 до 20.
Теперь, когда мы разобрались с тем, что же здесь происходит, установите желаемые значения для переменных, выделите лампочку и нажмите Run Script.
Этап настройки материалов
Помните, мы в самом начале создали материал для лампочки? Откройте редактор нодов и сделайте из него следующее:
Сначала коротко суть. В правой части у нас есть два шейдера, соответствующих зажженной лампочке и выключенной. В левой части у нас есть 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 для регулятора. Все, драйвер мы установили и теперь осталось лишь настроить его:
Найдите меню с драйверами в окне Graph Editor и в качестве выражения укажите переменную var. В качестве объекта укажите регулятор, тип Z Rotation (вращение по оси Z) и локальные координаты.
Все! Две заметки:
- Если индекс регулятора равен 0, то его указатель будет загораться вместе с первой лампочкой.
- В самом начале мы создали пустышку и все к ней привязали. Теперь перемещайте пустышку по сцене как угодно и регулятор с лампочками будут следовать за ней.
Надеюсь данный метод не вызвал у вас затруднений и благодаря полученным знаниям вы сможете создавать крутые штуки с минимальными временными затратами.
Обязательно поделитесь в комментариях своими творениями! Всем удачи ;)
Очень поможет в моей работе! Спасибо огромное.
Артём, привет!
У меня возник такой вопрос.
[q][i]Сейчас у нас есть все, для того, чтобы начать дублировать и вращать нашу лампочку, но если мы запустим цикл в текущем виде, то вращение будет происходит вокруг центра объекта (центра лампочки), а не 3D-курсора. Исправить это можно с помощью функции get_override, результат работы которой мы в итоге сохраняем в переменную override на 28 строке.[/i][/q]
Так, а что поменять в самом скрипте (в нижних строках скрипта), что бы точкой вращения воспринимался 3d курсор?
Ничего.
Так получается, он воспринимает за точку вращения опорную точку вращения, и просто дублирует объект на своём же месте.
Я просто установил опорную точку объекта (led) в центре координат (и в центре ручки).
Просто хотелось узнать, как сделать, что бы он от 3d курсора считал.
Я пол данного урока расписываю, как сделать, чтобы вращение происходило вокруг курсора. Перечитай завтра и все получится.
Утро вечера мудренее ?
Я уже сделал.))
Но вот не понял только этого,
[q][i]Исправить это можно с помощью функции get_override, результат работы которой мы в итоге сохраняем в переменную override на 28 строке.[/i][/q]
как и где применить эту функцию))
И ещё, при вращении пустышки, которая является родителем ручки, не изменяется значение самой ручки по оси вращения Z, на которую настроен драйвер… и получается что сам драйвер не работает. (я этот касяк ещё обнаружил в других уроках… или может есть решение?)
Когда саму ручку поворачиваешь. то всё работает.
Я решил это переназначив драйвер на ось вращения пустышки, а не ручки.
[q]как и где применить эту функцию))[/q]
Учим питон или ждем утра и читаем [b]внимательно[/b] (и код и текст) :)
Лучше чем в уроке я уже не объясню.
[q]И ещё, при вращении пустышки, которая является родителем ручки, не изменяется значение самой ручки по оси вращения Z, на которую настроен драйвер… и получается что сам драйвер не работает.[/q]
Именно этого мы и добивались! Это не косяк, а фича.
[q][i]Найдите меню с драйверами в окне Graph Editor и в качестве выражения укажите переменную var. В качестве объекта укажите регулятор, тип Z Rotation (вращение по оси Z) и локальные координаты.[/q][/i]
Так как вот тут написано — не работает)) А работает, если указать не регулятор!, а пустышку.
Ну питон вообще первый раз в жизни использую))
Текст и код уже прочитал пару раз))
Понял. Плохо что ты не рассказал, о том, что скрипт, точнее его функция берёт ТИП! точки вращения с окна 3d вида.
Мне казалось, что скрипт на то и скрипт, что он выполняется не зависимо.
Урок классный! Скоро выложу результат.))
[q]Плохо что ты не рассказал, о том, что скрипт, точнее его функция берёт ТИП! точки вращения с окна 3d вида.[/q]
Да, я не говорил о том, что скрипт берет явно, но о том, что тип точки вращения нужно изменить указал :)
[q] Убедитесь, чтобы 3D-курсор оставался в центре регулятора и измените точку вращения на 3D-курсор.[/q]
Я не сразу понял, что это относится к работе скрипта. Просто в данном уроке вся работа строится от центра координат)
Речь о исправлении точки вращения с помощью функции уже была в абзаце с кодом) Я начал сразу код перелопачивать… полез в мануал, начал искать хоть что то связанное с питоном и курсором)))))
[i]- Что же это за функция и как её это исправить?))[/i] (мысли вслух)
Уже подумал, урок с квестом))
Очень нужный урок. Появилась даже пара идей)
Ещё раз спасибо за труды)
А есть возможность подсвечивать не по отдельности каждый диод а цельную шкалу?
Есть возможность)
Было свободное время. Накидал пример)
Здравствуйте. Извините, но у меня проблема с кодом на 25 строке выдает ошибку.
Привет) Скинь свой проект, я могу посмотреть, может проблема не в скрипте.
Вот здесь https://vk.cc/6dZARv
Пишет, что нет доступа. Нужно разрешение от владельца. ))
https://support.google.com/docs/answer/2494822?hl%3Den
Вот рабочий вариант https://vk.cc/6e0uTp
Открыл, запустил, скрипт отработал нормально.
https://1drv.ms/v/s!AmgnV8ZNII5ljwt1g0bd70u62fdX
Не знаю, что даже посоветовать из настроек. Тут точно стоит галочка?
Блин,в blender уже почти 5 лет,python вообще не знаю
интересный урок, но пока что то пошло не так(((
у вас не слишком удачная форма ) чето напоминает
Нормальная моделька. что получилось то получилось. А здоровые ассоциации тоже не плохо, но это уже в группу психоанализа. тут ничего крамольного не планировалось.
народ кто знает как зделат анимацию для игри
Береш блендер и делаиш. Проста епта)) Уроки учи… ну или хотя бы конкретизируй вопрос. Анимацию чего — модель скинь или скрин, тогда мож кто и ответит.
Спасибо. Теперь буду знать как анимировать шкалу. Один из вариантов.
А как из фотографий собрать видео? Заранее спасибо.
Нужно все фотокарточки приклеить на киноленту и все это прокрутить через кинопроектор. Всегда пожалуйста.
ffmpeg
Best Writing Service
Get an expert academic writing assistance. We can write any paper on any subject within the tightest deadline.
Для этого урока версия блендера имеет значение?
Видимо что-то не получается и прежде чем найти ошибку в своих действиях решили уточнить этот момент? ?
Подходят все версии начиная с 2.50+
после Add Driver не могу найти Single from Target
Ну конкретно эта опция появилась достаточно недавно. Поэтому если во по каким-то причинам годами не обновляете Blender, то рекомендую это сделать.
P.S. Как уже сказал, установит драйвер можно и на более старой версии, просто без использования пипетки.
Спасибо.
Можете описать, как выйти из ситуации без пипетки и обновления блендера?
Проще Вам обновить Blender. Ведь первое предложение урока гласит:
[i]»Сегодняшний урок не для новичков.»[/i]
А если Вы впервые столкнулись с драйверами, то зачем и без того все усложнять?
P.S. У меня на сайте есть уроки, в которых я устанавливаю драйвера на версиях до 2.78.
Новые версии блендера не устанавливаются. Так что обновление отпадает. Если нету возможности делать именно этот урок на старых версиях, так и скажите. Или комменты предназначены не для решения вопросов?