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

Сокращения

Сокращения

В пределах pydriver-выражений можно использовать некоторые полезные сокращения, чтобы экономить на печатании. В пошаговом примере мы уже использовали сокращение ob('<name>') — это обращение к объектам Блендера по имени, аналогично, возможно получить доступ к Меш-объектам и материалам посредством me('<name>') и ma('<name>') соответственно. Кроме того, модуль blender доступен как b,  модуль Blender.Noise как n, и модуль Питона  math как m. Он позволяет выражениям использовать тригонометрические функции, такие как синус, например. Этих возможностей достаточно, чтобы покрыть много проблем, но их все равно не хватит если мы захотим, например, импортировать внешние модули. Есть путь избежать этих трудностей, мы его  увидим в следующем абзаце.

Преодоление ограничений: pydrivers.py

Поле ввода для pydrivers ограничено 125 символами, и даже при том, что сокращения позволяют получить доступ к модулю Питона math и к некоторым из модулей Блендера, с помощью сокращённых выражений, предоставленного места достаточно мало. Кроме того, поскольку pydrivers должны быть выражениями Питона, весьма трудно отлаживать их (например, потому что Вы не можете вставить функцию print) или добавить нечто похожее на функциональность if/then. Последний пример до некоторой степени может быть преодолен хитрыми уловками, основанными на том факте, что Истина (True) и Ложь (False) в Питоне преобразуются в, соответственно, 1 и 0 внутри числового выражения, таким образом утверждение:

if a>b:
    c=14
else:
    c=109

эквивалентно:

c = (a>b)*14 + (a<=b)*109

Однако чувствуется неуклюжесть выражения, ведь мы оцениваем условие дважды. К счастью, и проблему пространства и ограничение единственного выражения можно преодолеть при использовании текстового блока с именем pydrivers.py. Если такой текстовый блок присутствует, его содержание доступно в виде модуля с именем p. Так, например, если мы определяем функцию clamp() (зажим) в pydrivers.py таким образом:

def clamp(a,low,high):
    if a<low : a=low
    if a>high: a=high
    return a

Мы можем вызвать эту функцию в нашем pydriver-выражении как p.clamp (a, 14,109).

Мы будем использовать  pydrivers.py в следующих примерах, не только потому, что это позволит применять более сложные выражения, но также и потому что ширина pydriver области еще меньше чем ее длина, что делает такое выражение очень трудным к прочтению, поскольку Вы должны постоянно пользоваться прокруткой для доступа ко всем частям выражения.

Оглавление книги

Оглавление статьи/книги

Генерация: 0.295. Запросов К БД/Cache: 2 / 0
поделиться
Вверх Вниз