Чтение онлайн

ЖАНРЫ

Написание скриптов для Blender 2.49

Anders Michel

Шрифт:

if ob.name == 'Text' :

text_ob = ob.getData

break

Если не нашлось никакого ранее используемого объекта Text3d, создаём новый :

if text_ob == None:

text_ob = Blender.Text3d.New('Text')

ob=scn.objects.new(text_ob)

ob.setName('Text')

Следующий шаг - установить текст объекта Text3d в значение аргумента, переданного в метод captcha, и сделать его трёхмерным, настроив глубину выдавливания. Мы также изменяем ширину символов и сокращаем расстояние между ними, чтобы ухудшить разделение. Добавление небольшого скоса (bevel) смягчит контуры символов, что может добавить трудностей для робота, различающего символы, если настроено искусное освещение (выделено). Мы могли бы решить использовать другой шрифт для нашего текста, который ещё труднее для чтения ботом, и здесь как раз место для установки такого шрифта (смотри следующий информационный блок).

Чего-то не хватает

Документация API Блендера имеет небольшой пропуск: как будто не существует способа настроить другой шрифт для объекта Text3d. Тем не менее, есть недокументированный метод setFont, который принимает объект Font в качестве аргумента. Код, выполняющий изменение шрифта должен выглядеть похожим на это:

fancyfont=Text3d.Load('/usr/share/fonts/ttf/myfont.ttf')

text_ob.setFont(fancyfont)

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

Последним шагом нужно обновить дисплейный список Блендера для этого объекта, чтобы наши изменения были отрендерены:

text_ob.setText(text)

text_ob.setExtrudeDepth(0.3)

text_ob.setWidth(1.003)

text_ob.setSpacing(0.8)

text_ob.setExtrudeBevelDepth(0.01)

ob.makeDisplayList

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

context = scn.getRenderingContext

context.displayMode=0

Затем, мы устанавливаем размер изображения и указываем, что нам нужен формат png. Включением RGBA и установкой альфа-режима в 2 мы гарантируем, что там не будет видно никакого неба, и что наше изображение будет иметь хороший прозрачный фон:

context.imageSizeX(160)

context.imageSizeY(120)

context.setImageType(Blender.Scene.Render.PNG)

context.enableRGBAColor

context.alphaMode=2

Даже если мы рендерим простое неподвижное изображение, мы используем метод renderAnim контекста рендера, поскольку иначе результаты рендерятся не в файл, а только в буфер. Следовательно, мы устанавливаем начальный и конечный кадры анимации в 1 (точно так же, как и текущий кадр), чтобы удостовериться, что мы генерируем простой одиночный кадр. Затем мы используем метод getFrameFilename, чтобы получить имя файла (с полным путём) отрендеренного кадра (выделено). Далее мы одновременно сохраняем это имя файла и возвращаем его как результат:

context.currentFrame(1)

context.sFrame=1

context.eFrame=1

context.renderAnim

self.result=context.getFrameFilename

return self.result

Последняя часть скрипта определяет функцию run, чтобы запустить сервер Captcha, и вызывает эту функцию, если скрипт выполняется автономно (то есть, если он не был импортирован как модуль). Определив функцию run таким образом, мы можем изолировать часто используемые параметры сервера по умолчанию, как например, номер порта, который прослушивается (выделено), но допустимо повторное использование модуля, если потребовалась другая настройка:

def run(HandlerClass = CaptchaRequestHandler,

ServerClass = BaseHTTPServer.HTTPServer,

protocol="HTTP/1.1"):

port = 8080

server_address = ('', port)

HandlerClass.protocol_version = protocol

httpd = ServerClass(server_address, HandlerClass)

httpd.serve_forever

if __name__ == '__main__':

run

Полный код доступен как captcha.py в файле captcha.blend, и сервер можно запустить несколькими путями: из текстового редактора (с Alt + P), из меню Scripts | render | captcha, или запустив Блендер в фоновом режиме из командной строки. Чтобы остановить сервер снова, необходимо завершить Блендер. Обычно это можно сделать посредством нажатия Ctrl + C в консоли или в окне DOSbox.

Предупреждение

Заметьте, что этот сервер реагирует на чьи угодно запросы, а это далеко небезопасно. Как минимум он должен быть запущен через межсетевой экран, который ограничивает доступ к нему только для сервера, которому требуются вопросы Captcha. Прежде чем запускать его в любом месте, которое может быть доступно из Интернета, вы должны тщательно подумать о безопасности вашей сети!

Итог

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

• Автоматизацию процесса рендера

• Создание множества видов для презентации продукта

• Создание билбордов из сложных объектов

• Манипуляцию изображениями, в том числе результатами рендера, используя библиотеку обработки изображений Python Imaging Library (PIL)

• Построение сервера, создающего изображения по-требованию, которые могут быть использованы как вопросы CAPTCHA

Поделиться с друзьями: