В этой части упражнения с помощью MAXScript заставим плавать одну из рыбок по заданному пути.
В папке Chapter Example Files на прилагаемом компакт-диске найдите файл Chap 12 . zip, распакуйте его и откройте файл Fish scene.max. В файле находятся две рыбки и объект Dummy, движущийся по определенному' пути. Нам нужно с помощью MAXScript создать небольшую стаю рыбок, "плавающих" за объектом Dummy по определенному маршруту. Нажмите клавишу <F11> и в появившемся окне MAXScript Listener выберите команду File>New Script. В появившемся окне редактора MAXScript введите следующее: Выберите команду File>Evaluate All или нажмите комбинацию клавиш <Ctrl+E> для выполнения введенного сценария. Активизируйте окно проекции Camera01 и щелкните на кнопке Play Animation (Воспроизвести анимацию). Вы увидите, как рыбка перемещается вдоль пути. Один из кадров этой анимации показан на рис. 40.11.В сцене созданы две рыбки, и для окончательного вида анимированной сцены необходимо добавить код для анимации второй рыбки.
Добавьте в начало сценария следующие три строки кода (изменения выделены полужирным шрифтом):Выберите команду File>Evaluate All или воспользуйтесь комбинацией клавиш <Ctrl+E>, чтобы еще раз запустить сценарий и затем его анимировать. На рис. 40.13 вы видите двух "оживленно плавающих" рыбок.
Попробуем изменить положение рыбки во время перемещения и добавить анимацию хвоста, что сделает сцену более реалистичной. Кроме того, заставим рыбку двигаться "непредсказуемо", что впоследствии передастся и другой рыбке после ее добавления.
Итак, для улучшения анимации выполните следующее.
Введите обновленный сценарий (новые команды выделены полужирным шрифтом). Сохраните сценарий, выбрав команду File>Save, а затем нажмите комбинацию клавиш <Ctrl+E> для его выполнения. Файл этого сценария (FishPath2 . ms) можно найти в каталоге Chapter Example Files. Активизируйте окно проекции Camera01 и щелкните на кнопке Play Animation. На рис. 40.12 показан один из кадров анимации. Обратите внимание на положение головы рыбки и движение хвоста.В этой главе речь пойдет о средстве MAXScript, его возможностях и области применения. Выше уже указывалось, что MAXScript используется хтя расширения функциональности 3ds max. С помощью MAXScript можно настроить работу программы по своему вкусу. Кроме того, это средство используют как рекордер, предназначенный для записи и дальнейшего воспроизведения определенной последовательности действий.
MAXScript позволяет пользователю "обсудить" с программой ту или иную сцену и в точности объяснить 3ds max. что должно произойти. Для этого достаточно либо наглядно продемонстрировать операцию, либо ввести несколько инструкций, которые программа должна выполнить.
Одно из наиболее важных свойств MAXScript — простота использования. Однако это вовсе не означает функциональную простоту. Не стоит также рассматривать MAXScript как новую "игрушку" в арсенале инструментов 3ds max. С помощью встроенного языка сценариев MAXScript вы сможете управлять практически любой частью программы 3ds max.
Фактически вы уже используете MAXScript, даже не подозревая об этом. Некоторые из кнопок и разворачивающихся панелей являются частью встроенных сценариев. Созданную с помощью MAXScript новую функцию несложно интегрировать в 3ds max и затем работать с ней, как с любым другим средством.
MAXScript — полнофункциональный и довольно мощный язык сценариев. Для его использования не нужно быть компьютерным гением или иметь опыт программирования на одном из распространенных языков. В следующих разделах приводятся основные сведения об этом языке, и совсем скоро вы поймете, что вся рутинная работа может выполняться автоматически, а в ваших сценах появится "изюминка". Для этого достаточно лишь ознакомиться с MAXScript.
Следует отметить, что для полного описания возможностей MAXScript не хватило бы и целой книги. Так что эту главу можно считать введением в основы программирования на встроенном языке сценариев 3ds max. Более фундаментальные сведения вы найдете в соответствующей литературе.
Цикл (loop)— это конструкция MAXScript, с помощью которой можно управлять потоком выполнения сценария: определенные действия выполняются несколько раз. например.
В приведенном примере MAXScript использует две переменные — i и j. В начале приведенного фрагмента переменная j устанавливается равной 0, а значение переменной i изменяется от 1 до 5. Таким образом, код. помещенный в тело цикла (между скобками), будет выполняться пять раз. Каждый раз значение переменной i увеличивается на единицу. В теле цикла текущее значение переменной i добавляется к значению переменной j. Можете ли вы ответить на вопрос: "Какое значение примет переменная j в конце выполнения приведенного фрагмента кода?". Верный ответ— 15. Посмотрим, как изменяются значения переменных в процессе выполнения этого фрагмента кода.
Цикл полезно использовать для последовательного доступа к элементам коллекции или массива. В следующем фрагменте кода каждому чайнику сцены назначается голубой цвет:
Цикл также применяется для создания группы объектов, например:
В данном фрагменте кода используется ключевое слово collect для создания коллекции. В строке
создается сфера с радиусом 15. В данном фрагменте создается 10 сфер сцены. К сожалению, все создаваемые сферы помещаются в одно и то же место. Попробуем их немного разнести в пространстве. Для этого используйте следующий фрагмент кода:
Проанализируйте приведенный фрагмент. В цикле for обрабатывается каждая сфера коллекции, т.е. координаты [i,i,i] каждой сферы изменяются с помощью выражения i + 10.
Функции (functions) — это части MAXScript, которые работают подобно программам. Например, для вычисления среднего значения массива значений можно использовать следующий фрагмент:
В приведенном фрагменте вычисляется среднее значение коллекции значений numbers. У этого кода есть один недостаток: его необходимо вводить (или копировать и вставлять) в то место сценария, где требуется вычислить среднее значение. При таком подходе сценарий "разбухает" и становится сложным для понимания.
Для решения описанной проблемы можно использовать функцию. В начале сценария определяется функция вычисления среднего значения.
Теперь в любой части сценария, где необходимо вычислить среднее значение, можно использовать следующий код:
В приведенной строке используется коллекция num, а ее усредненное значение сохраняется в переменной Ave. Теперь сценарий стал более коротким и удобочитаемым, а если вы ошиблись в определении функции, ошибку нужно исправить только в одном месте сценария, а не "рыскать" по всему сценарию в поисках неверного выражения.
В первой строке приведенного выше фрагмента кода создается новая функция с именем
Для нормальной работы функции необходимо передать ей данные, определенные переменной numbers. В теле самой функции для ссылки на полученные данные используется все та же переменная numbers, а во время вызова функции (например, average num) имя реальной переменной значения не имеет.
Очень просто создать функцию, которая использует несколько элементов данных. Например, в строке |
В следующих двух строках
создаются две переменные и их значения устанавливаются в 0. Ключевое слово local указывает, что переменные принадлежат этой функции, т.е. эти переменные недоступны в остальной части сценария. Вы можете использовать в функции и в сценарии переменные с одинаковыми именами, и при этом конфликт не возникнет. В последней строке
используются значения переменных Total и Count для вычисления среднего значения, т.е. результата вычисления функции.
Художнику, работающее в 3ds max, предоставляется максимум возможностей, поскольку в этой программе реализованы все необходимые инструменты и средства. Этих средств довольно много, к тому же существует огромное количество способов их использования; таким образом, вы можете годами работать с 3ds max и всякий раз открывать для себя что-то новое. Но, несмотря на столь широкие возможности программы, иногда возникает необходимость в том или ином средстве, не предусмотренном разработчиками. С помощью средства MAXScript вы сможете расширить функциональность программы, настроить ее работу под свои запросы и сделать так, что 3ds max сама выполнит часть рутинной работы.
MAXScript в программе 3ds max присутствует буквально всюду. В этом разделе вы ознакомитесь с инструментами MAXScript, а также узнаете, как пишутся и работают различные сценарии.
Для создания и использования сценариев MAXScript в 3ds max предусмотрено несколько средств. Рассмотрим их подробнее.
Макросценарии создаются с помощью средства Macro Recorder. Любой сценарий, который запускается с помощью кнопки панели инструментов, можно назвать макросценарием Команды сценария сохраняются в виде файла. Для вызова макросценария из другого сценария используется команда macros, например: macros.run "objects" "sphere"
Применение этой команды приведет к тому, что в процессе выполнения сценария objects будет запущен макросценарий sphere.
Чаще всего для макросценариев не требуется вводить пользовательские данные; достаточно лишь щелкнуть на кнопке.
Меню MAXScript содержит команды, с помощью которых новые сценарии создают (New Script), открывают (Open Script) и выполняют (Run Script), а также команды для открытия окна MAXScript Listener (клавиша <F11>) и запуска средства Macro Recorder (Запись макроса).
Команда New Script (Создать сценарий) открывает окно редактора MAXScript. Это простейший текстовый редактор, в котором пишутся сценарии. (Более подробно об этом речь идет в разделе "Окно редактора MAXScript".) Команда Open Script (Открыть сценарий) открывает диалоговое окно Choose Editor File (Выбор файла) для выбора файла MAXScript. Выбранный файл сценария открывается в окне редактора MAXScript (рис. 40.1). Расширения файлов MAXScript— .ms и .mcr. Команда Run Script (Выполнить сценарий) также открывает диалоговое окно Choose Editor File, где выбирают файл сценария, который необходимо выполнить.
На рис. 40.4 показано окно MAXScript Listener (горячая клавиша <F11>), с помощью которого можно "общаться" с частью программы 3ds max, интерпретирующей команды MAXScript. В верхней части этого окна (с розовым фоном) вводят команды MAXScript, в нижней (с белым фоном) отображаются результаты выполнения сценария. Впрочем, команды MAXScript можно вводить и в нижней части окна MAXScript Listener, но в этом случае вам придется "отсеивать" текст сценария от результатов его выполнения.
В окне редактора MAXScript можно открывать и редактировать любой тип текстового файла, но чаще всего это окно используется для редактирования файлов сценариев MAXScript. Вы можете открыть только одно окно MAXScript Listener, а окон редактора MAXScript — сколько угодно.
Чтобы открыть новое окно редактора MAXScript, выберите команду MAXScript^ New Script, либо команду File>New Script (Файл>Создать сценарий) в меню окна MAXScript Listener, либо щелкните на кнопке New Script (Создать сценарий) в разворачивающейся панели MAXScript вкладки Utilities. Окно редактора MAXScript можно использовать для редактирования ранее созданных сценариев.
Для создания нового сценария лучше открыть два окна: MAXScript Listener и окно редактора MAXScript. Так можно создавать отлаженный код, т.е. вы тестируете фрагмент кода в окне MAXScript Listener, а затем вставляете его в окно редактора.
Выполнить фрагмент кода сценария можно непосредственно в окне MAXScript Listener. Для этого выделите фрагмент кода в окне редактора MAXScript и нажмите комбинацию клавиш <Shift+Enter> (или клавишу <Enter> на цифровой клавиатуре). Выделенный фрагмент будет скопирован и выполнен в окне MAXScript Listener. |
Команды меню File, Search и Help в окне редактора MAXScript аналогичны командам меню окна MAXScript Listener, за исключением Evaluate All (Выполнить все). Эта команда (Fil>Evaluate All) предназначена для быстрого тестового выполнения всего сценария. Без нее вам пришлось бы выделить весь сценарий, копировать его в окно MAXScript Listener, последовательно переместить курсор в конец каждой строки и нажать клавишу <Enter>.
Меню Edit (Правка) включает команды, позволяющие отменить последнее действие (Undo или <Ctrl+Z>), вырезать текст в буфер (Cut или <Ctrl+X>), копировать в буфер (Сору или <Ctrl+C>) и удалить текст (Delete или <Delete>). В этом же меню с помощью команд New Rollout и Edit Rollout (<F2>) можно попасть в окно Visual MAXScript. Кроме этого, в меню Edit находится команда Select All (Выделить все), ей соответствует комбинация клавиш <Ctrl+A>. Аналогичные команды находятся в контекстном меню, появляющемся после щелчка правой кнопкой мыши в любой части окна редактора MAXScript.
Окно Visual MAXScript подробно описано в главе 41, "Использование средства Visual MaxScripF. |
Понятие переменная в MAXScript практически идентично аналогичному понятию в алгебре. Переменная в MAXScript представляет собой контейнер, в который можно что-то поместить, а позднее извлечь. Однако, в отличие от алгебраических, переменная в MAXScript может содержать не только числовые значения.
Для присвоения значения переменной необходимо использовать символ равенства. Например, если вы введете X = 5 * 3 в окне MAXScript Listener, программа 3ds max вычислит правую часть выражения и сохранит результат в переменной X. В рассматриваемом примере 3ds max умножит 5 на 3 и результат (15) сохранит в переменной X. Просмотреть значение переменной в окне MAXScript Listener можно, введя X и нажав клавишу <Enter>. Программа 3ds max отобразит значение 15, хранящееся в этой переменной.
Переменным можно присваивать любые имена. Однако всегда помните правило: имя переменной должно отражать ее суть. Например, для хранения числа объектов, с которыми вы собираетесь работать, лучше использовать имя objCount, чем Z.
Имя переменной должно начинаться с буквы, а не с цифры. Кроме того, оно не может содержать специальных символов, например пробелов, запятых или кавычек. Допускается использование символа подчеркивания и любых буквенных символов. |
Переменные также могут содержать строки, которые представляют собой группы символов, например: badDay = "Monday" В приведенном примере переменной badDay присваивается значение Monday. Для объединения двух строк можно использовать символ "+", например: grouchy = "My least favorite day is" + badDay В этом примере переменной grouchy присваивается значение My least favorite day is Monday.
Теперь попробуйте ввести в окно MAXScript Listener следующее: wontWork = 5 + "cheese". Программа 3ds max возвратит сообщение об ошибке, поскольку нельзя добавить к числу текст. Значения 5 и cheese представляют собой два различных типа данных. Типы данных — это различные классы значений, которые могут быть сохранены в переменных. Практически всегда можно смешивать значения одинаковых типов данных, в то время как смешивание значений различных типов данных смысла не имеет.
Для просмотра типа данных переменной используйте команду classof. Например, чтобы просмотреть тип данных переменной grouchy, описанной выше в этой главе, введите команду classof grouchy, и 3ds max возвратит значение String (Строковая переменная) |
В 3ds max довольно часто используется тип данных Point 3, который представляет трехмерные координаты. Ниже приведен пример использования этого типа данных.
Pos = [5,3,2] -- Создание новой точки с координатами (5,3,2) Pos.x =7 -- Изменить значение координаты х на 7 -- Теперь координаты точки выглядят так: (7,3,2) Pos = Pos + (1,2,5) -- К старому значению переменной Pos -- добавляется новое (1,2,5), и это вычисленное -- значение (8,5,7) присваивается переменной PosКроме основных типов данных, каждый объект сцены обладает собственным типом данных. Например, если применить команду classof к сфере. 3dsmax вернет значение Sphere. Типы данных объектов сцены являются сложными типалш данных или структурами, т.е. они выступают группами других типов данных в одном модуле. Часть данных сложного объекта называется свойствами. У большинства объектов сцены есть свойство Name, которое имеет тип данных String. Это свойство описывает имя объекта. Еще одно наиболее общее свойство объектов — Position (тип данных Point3), описывающее положение объекта в пространстве.
В 3ds max существует встроенная переменная — $ (символ доллара), которая представляет текущий выделенный объект. Эта переменная описывается в следующем упражнении.
Упражнение: использование переменных
Рассмотрим переменные М AXScript, применяемые для манипуляции объектами сцены. Чтобы с помощью переменных управлять объектами сцены, выполните следующее.
В папке Chapter Example Files на прилагаемом компакт-диске найдите файл Chap 4 0 . zip, распакуйте его и откройте файл Teapot .max. В файле содержится модель обычного чайника. Щелкните правой кнопкой мыши на имени окна проекции Left и из появившегося контекстного меню выберите команду Views>Extended>MAXScript Listener (Виды> Дополнительные>Окно MAXScript Listener). Окно MAXScript Listener появится в окне проекции Left. Выделите чайник, введите в окне MAXScript Listener символ $ и нажмите клавишу <Enter>. Программа вернет информацию о чайнике. Введите следующие строки, чтобы посмотреть значения свойств объекта Teapot: $.position $.wirecolor $.radius $.name $.lid Введите следующие строки, т.е. установите значения свойств объекта Teapot: $.lid = false $.position.x = -20 $.segs = 20На рис. 40.9 представлены команды и результаты их выполнения в окне MAXScript Listener, а также объект Teapot после выполнения введенных команд.
Программа 3ds max выполняет сценарий с начала и до конца, строка за строкой. (Далее в этой главе рассматриваются ключевые слова, с помощью которых можно управлять порядком выполнения сценария.)
В код сценария можно добавлять комментарии или примечания, которые помогут понять назначение команд. Комментарий должен начинаться с символов - -. Когда 3ds max встречает эти два символа, вся информация после них и до конца текущей строки игнорируется, а затем выполнение передастся следующей строке сценария. Например, в команде $Torus01.pos = [0,0,0] -- Переход к началу координат программа выполнит только первую часть строки (переместит объект к началу координат), а информацию после символов - - проигнорирует.Не забывайте добавлять комментарии к сложным сценариям, так как с их помощью мож но понять, что же делает этот сценарий. Кроме того, если вы через некоторое время решите повторно использовать сценарий, достаточно будет просмотреть комментарии, чтобы выяснить его назначение.
Поскольку 3ds max игнорирует все, что находится после символов - -, можно использовать это свойство для временного исключения команд из сценария Таким образом, вам не нужно удалять целую строку— достаточно ввести в ее начало только два символа. |
Выражение 1 < 2 является простым, аналогичным вопросу "Единица меньше двух". Выражения соответствуют вопросам, предполагающим ответ "да/нет". При вводе выражения в окно MAXScript Listener программа вычисляет его, а затем отображает результат вычислений: true (выражение верное) или false (выражение неверно). Попробуйте ввести следующие выражения в окно MAXScript Listener и просмотрите результат (рис. 40.10). (Комментарии вводить не нужно.)
Для доступа к этой панели (рис. 40.2) активизируйте вкладку Utilities (Утилиты) панели Command и щелкните на кнопке MAXScript. В появившейся разворачивающейся панели дублируется большая часть команд меню MAXScript.
При выполнении команды Run Script некоторые сценарии немедленно выполнят то или иное действие, а некоторые инсталлируют себя в качестве новых инструментов программы. |
Команда MAXScript Listener (Отладка сценариев) служит для открытия одноименного окна. Это же окно можно открыть с помощью клавиши <F11>. Команда Macro Recorder запускает процесс записи макроса MAXScript. Окно MAXScript Listener и процесс записи макросов рассматриваются несколько ниже в этой главе.
В этой же панели находится раскрывающийся список Utilities (Утилиты) с перечислением всех установленных сценарных утилит. Каждая такая утилита представляет собой новое средство 3ds max. Параметры выбранной утилиты выводятся в дополнительной разворачивающейся панели, которая находится под панелью MAXScript.
Создавать сценарные утилиты проще всего с помощью средства Visual MAXScript. Это средств подробно рассмотрено в главе 41, "Использование средства Visual MaxScript". |
Если в любой части окна MAXScript Listener ввести выражение и нажать <Enter>, интерпретатор MAXScript просчитает его и выдаст полученный результат. Например, если в нижней части окна ввести простейшее математическое выражение 2+2 и нажать <Enter>, в следующей строке появится результат (4), выделенный синим цветом. При возникновении ошибки в окне MAXScript Listener появляется соответствующее сообщение, выделенное красным цветом. Если, например, ввести фразу hello there (и нажать <Enter>), появится сообщение об ошибке Type error (Ошибка ввода), поскольку для интерпретатора эта фраза не является командой или выражением.
Интерпретатор MAXScript — инструмент весьма капризный. Причиной ошибки может стать неверный ввод команды, но в то же время прописные и строчные символы программой воспринимаются одинаково. Это значит, что слова sphere. Sphere и SPHERE для 3ds max означают одно и то же. |
В основном меню окна MAXScript Listener представлен ряд элементов.
File (Файл). В этом меню содержатся команды закрытия окна (<Ctrl+W>), сохранения работы (<Ctrl+S>), запуска сценариев (<Ctrl+R>), открытия сценария для редактирования (<Ctrl+O>) и создания нового сценария (<Ctrl+N>). Edit (Правка). В этом меню можно получить доступ к наиболее общим функциям редактирования, в частности вырезание (Cut), вставка (Paste) и отмена (Undo). Search (Поиск). С помощью этого меню можно выполнить поиск определенного текста в сценарии (<Ctrl+F>), продолжить поиск (<Ctrl+G>) и осуществить замену текста (<Ctrl+H>). MacroRecorder (Запись). В этом меню можно настраивать различные параметры средства записи сценариев MAXScript. Help (Справка). Меню обеспечивает доступ к справочной системе MAXScript (<F1>).На рис. 40.5 изображено окно MAXScript Listener с соответствующими командами и сообщениями о результатах их выполнения. На рис. 40.6 показаны готовые объекты в окне проекции, созданные с помощью MAXScript.
Обратите внимание: основная цель приведенных выше примеров— показать, что с помощью MAXScript выполняются любые действия. Каждое свойство объекта, доступ к которому можно получить с помощью элементов интерфейса, используют также и с помощью сценариев. Применяя сценарий MAXScript, можно автоматически создать законченную сцену.
Программа 3ds max сохраняет в памяти значение последней выполненной команды. Доступ к этому значению можно получить с помощью специальной переменной ? (вопросительный знак). Например, если в окно MAXScript Listener вы ввели 5+5 и нажали клавишу <Enter>, то программа вычислит значение введенного выражения и отобразит результат— 10. Теперь результат вычисленного выражения можно использовать в последующих выражениях MAXScript. Например, если ввести $Torus01.radius2 = ?, то 3ds max вместо символа ? подставит значение 10. |
В левом нижнем углу окна 3ds max 5 расположены два поля (рис. 40.7), дублирующие верхнюю и нижнюю часть окна MAXScript Listener. Чтобы эти поля были хорошо видны, перетащите левую границу строки состояния вправо. Щелчок правой кнопкой мыши в любом из этих полей открывает контекстное меню. В верхней части этого меню расположена команда для открытия окна MAXScript Listener, в нижней — текущие команды этого окна.
Поэкспериментируйте с простыми выражениями, пока не выясните окончательно их назначение. Вы должны интуитивно чувствовать, когда выражение возвращает значение true, а когда false.
Теперь рассмотрим более подробно описанный сценарий. В нескольких первых строках объявляются переменные, которые затем используются в сценарии. Переменная pathObj описывает путь, по которому плывет рыбка, a f ishObj — саму рыбку. (Обратите внимание, что вторая переменная указывает на часть иерархической группы — имя объекта, символ / и дочернюю часть.) Создавать две переменные для каждой рыбки нет необходимости. Поскольку действия первой рыбки будут идентичны действиям второй, то можно использовать одинаковый код. изменив лишь имя Fishl на Fish2.
В этом сценарии используется переменная relPos, которая указывает на положение рыбки относительно объекта Dummy. Если в сцене создано несколько рыбок, то каждую из них можно заставить плавать по собственному пути.
Со следующим блоком сценария вы ранее не сталкивались: это конструкция animate on, с помощью которой дается указание сгенерировать ключевые кадры анимации. Действия описываемой конструкции аналогичны щелчку на кнопке Auto Key, запуску сценария и деактивизации этой кнопки. Таким образом, команды, находящиеся в скобках после animate on, предназначены для создания ключевых кадров анимации. Команды, находящиеся в скобках, называются блоком (block).
BiryTpn блока анимации используется цикл, выполняющийся 100 раз (это число соответствует числу кадров анимации). В определении цикла применяется команда at time t — указание использовать текущее значение переменных. Например, если вы желаете, чтобы рыбка следовала по определенному пути, необходимо знать текущее положение объекта в каждый момент времени вместо начального.
Внутри цикла выполняется непосредственное текущее изменение координат рыбки.
Теперь проанализируем обновленный сценарий. В нем добавляется новая переменная (fishTail), которая связана с хвостом рыбки. Благодаря этому при добавлении другой рыбки ее хвост также можно привести в движение. Для моделирования движения хвоста используется модификатор Bend (Изгиб), который установлен в 0, что соответствует оси X. (Можно поэкспериментировать и с другими значениями, чтобы увидеть, как меняется параметр оси в разворачивающейся панели модификатора.)
Затем в сценарии создается несколько переменных. Переменная zadd определяет смещение рыбки относительно оси Z на каждом шаге (не хотелось бы, чтобы наша рыбка плавала все время на одной и той же глубине). Переменные tailFlapOf f set и tailFlapRate используются для управления движением хвоста. (Остановимся на этом подробнее, когда доберемся до соответствующего фрагмента сценария.)
Обратите внимание, что в цикле координата Z заменяется относительной координатой Z. так что каждая рыбка должна плавать на своей глубине, не зависящей от глубины расположения объекта Dummy. Затем на каждом шаге к переменной zadd добавляется координата Z, поэтому рыбка плавно "поднимается" к поверхности и так же плавно "уходит" на глубину. Будьте осторожны, чтобы рыбка не "выпрыгнула" из воды или не "зарылась" в дно. Для этого используется случайное значение в диапазоне от 1 до 100 (random 1 100). Если случайное значение становится больше 90, то в значении переменной zadd знак изменится на противоположный, что заставит рыбку изменить направление движения по вертикали. Здесь можно сказать так: "Существует 90%-ная вероятность того, что рыбка продолжит движение в том же направлении, и 10%-ная — что направление ее движения изменится".
В следующей части сценария для отображения движения хвоста вновь используется модификатор bend. Для плавного и выразительного движения хвоста используется функция sin. Если вы не забыли школьный курс тригонометрии, то, вероятно, помните, что значения синуса изменяются в пределах от 1 до -1. Умноженные на 50 значения функции будут лежать в диапазоне от 50 до -50. С помощью значения переменной tailFlapOffset достигается несущественное расхождение в движениях хвоста рыбок (всегда помните о том, что сцены должны быть максимально реалистичными). А с помощью переменной tailFlapRate достигается разная частота взмахов хвостом.
Последнее, что осталось сделать, — это заставить рыбку двигаться по определенному пути, причем головой вперед. Для этого используется следующий код (для удобства он разбит на две строки):
В конструкции in coordsys используется значение точки просмотра обычной координатной системы. Вместо переменной pathObj используется координата вращения Z в глобальной, локальной, экранной или родительской системе координат. В данном случае вращение рыбки осуществляется в той же системе координат, которая используется для объекта Dummy. Чтобы добавить элемент случайности в движение рыбки, несколько усложним код:
Вначале старую координату вращения Z сохраняем в переменной oldRt, а новое положение— в переменной newRt. Случайное число используется для принятие дальнейшего решения, т.е. в 85% случаев направление движения не изменяется, однако в 15% необходима корректировка направления. Вычисленная разность между новым и старым вращением умножается на случайное значение из диапазона 0,5-1,5. Другими словами, вращение корректируется, если вычисленная разность лежит в диапазоне 50-150%. Таким образом, рыбка будет плыть по заранее определенному пути, но иногда возможны небольшие "смещения".
В MAXScript можно использовать "сокращенный" вариант присвоения значений переменным. Вместо а=а+Ь можно написать а+=Ь. Эти два оператора идентичны. |
В этом сценарии генерируются ключевые кадры для второй рыбки с помощью изменения переменных fishObj и fishTail, которые теперь указывают на вторую рыбку. Кроме того, координаты двух рыбок отличаются, так что рыбки в процессе "заплыва" не столкнутся.
Эта категория сценариев наиболее сложная: необходимо создать сценарий, который функционирует как дополнение, написанное на языке C++. Сценарные дополнения могут выполнять разнообразнейшие функции: от создания новых фигур до управления картами и материалами или создания специальных эффектов визуализации.
Эта категория сценариев (как видно из ее названия) в качестве основного управляющего инструмента использует мышь, т.е. операции щелчка, а также щелчка и перетаскивания. Например, такой тип сценария можно использовать для создания новых типов примитивов. Таким образом любой новичок программы 3ds max 5 сможет создавать объекты подобного типа так же просто, как. скажем, параллелепипед или сферу.
При щелчке правой кнопкой мыши на каком-либо объекте сцены появляется контекстное меню (напоминающее квадменю), из которого можно выбирать необходимые команды. С помощью сценариев этой категории также добавляют необходимые команды в контекстные меню. Если вы создаете сценарий, который модифицирует свойства объекта, то лучше всего разместить команды его запуска в контекстном меню.
Сценарии этой категории создают собственную разворачивающуюся панель в панели Utilities. Подобная утилита — SphereArrax — рассматривалась ранее в одном из упражнений этой главы. Сценарные утилиты особенно полезны при изменении параметров сценария, в частности в примере со сценарием SphereArray это было значение радиуса сферы.
Создавать сценарные утилиты проще всего с помощью средства Visual MAX-Script, которое подробно рассматривается в главе 41, "Использование средства Visual MaxScript". |
Иногда в выражениях необходимо использовать несколько фрагментов данных. Для этого в MAXScript применяются операторы and, or и not.
С помощью оператора and (логическое И) два выражения объединяются, т.е. оба они должны быть истинными. Если это условие выполняется, то все выражение является истинным. Но если одно из выражений (или оба) ложное, то все выражение является ложным. Для группировки выражений можно использовать скобки, например:
(1<2) and (1<3) -- истинно, поскольку (1<2) - истинно И (1<3) тоже истинно
Оператор or (логическое ИЛИ) подобен оператору and, за исключением того, что выражение с этим оператором истинно, если хотя бы одна часть или же обе его части истинны, например:
Разберитесь с приведенными ниже выражениями и постарайтесь понять принципы их работы.
Оператор not (логическое НЕ) изменяет значение выражения из истины в ложь и наоборот, например.
В этом разделе речь пойдет об основах языка MAXScript. Здесь же вы узнаете, как использовать различные возможности MAXScript в ваших собственных сценариях. Результат выполнения любой из приведенных в этом разделе команд можно исследовать с помощью окна MAXScript Listener (Отладка сценариев).
Материал следующих нескольких разделов может показаться вам знакомым, если вы прочитали главу 29, "Использование выражений". Дело в том, что для построения выражений используются практически те же конструкции, что и в языке сценариев MAXScript |
С помощью этого средства можно записать ваши действия в виде сценария MAXScript, а затем повторить их в автоматическом режиме. После записи сценарий необходимо "очистить" от ненужных или ошибочных команд. Эту операцию можно осуществить в окне редактора MAXScript.
Активизируют средство записи сценариев одним из следующих способов: выбрав команду MAXScript>Macro Recorder (MAXScript>Запись сценариев) в меню 3ds max или команду MacroRecorder>Enable (Запись сценариев>Активизировать) в меню окна MAXScript Listener. Флажок, расположенный слева от команды Macro Recorder в меню MAXScript, означает, что средства записи сценариев активизированы.
При активизации средства записи сценариев каждое ваше действие преобразуется в команду сценария MAXScript, которая отображается в верхней части окна MAXScript Listener. Таким образом, вы сможете скопировать результаты записи в файл или же открыть их в окне редактора MAXScript. Запись сценария будет продолжаться до тех пор, пока вы не выберете повторно команду активизации/деактивизации средства записи.
Меню MacroRecorder окна MAXScript Listener включает ряд команд для настройки средства записи.
Enable (Активизировать). Команда активизации средства записи сценариев. Explicit scene Object name (Явные имена объектов сцены). При выборе этой команды средство записи сценариев использует те же имена объектов в сценарии, что и в сцене, независимо от текущего выделенного объекта при повторном запуске сценария. Например, если при записи сценария был перемещен объект сцены $Pyramid01, то впоследствии этот сценарий будет оперировать только с объектом сцены $Pyramid01. Selection-relative scene object names (Имена объектов сцены зависят от выделения). При выборе этой команды средство записи сценариев использует текущий выделенный объект сцены. Например, если при записи сценария был перемещен объект сцены $Pyramid01, а при повторном запуске выделен другой объект, то все команды сценария будут применяться к этому выделенному объекту.
Прежде чем записывать сценарий, ответьте на вопрос: "Должен ли новый сценарий манипулировать определенным объектом сцены?". |
Все создаваемые сценарии разделяются на несколько категорий. Более подробную информацию о разделении сценариев можно найти в справочной системе программы 3ds max.
Для того чтобы отнести сценарий к той или иной категории, необходимо посмотреть, какие действия выполняет сценарий, создается ли пользовательский интерфейс и т.д. Ниже приведены основные категории сценариев MAXScript.
Рассмотрим простой пример использования средства MAXScript. В каталоге Chapter Example Files прилагаемого компакт-диска в файле Chap 40 . zip находится файл сценария SphereArray.ms. Его действия аналогичны выбору команды Tools>Array (Сервис>Массив), за исключением того, что сценарий создает копии объекта и случайным образом помещает их на поверхности сферы.
Для загрузки и выполнения сценария SphereArray выполните ряд действий.
В папке Chapter Example Files на прилагаемом компакт-диске найдите файл Chap 40. zip, распакуйте его и откройте файл SphereArray .max. В файле находится элементарный параллелепипед. Выделив параллелепипед, активизируйте вкладку Utilities (на пиктограмме которой изображен молоток) панели Command и щелкните на кнопке MAXScript. Появится одноименная разворачивающаяся панель. Щелкните на кнопке Run Script. В появившемся диалоговом окне Choose Editor File (Выбор файла) выделите файл SphereArray.ms и щелкните на кнопке Open (Открыть). Сценарий SphereArray будет установлен и появится в раскрывающемся списке Utilities разворачивающейся панели MAXScript. (Запуск утилиты SphereArray приведет только к ее установке, поскольку это сценарная утилита.) Убедитесь в том, что параллелепипед по-прежнему выделен, затем из раскрывающегося списка Utilities выберите элемент SphereArray. Появится разворачивающаяся панель SphereArray. В поле Object Count (Число объектов) разворачивающейся панели SphereArray введите 50, а в поле Radius (Радиус) — значение 2,0. Для запуска сценария щелкните на кнопке Go (Выполнить). В результате выполнения сценария к сцене будет добавлено 50 копий параллелепипеда, расположенных в произвольном порядке на расстоянии 2 единицы от исходного объекта.На рис. 40.3 показан результат выполнения сценарной утилиты SphereArray. Обратите внимание на то, что этот сценарий и его параметры во многом напоминают другие инструменты и средства 3ds max.
В этом разделе рассматривается несколько основных команд MAXScript, которые можно вводить в окно MAXScript Listener.
Чтобы начать работу с MAXScript, выполните следующее.
Верните 3ds max в исходное состояние, выбрав в главном меню программы команду File>Reset. Выберите команду MAXScript>MAXScript Listener (или нажмите <F11>), чтобы открыть окно MAXScript Listener. Щелкните в любом месте нижней части окна и введите выражение sphere() Нажмите клавишу <Enter>. Программа создаст сферу с параметрами, заданными по умолчанию. Затем в нижней части окна MAXScript Listener введите следующее выражение: Torus radiusl:50 radius2:5 Нажмите <Enter>. MAXScript создаст тор с внешним радиусом (параметр radius 1) 50 и внутренним (параметр radius2)— 5. В результате выполнения команды появится сообщение, что программа 3ds max создала в начале системы координат новый объект — тор, присвоив ему имя Torus01. Теперь с помощью MAXScript переместим тор. В окне MAXScript Listener введите $Torus01.position.x=20 Нажав клавишу <Enter>, вы увидите, как тор немного сместится относительно оси X. Каждый объект 3ds max обладает определенными свойствами или атрибутами, доступ к которым можно получить как с помощью программных средств, так и через разворачивающиеся панели или другие элементы управления. Описанную команду трактуют следующим образом: установить значение координаты х объекта Torus01, равное 20.
Символ $ (символ доллара) указывает на имя объекта. Этот символ необходимо использовать при создании ссылки на любой именованный объект. |
Закрепим изложенный выше материал примером создания плавающих рыбок. В этом сложном упражнении, состоящем из нескольких частей, используется средство MAXScript для определения поведения объектов сцены — анимации рыбок, которые следуют за объектом Dummy по заданному пути.
В этом разделе описывается пример записи простого сценария, в котором выделенный объект сплющивается и к нему применяется фиолетовый цвет.
Чтобы с помощью средства Macro Recorder создать новый сценарий, выполните ряд действий.
В папке Chapter Example Files на прилагаемом компакт-диске найдите файл Chap 4 0 . zip, распакуйте его и откройте файл Purple pyramid. max. В файле находится простейшая пирамида. Выделив пирамиду, выберите в главном меню программы MAXScript>MAXScript Listener (или нажмите <F11>), чтобы открыть одноименное диалоговое окно. В окне MAXScript Listener выберите меню MacroRecorder и посмотрите на активные команды. Убедитесь в том, что при записи сценария используются относительные объектные ссылки, т.е. сценарий будет работать с любым выделенным в момент запуска объектом. Затем в меню MacroRecorder выберите команду Enable (Активизировать). Теперь все готово к записи сценария MAXScript. Минимизируйте окно MAXScript Listener или прикрепите его к окну проекции Left. Для этого достаточно щелкнуть правой кнопкой мыши на имени окна проекции и из появившегося контекстного меню выбрать команду Views>Extended>MAXScript Listener (Виды>Дополнительные>Окно MAXScript Listener). Теперь ничто не будет мешать вашей работе. С помощью команды Modifiers>Parametric Modifiers>XForm (Модификаторы> Параметрические модификаторы>Модификатор XForm) добавьте к объекту соответствующий модификатор. Щелкните на кнопке Select and Non-Uniform Scale (Выделить и неоднородно масштабировать) основной панели инструментов, затем на кнопке Restrict to Y (Ограничить трансформацию по оси Y) панели инструментов Axis Constraints (Ограничения по осям). Щелкните в любой части окна проекции Front, активизировав его (если это еще не было сделано), и перетащите контейнер оси Y вниз, сплющивая пирамиду. Активизируйте вкладку Create и щелкните на образце цвета, расположенном справа от поля имени объекта. Появится диалоговое окно Object Color (Цвет объекта). Щелкните на фиолетовом образце цвета, а затем на кнопке ОК. Сценарий готов. Активизируйте окно MAXScript Listener и выберите команду MacroRecorder>Enable для остановки записи сценария. Теперь протестируем записанный сценарий MAXScript. Добавьте к сцене сферу и выделите ее перед выполнением следующего действия. Выделите весь текст в верхней части окна MAXScript Listener (для этого можно использовать комбинацию клавиш <Ctrl+A>). Затем нажмите комбинацию клавиш <Shift+Enter> для выполнения сценария.Как показано на рис. 40.8, сфера "сплющивается" и изменяет свой цвет.
Это один из способов управления потоком выполнения сценария. Обычно 3ds max выполнят команды одну за другой, а при достижении последней строки завершает выполнение. Но при наличии условий выполнение сценария будет продолжено только в том случае, если результат выражения — истина.
Предположим, что в сценарии используются следующие строки:
Переменной b никогда не будет присвоено значение 2 (строка b = 2), поскольку выражение (а == 5) ложно. Другими словами, если выражение, следующее за оператором if, истинно, то выполняются операторы в скобках, следующие за ним. В противном случае (выражение, следующее за оператором if, ложно,) операторы в скобках пропускаются. Синтаксис оператора if выглядит следующим образом: If <выражение> then <действия> Здесь <выражение> — условие выполнения <действия>. Если условие ложно, то для выполнения действий используется ключевое слово else, например:После выполнения приведенного кода переменной b присваивается значение 3, поскольку выражение (а == 5) ложно.
Коллекции и массивы
В MAXScript есть полезное свойство, с помощью которого управляют группами объектов. Группу объектов часто называют коллекцией {collection). Коллекцию можно представить в виде ящика, в котором содержатся неупорядоченные объекты или переменные.
С коллекцией работают, как с группой объектов определенного типа. Например, с помощью операторов
создается коллекция всех объектов сцены, имена которых начинаются с символов pokey, а затем этим объектам коллекции присваивается красный цвет.
В MAXScript существует несколько полезных встроенных коллекций, например cameras и lights, содержащих соответственно все камеры и источники света сцены. Так, оператор
delete lights
удаляет все источники света из сцены (используйте подобные операторы с большой осторожностью).
Массив {array) — это тип коллекции, содержащей упорядоченные объекты, доступ к которым можно осуществить с помощью индекса массива, например:
В последней строке отображается текущее значение массива:
Обратите внимание, что некоторые элементы массива не определены, на их месте отображается значение undefined.
С помощью ключевого слова as можно преобразовать коллекцию в массив:
В приведенной строке встроенная коллекция источников света lights преобразуется в массив с именем LightArray.
Элементы массива или коллекции могут иметь различные типы данных, т.е. допускается совместное использование числовых, строковых и объектных значений, например:
Для преобразования типов данных можно использовать ключевое слово as. Например, в выражении (5 as string) числовое значение 5 преобразуется в строковое "5", а в выражении (5 as float) — в значение с плавающей точкой 5,0. |
Выражения 3ds max используются для принятия решений. В выражении сравниваются два элемента, а затем отображается результат сравнения.
Аналогичные выражения используются в окне Expression Controller (Контроллер выражений). Более подробно этот контроллер обсуждается в главе 29, "Использование выражений". |