Blender – уроки моделирования (урок №8)

20 июля 2010, Сергеев Аркадий 1
В этом уроке нам предстоит освоить одну из самых интересных, на мой взгляд, возможностей Blender – научиться делать собственные дополнения к этой многофункциональной программе. Мы расширим функционал программы, делая ее более ручной и более обученной выполнять всякую рутинную работу. Речь пойдет о программировании при помощи Python.

Blender – философский аспект #

Конечно, можно долго спорить о том, являются ли искусством картинки, созданные программой, и какое отношение они имеют к творчеству. Они, может быть, и не имеют никакого отношение ни к творчеству, ни к искусству. И следует ограничиться лишь тем, что упомянуть о возможности Blender’а работать со скриптами. Но, на мой взгляд, написать программу, которая будет рисовать – уже искусство, недаром же Кнут назвал свой фундаментальный труд – "ИСКУССТВОМ программирования". Но решать только Вам, стоит или не стоит читать статью о программировании в редакторе трехмерной графики.

Если Вы все же решили читать урок дальше, то Вам стоит знать, что для понимания материала необходимы знания из области программирования. По ходу объяснения материала я периодически буду говорить, какие знания Вам будут нужны для работы со следующим блоком. Вы либо оживите в памяти известные и необходимые для работы вещи, либо обратитесь к дополнительной литературе, чтобы разговор шел на одном языке. Итак, приступаем к изучению возможностей Blender’а расширяться, используя язык программирования Python.

Да, Вам никогда не было интересно, почему Blender раскрывается сразу в двух окнах, почему одного ему мало? Лично мне при знакомстве с Blender это было крайне интересно. Особенно интересовало меня первое окошко с интерфейсом, до боли напоминающем интерфейс командной строки. Вот это черное окно и станет началом нашего знакомство с Blender, как средой программирования.

Знакомьтесь – перед Вами среда программирования Blender, язык программирования Python. Так для чего же среде программирования Blender нужна консоль?

О применении консоли Blender #

Одним из поводов для написания этой статьи послужили воспоминания о школе – курсе стереометрии и работа с этим курсом сейчас, через года после того, как я отложил учебник школьной геометрии, как тогда казалось, навсегда, а вот вышло, что только на время. И тогда, когда я был школьником, и сейчас, мне хотелось иметь под рукой некий инструмент, который строит фигуры по заданным точкам. Ведь, согласитесь, достаточно сложно понять, как располагаются точки в трехмерном пространстве, когда их нужно изобразить на тетрадочном листе карандашом. Тогда, в школе, возился я, помнится, с учебным языком программирования и ничего хорошего не получил. Зато сейчас у меня под рукой есть Blender, а он содержит большую возможность для расширения.

Обычно программы расширяются различными патчами, аддонами и прочими модами, которые надо инсталлировать в программу по особым правилам, но почти всегда как отельное приложение с соответствующей записью в реестр. Не всегда понятно по описанию, как это дополнение работают и какие дыры для заражения содержит. Еще одни вопрос при установке нового программного обеспечения: сможет ли это приложение или дополнение корректно удалиться? Так что подумайте, прежде, чем что-то ставить.

Такой принцип расширения возможностей программ распространяется и на бесплатные тоже. А вот Blender выделяется и здесь. Большинство дополнений распространяются в виде скриптов, написанных на зыке Python версии, необходимой для версии Вашего Blender.

Отмечу, что транслятор Python надо устанавливать отдельно от Blender. Помните то окно-приглашение установить Python с сайта разработчика, которое появляется сразу после установке самого Blender. В принципе, обойтись можно и без питона на Вашем компьютере, просто без этой змеи не будут работать некоторые скрипты и, собственно говоря, этот урок окажется Вам бесполезным. Если у Вас не стоит Python, то скачать его можно отсюда www.python.org совершенно бесплатно.

Консоль Blender #

Наличие установленного и успешно найденного Blender’ом питона говорит вот такое сообщение.

Blender – уроки моделирования (урок №8)

Если же нужная версия Python не установлена на Вашем компьютере, то будьте готовы к такому сообщению в консоли Blender.

Blender – уроки моделирования (урок №8)

Итак, без нужной версии Python в данном уроке не обойтись, поэтому пока устанавливается дополнительное программное обеспечение, расскажу я Вам почему при запуске Blender’а появляется окно, очень похожее на командную строку. Это консоль программы и служит она для того, чтобы видеть, что делает программа, а так как еще Blender является и своеобразной средой программирования, то консоль служит так же для отображения ошибок в скриптах. Например, Вы запускаете скрипт на несколько сотен строк, и он не запускается.

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

Blender – уроки моделирования (урок №8)

Конечно, на данной машине не установлен Python, но если бы он и стоял, то, уверяю Вас, картина не изменилась бы. Но прежде, чем познакомиться с работой скриптов, хочу показать Вам еще одну картинку – то, каким образом главное рабочие окно Blender’а сообщает пользователю о наличии ошибки в скрипте.

Blender – уроки моделирования (урок №8)

Как только появляется такое сообщение об ошибке, нажимаем Alt+Tab, и пробуем понять, что именно не нравится транслятору.

То, что следует знать, для дальнейшего чтения #

Историю и теорию языков программирования я пропущу. Не стану здесь рассказывать, почему используется транслятор, а не компилятор, почему в Blender используется Python, а не любой другой язык. Все это не имеет такой важности для данной темы урока, а если кому интересны эти вопросы, их можно посмотреть в Интернет или обсудить отдельно.

А вот то, что знать необходимо, прежде чем продолжить чтение данного материала. Blender использует скриптовый язык программирования Python, версия используемого языка зависит от версии Blender. Так же Вам необходимо иметь общие представления о программировании, хотя бы на школьном алгоритмическом языке – язык Python не такой сложный. Понимать тексты, написанные на нем, можно немного зная принципы программирования. Основ для нашего урока вполне хватит. Так же следует понимать, что абсолютно любой объект, возникающий на экране монитора можно создать определенной командой или же серией команд.

Еще Вам следует знать такую вещь, что все окошечки и кнопочки, которые Вас окружают, составляют Graphical User Interface (GUI – графический интерфейс пользователя) и создается этот интерфейс тоже специальными командами. Теперь, кажется, все, что необходимо для дальнейшего чтения я рассказал. Сейчас можно приступать к тому, что я считаю волшебством нашего века – программированию. Сколько возможностей открывают перед нами простые наборы символов, соединенные в нужные последовательности! Лично у меня всегда захватывает дух, когда нужно сесть за машину и начать программировать.

Текстовый редактор в Blender #

Код любой программы представляет из себя набор команд (не будем вдаваться в терминологию). Для того, чтобы задавать эту последовательность, нужно иметь некую среду, предназначенную для этого. В некоторых случаях достаточно простого блокнота, правда, файл нужно будет сохранить в нужном разрешении. В случае с Python, файлы будут иметь вид *.py. Так что модули для Blender можно писать в простом стандартном блокноте. Но давайте рассмотрим возможности самого Blender писать модули для самого себя. Итак, вызываем встроенный в Blender текстовые редактор, нажимаем Shift+F11, или же выбираем его среди окон Blender вот так.

Blender – уроки моделирования (урок №8)

Теперь давайте рассмотрим непосредственно сам текстовый редактор. Выглядит он следующим образом.

Blender – уроки моделирования (урок №8)

На панели после меню "Text" расположены кнопки: сделать текстовый редактор во все окно (аналог Ctrl+Up), следующая кнопка включает/выключает нумерацию строк, затем кнопка разрешающая/запрещающая перенос строк, кнопка включающая/выключающая подсветку ключевых слов и, наконец, кнопка с зеленым змеем, которая включает/выключает сплывающие подсказки. Как эти кнопки работают, разберемся по ходу создания скриптов. Но для того, чтобы этим увлекательным делом все же заняться, надо кликнуть правой кнопкой мыши по полю текстового редактора, или нажать на кнопку со стрелками после кнопки с зеленым змеем. Появится меню File, содержащее две команды: New и Open. Смысл этих команд прост: New – создаем новый скрипт, Open – открываем существующий. Мы, сходу, создадим новый скрипт, состоящий из одной строчки.

print (‘Hallow, World!’)

Листинг 1 #

Обратите внимание, инструкция print пишется с маленькой буквы.

Blender – уроки моделирования (урок №8)

Первый Ваш скрипт написан. Теперь надо его выполнить. Нажимаем Alt+P. И видим, что никаких изменений не произошло, сообщений об ошибках не вылезло, это значит, что скрипт выполнен корректно. И если проверить консоль, то можно увидеть наш Hallow, Word! в ней.

Blender – уроки моделирования (урок №8)

И пока Вы наслаждаетесь результатами своей программистской деятельности, я расскажу об еще одной возможности текстового редактора в Blender. Ничего не меняя, нажмите Alt+M. Увидели содержимое текстового редактора в окнах проекции? Вот такая интересная возможность Blender для моделирования различных надписей. Очень удобна при создании открыток.

Но нам хочется что-нибудь нарисовать, используя Python. Мы пойдем по пути наименьшего сопротивления – возьмем готовый рабочий скрипт, и посмотрим, из чего он состоит.

Изучение встроенных скриптов Blender #

Начнем с самого простого: определимся, тексты каких скриптов установились вместе с Blender. Повторюсь еще раз: для просмотра файлов с расширением *.py достаточно простого блокнота, если Вы установили Python, то у Вас есть и дополнительные инструменты для работы с языком, но о них говорить мы не станем, а перейдем к другому важному моменту – нахождению скриптов Blender на Вашем компьютере. Самое простое – воспользоваться стандартным поисковиком Windows, указав для поиска такую строку *.py.

Список питоновских файлов у Вас есть. Теперь в нем будем искать интересные для нас файлы. Снова возвращаемся в Blender и пробуем добавить новый объект. Помните это меню?

Blender – уроки моделирования (урок №8)

Сейчас нас интересуют его пункты со змеем зеленым. Да, это значок того, что скрипт меню имеется в наличии. Итак, мы можем изучить скрипт добавления баранки (Torus) и пустого меша (Empty mesh). Начнем со второго.

#!BPY

"""

Name: 'Empty mesh'

Blender: 243

Group: 'AddMesh'

"""

import BPyAddMesh

import Blender

def main():

BPyAddMesh.add_mesh_simple('EmptyMesh', [], [], [])

main()

Листинг 2 – код файла add_mesh_empty.py #

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

Как и следовало ожидать, главная функция скрипта – функция main(), она вызывает тоже всего одну функцию – add_mesh_simple(), которая располагается в библиотеке BPyAddMesh (внимательно следите за регистром букв, чтобы потом не искать ошибку, так как Python чувствителен к этому регистру).

Так же мы видим, что все, что следует за знаком #, является комментарием к коду и служит нам для объяснения фрагментов кода. Не ленитесь делать комментарии в Ваших скриптах, потом будет легче понять, что Вы имели ввиду, вызывая ту или иную функцию.

Параметры функции add_mesh_simple() #

Функция add_mesh_simple() имеет четыре параметра: название меша, список вершин, список ребер, список граней меша. Вроде бы все очень просто, за исключением того, что каждая точка имеет три координаты (да, мы же работаем с пространством), а грань – три или четыре точки. Вот теперь подумайте, сколько надо задать параметров, чтобы нарисовать простой куб – восемь точек, по три координаты в каждой, и шесть плоскостей, по четыре точки в каждой. Ничего не попишешь, вернее, много придется писать.

Только куб создавать нам не за чем. Куб имеется в примитивах. Упростим себе задачу, и создадим объект некоторых наших сцен – угол. Да, именно угол, в котором располагалось зеркало (см. предыдущие уроки). По сути дела этот угол – тот же куб, но без одной вершины и трех граней. Что же, задача упростилась: описываем семь точек и три грани. Открываем текстовый редактор Blender’а и пишем.

import Blender # так надо мы же пишем модуль для Blender

import BPyAddMesh # библиотека, где располагается нужная нам функция

BPyAddMesh.add_mesh_simple('MyFirstMesh', [], [], [])

Листинг 3 #

Это хорошо, но где описание координат вершин и граней? Да, пока в коде их явно нет. Тут особенность, вершина должна состоять из трех точек, а грань ссылаться на вершину. То есть перечислить координаты точек в скобках мы не можем – вернее можем, но тогда не зададим грани. Поэтому нужно как-то задать координаты точки, как одну целую конструкцию. А что Вам напоминает последовательность из трех чисел? Мне – вектор. Каждая точка у нас будет вектором. Тогда первая скобка в функции будет содержать последовательность векторов, а третья – последовательность векторов. Как поется в песенку: "За словами суть вещей вряд ли кто поймет". Переходим к делу.

Вызываем библиотеку для работы с векторами.

from Blender.Mathutils import Vector.

Сразу же создадим массив вершин, в виде векторов. А имя массиву дадим осмысленное – verts. Теперь можно смело заполнять этот массив векторами.

verts = [\

Vector(1,1,-1),\

Vector(1,-1,-1),\

Vector(-1,-1,-1),\

Vector(-1,1,-1),\

Vector(1,1,1),\

Vector(-1,-1,1),\

Vector(-1,1,1),\

]

Не пугайтесь Python, этот блок поймет, как одну строку, просто используя символ "", мы разбили одну физическую строку на несколько логических, для простоты восприятия скрипта человеком. Помните, что нумерация начинается с нуля. То есть, если в массиве 7 элементов, то первая имеет номер ноль, седьмая – шесть. Не спешите отчаиваться, сейчас приведу пример с гранями – будет понятнее.

