Секреты световой волны

Использование SDK редактора LightWave3D

(Окончание, начало в №41'2008)

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

Итак, мы завершаем серию материалов по великолепному пакету Newtek LightWave3D, и сегодня речь пойдёт о программировании. На самом деле практически каждый серьёзный пакет трёхмерного моделирования, анимации и визуализации имеет свой SDK для третьих "разработчиков" плюс к этому собственный язык сценариев.

Если вы с этим не сталкивались ранее, то можно провести более понятную параллель с известнейшим пакетом Adobe Flash (двухмерная анимация), в его рамках есть ActionScript, на базе которого можно писать сценарии (а скрипт - это и есть язык сценариев), помимо этого, во всех версиях можно добавлять собственные интерфейсные элементы, например, кисточки, фигуры и т.п., что делается на JavaScript. ActionScript был реформирован от простого к сложному, потому как в сегмент флэша вошло много профессионалов от программирования, они придумали даже то, чего изначально разработчики и не планировали (например, программирование в нулевом или первом фрейме). И если изначально AS подразумевал весьма свободный стиль, то третья версия этого языка уже была максимально приближена к... Java. А всё дело в широком спросе на технологии, сравнительной простоте программирования и широком распространении технологии в виде флэш-плееров.

Ситуация с 3D-программами вполне схожа, но только в плане того, что там тоже можно всё описывать скриптами. Конечно, больше всего во всём этом преуспела разработка Softimage|XSI, в которой поддерживаются С/С++/С#/Java/Python и так далее, то есть не нужно ничего дополнительно изучать. Но есть и обратная сторона медали. Скрипты для 3D-пакетов не получили столь широкого распространения, они сложны в силу взаимосвязи с нетривиальными возможностями этого типа софта. То есть, нужно, как минимум, хорошо знать внутреннюю структуру программы, чтобы что-либо для неё написать.

Итак, сегодня мы поговорим о LScript, для программирования на котором в LightWave3D предусмотрен отдельный структурный модуль LScript Editor, хотя его по праву можно считать частью встроенной IDE (LScript Integrated Development Environment (LSIDE)). Здесь вы сталкиваетесь сразу со многим. Во-первых, сама программа LightWave разделена на две ключевые части, во-вторых, предусмотрены слои, в-третьих, моделирование трёхмерное, в-четвёртых, для каждого модуля нужно делать интерфейсные окна в рамках программы, в-пятых, нужно привыкнуть к тому, как сами разработчики её видят, в-шестых, вникнуть в особенности синтаксиса языка, в-седьмых...

Именно во многом поэтому каждый встраиваемый модуль для 3D-пакетов, написанный "третьим разработчиком", так дорого стоит.


Типы переменных

Названия переменных задаются точно так же, как и в большинстве современных языков, то есть, они не должны повторять ключевые слова, содержать пробелы и начинаться с цифр. При этом заглавные и строчные буквы для названий подразумевают разные вещи (в некоторых скриптах это не так). Объявление переменных производится самым простым образом, то есть вы просто пишете название и ставите после него знак "=", после чего пишете значение, а тип устанавливается автоматически. Хотя можно задавать и с помощью "var". Типы переменных:

  • Integer - целые числа
  • Number - числа с запятой
  • String - символьные строки, текст
  • Vectors - в простейшем виде, это векторы с указанием трёх координат в трёхмерном пространстве, например, myVector = <1.5, -0.2, 43>
  • Boolean - булевы, причём как и во множестве скриптов, могут задаваться как 0, 1, true и false
  • Array - массивы

Математические операции стандартны как для всех С++-подобных языков сценариев (вернее, потомков стандарта ECMA-262), так и конкретно С++, за исключением того, что некоторые переменные могут иметь разные типы, то есть, кто знает тот же ActionScript, могут рассказать, что булевы переменные могут участвовать в арифметических операциях наравне с численными. Тут так же.

Также есть и константы, которые "прошиты" внутри программы, например:

LWLIGHT_DISTANT = 0
LWLIGHT_POINT = 1
LWLIGHT_SPOT = 2

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


Функции, объекты, интерфейсные классы

Практически все языки сценариев имеют склонность к структурному программированию, которое на данный момент является самым простым. В LightWave3D мы имеем смесь, то есть, для простейшего моделирования вполне подходит структурный вариант, а для более сложного - объектно-ориентированный, ситуация несколько усугубляется тем, что в рамках программы у нас есть два отдельных модуля: Modeler (моделирование объектов) и Layout (создание анимации, включение объектов и функций сложных типов), к тому же вы ещё можете встретиться с понятием интерфейсных классов. Ситуация запутана, как, впрочем, и сама LightWave. Будем разбираться.

Если говорить о синтаксисе в рамках структурной части, то в LScript мы имеем прямого потомка ECMA-262, то есть:

main
{
 buildFrame();
 buildEngine();
 tires=getTires(1000,10000);
... }

А теперь функция:

getTires: numberOfTires, payment
{
 buyMaterials();
 assembleTires();
 ...создаём код для tires...
 return(tires);
}

Сам синтаксис очень прост, причём будет понятен практически всем, кто знает С++-подобные языки, то есть, те же самые логические равно/не равно и т.п., также структуры if...then...else, case, for, while и т.п., комментарии с помощью "//" или "/*...*/", операция "++", хотя есть и некоторые небольшие синтаксические отличия в рамках основных команд. Например, первая программа "Hello, world!" будет выглядеть так:

main
{
 info("Hello World");
}

Естественно, есть и специфика (как и в любых других скриптах для 3D-пакетов), связанная конкретно с продуктом и его возможностями, то есть предусмотрены внутренние функции типа использования модификаторов: move(), rotate(), bevel(), extrude(), либо с созданием точек и полигонов: addpoint(), addpolygon(), pointinfo(), polysurface. Причём, создание объектов в рамках моделирования начинается с editbegin() и заканчивается editend(), например:

main
{
 editbegin();
 point[1]=addpoint(0,0,0);
 point[2]=addpoint(0,1,0);
 point[3]=addpoint(1,0,0);
 polygon=addpolygon(point);
 editend();
}
...

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

Идём далее... Говоря об объектно-ориентированной части, отметим некоторые отличия от того, к чему привыкли в С++, поскольку классы присутствуют, но на двух уровнях. Например, есть такая вещь, которую проще всего назвать объектами, и в программе они именуются ObjectAgents. Эти структуры могут хранить в себе данные, функции, т.е. методы, имена, описания типов, флаги и т.п.

Вызываются так же, как и классы с их методами в обычном программировании:

nameOfVMap=vmapObj.name;

Но при этом мы говорим об объектах.

Что касается интерфейсных классов... Уф-ф. Под этим подразумеваются некие глобальные классы Modeler, Generic и Layout, в рамках которых содержатся все соответствующие функции, константы и т.п., кои можно применять при программировании. И как вы понимаете, для каждого случая состав их различен. То есть, то, что нужно при моделировании, не обязательно при анимации, и наоборот. Дело в том, что и интерфейсы самих программ Modeler и Layout существенно различаются по внутреннему наполнению. Основное отличие программирования именно под LightWave состоит в том, что, находясь в Layout, вы вообще не можете ничего моделировать на серьёзном уровне, а будучи в Modeler, вам не доступны свойства анимации и варианты создания динамических сцен.

Но при этом встроенная IDE позволяет создавать и общие интерфейсные элементы любого уровня сложности для всех случаев, если сказать об отсутствии привязки к моделированию и анимации, то вы можете написать, например... калькулятор (и там, и там). Причём есть специальный модуль, в котором создаётся дерево переменных, создаётся окно с полями ввода и вывода, закладками и т.п. Для этих целей в рамках IDE есть технологическое расширение What-You-See-Is-What-You-Get (WYSIWYG).


В завершение

Как видите, главное - это не запутаться. Да, LightWave3D сложна, как в освоении моделлерами и аниматорами, так и в написании дополнительных программ для неё. Но, в силу этой сложности и достаточно большого распространения продукции от Newtek, на этом можно зарабатывать деньги. В других 3D-пакетах всё несколько проще, да и плагинов к ним выпускается больше.

Кстати, в начале-середине 2000-х было сразу несколько попыток создания трёхмерных игр прямо внутри 3D-программ, скорее всего, эта волна родилась после успешного шествия Adobe Flash и флэш-игр. Но пока всё это представляется весьма сложным.

Кристофер,
[email protected]

Версия для печатиВерсия для печати

Номер: 

02 за 2009 год

Рубрика: 

Графика
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!