Список граней – тоже массив. Назовем его faces. Теперь осталось заполнить. Просто перечисляем все вершины, которые входят в каждую конкретную грань. Вот так:

faces = [\

(0, 1, 2, 3),\

(2, 5, 6, 3),\

(4, 0, 3, 6),\

]

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

edges = []

Завершим наш скрипт командой, которая перерисует все содержимое окна.

Blender.Window.RedrawAll()

Каждая строчка рассмотрена, каждая команда понята. Осталось только запустить скрипт. Выглядит он у меня так:

import Blender

import BPyAddMesh

from Blender.Mathutils import Vector

verts = [\

Vector(1,1,-1),\

Vector(1,-1,-1),\

Vector(-1,-1,-1),\

Vector(-1,1,-1),\

Vector(1,1,1),\

Vector(-1,-1,1),\

Vector(-1,1,1),\

]

edges = []

faces = [\

(0, 1, 2, 3),\

(2, 5, 6, 3),\

(4, 0, 3, 6),\

]

BPyAddMesh.add_mesh_simple("MyFirstMesh", verts, edges, faces)

Blender.Window.RedrawAll()

Листинг 4 #

Внимательно следите за отступами. В Python отступы значимы. Вот что происходит после нажатия на Alt+P.

Blender – уроки моделирования (урок №8)

Создаем GUI #

Скрипт мы сделали, но выглядит он у нас как-то нехорошо – сплошной текст. Насколько бы наш скрипт выглядел профессиональней, если бы обладал собственным интерфейсом, хотя бы двумя кнопками: одна, чтобы сделать наш угол, вторая, чтобы выйти из скрипта.

Именно эти кнопочки и входят в GUI. И при создании этого интерфейса ощущаешь себя настоящим гуру Python. Начнем? Вам страшно? Мне нет. Если не страшно и Вам, тогда читаем дальше.

Цель проста – сделать две кнопки. Но сами по себе кнопки не несут никакой нагрузки. Кнопке должно быть поставлено в соответствие какое-нибудь событие. У нас, мы определили, будут две кнопки. Draw будет связана с событием прорисовки нашего угла, а Exit – с выходом из скрипта. Соответственно, у нас будут два события: выход и прорисовка.

С кнопками и с событиями мы определились. Теперь снова небольшой экскурс в основы программирования и основы Python’а. Python для отделения тел циклов, процедур и функций использует отступы (см. листинг 2). Определение функций осуществляется ключевым словом def. Все события будем оформлять как функции. Так же существуют глобальные переменные (видны для всех функций программы) и локальные (видны только для данной функции).

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

Задаем глобальные переменные #

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

EVENT_DRAW = 1 # Событие создания угла

EVENT_EXIT = 2 # Событие-выход из выполнения скрипта

Но предварительно сделаем импорт двух библиотек.

from Blender.BGL import *

from Blender.Draw import *

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

Создаем диалоговое окно #

Прорисовку главного окна будем выполнять в функции draw. Не путайте с переменной, отвечающей за событие рисование нашего угла. Функция draw(), будет создавать окно с надписью, говорящей что это за скрипт, что от него ожидать и двумя кнопками. Итак, инициализируем функцию.

def draw():

Не забываем про двоеточие в конце и про отступ, который будет показывать на тело функции.

Следующий шаг – показываем, что мы намерены работать с глобальными переменными и какими именно:

global EVENT_DRAW,EVENT_EXIT

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

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

glClear(GL_COLOR_BUFFER_BIT) # Инициализируется окно OpenGL,

glRasterPos2d(8, 103)

# позиция устанавливается в x=8, y=103

Text("Demo Script from F1CD") # в установленной позиции выводим текст.

Теперь прорисовываем кнопки. Вызываем функцию Button() с параметрами текст, что будет на кнопке, событие, которое будет выполняться при нажатии на кнопку, и позиция кнопки.

Button("Draw",EVENT_DRAW , 10, 10, 80, 18)

Button("Exit",EVENT_EXIT , 140, 10, 80, 18)

Теперь самое время скопировать процедуру создания нашего угла в функцию MyMesh().

Функции с параметрами #

Теперь нам осталось написать две функции – реагирование на события клавиатуры и мышки, и реагирования непосредственно на нажатия кнопок. Рассказывать я об этом буду без теории, но с комментариями по ходу листингов.

При нажатии на клавишу Q на клавиатуре, мы будем выходить из выполнения скрипта, остальные события, приходящие от клавиатуры и мышки мы игнорируем.

def event(evt, val):

if (evt == QKEY and not val): # событие – нажали на Q

Exit()

# вышли из выполнения скрипта

С процедурой, обрабатывающей события кнопок дела обстоят немного сложнее: нам надо получить события, которые мы объявляли глобально.

def bevent(evt):

global EVENT_NOEVENT,EVENT_DRAW,EVENT_EXIT #глобальные переменные

#########Управление событиями GUI

# получили событие EVENT_EXIT

if (evt == EVENT_EXIT):

Exit()

elif (evt== EVENT_DRAW): # получили событие EVENT_DRAW

MyMesh() # рисуем угол

Blender.Redraw() # обновляем окно

Функция Register() #

Теперь нам нужна функция, которая будет связывать все, что мы написали. Это функция Register() – и ее аргументы: процедура рисования окна, перехват событий клавиатуры и мыши, и перехвата событий от нажатия кнопок. Выглядеть будет так:

Register(draw, event, bevent)

Вот и все – наш скрипт готов. Можно нажимать Alt+P и смотреть, что получилось. У меня все вышло, как я и хотел:

Blender – уроки моделирования (урок №8)

Теперь можно смело модифицировать наш скрипт. Например, в функцию MyMesh() ввести коэффициент, отвечающий за масштаб нашего угла. Почему бы нет? Будет домашним заданием. Логика выполнения такая: функцию MyMesh() делаем функцией с параметром. Лучше всего параметру давать осознанное имя, например, если Вы хотите масштабировать Ваш угол, то имя параметру следовало бы дать Scale или производное от этого, например, просто S. В MyMesh() параметр S умножим на координаты вершин, чем и произведем масштабирование. Осталось только задать параметр S. Для этого создайте окошко для вода цифр. Например так:

S = Number("No. of scale: ", EVENT_NOEVENT, 10, 55, 210, 18, S.val, 3, 20, "Scale");

Правда, придется прописать еще одно событие, вернее указать на отсутствие события при нажатии на новый блок. Вот такое домашние задание, если возникнут проблемы, пишите, обсудим.

Но это задание – самое простое, что приходит в голову, смотря на написанный нами код. Я надеюсь, что Вы все прописали сами, чтобы поупражняться в модостроении и разобраться в материале этого непростого урока. Будьте очень внимательны, особенно при создании GUI.

В этом уроке я рассказал, как и всегда, лишь о самом основном. Подготовил для дальнейшего погружения в мир Blender теперь уже в связке с Python. Удачи Вам. И желаю не бояться трудностей – без них ведь очень скучно.

Приложение к уроку моделирования Blender №8

Рекомендуем также почитать

  1. Статья Blender – уроки моделирования (урок №1)
  2. Статья Blender – уроки моделирования (урок №2)
  3. Статья Blender – уроки моделирования (урок №3)
  4. Статья Blender – уроки моделирования (урок №4)
  5. Статья Blender – уроки моделирования (урок №5)
  6. Статья Blender – уроки моделирования (урок №6)
  7. Статья Blender – уроки моделирования (урок №7)
  8. Программа Blender 2.4
  9. Видео:

Отзывы

1 Оставить отзыв
  • Важный Гость 20.12.2015 в 18:12

    в Блендере 2.6-2.7 уже другие команды, и дело не в питоне, а в библиотеках самого блендера, которые теперь по другому называются. нельзя ли обновить статью???

    Добавить отзыв

    загрузить другую
    Ваш отзыв

    Видео

    BenQ PU9730: обзор инсталляционного двухлампового проектора

    23 января 20159890 0

    Обзор инсталляционного двухлампового проектора BenQ PU9730. Модель имеет моторизованный большой зум с широким диапазоном масштабирования и поддерживает вертикальный/горизонтальный сдвиг линз. Проектор можно разворачивать на 360 градусов и управлять им дистанционно [..]

    Видеосвидетель 5410 FHD 2CH: обзор видеорегистратора с двумя камерами

    31 декабря 201413321 0

    Обзор видеорегистратора Видеосвидетель 5410 FHD 2CH. В комплекте с устройством поставляется дополнительная камера для крепления на заднее стекло автомобиля. Обе камеры записывают видео со звуком в разрешении 1920x1080 при 30 кадрах в секунду. Посмотреть отснятое можно на экране [..]

    Видеосвидетель 4410 FHD G: обзор видеорегистратора

    31 декабря 201412751 0

    Обзор видеорегистратора Видеосвидетель 4410 FHD G. Устройство снимает видео со звуком в разрешении вплоть до 2304x1296 на частоте 30 кадров в секунду и умеет делать фотографии. Угол обзора камеры составляет 170 градусов по горизонтали. В числе особенностей модели – система [..]

    Cвежие новости

    Все новости