Изменение цвета каркаса объектов в цикле

Работа с выражениями

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


Основы MAXScript

Теперь вам предстоит дополнить сценарий операциями изменения цвета каркаса объектов для формирования градиента от низа до верха столбика. В данном случае цвет каркаса должен изменяться снизу вверх от красного до желтого. Для выбора красного и желтого цветов потребуются следующие значения RGB.

• Красный цвет: [255,0,0]

• Желтый цвет: [255,255,0]

Значение второй составляющей цвета (зеленой) должно изменяться от 0 до 255 в течение всего цикла изменения цвета каркаса.

Допустим, что на сцене находятся пять объектов. В таком случае зеленая со­ставляющая цвета каркаса должна изменяться следующим образом.

• Объект 1:1/5 * 255 = 51

• Объект 2:2/5 * 255 = 102

• Объект 3:3/5 * 255 = 153

• Объект 4:4/5 * 255 = 204

• Объект 5:5/5 * 255 = 255

Итак, зеленая составляющая цвета каркаса первого объекта будет иметь значе­ние 51. Но, если она должна иметь нулевое значение, соответствующий дробный множитель должен изменяться не от 1/5 до 5/5, а от 0/4 до 4/4.

• Объект 1: 0/4 * 255 = 0

• Объект 2: 1/4 * 255 = 63.75

• Объект 3: 2/4 * 255 = 127.5

• Объект 4: 3/4 * 255 = 191.25

• Объект 5: 4/4 * 255 = 255

В данном случае числитель дроби (т.е. делимое число) представляет собой но­мер объекта, уменьшающийся на единицу (-1), а знаменатель дроби (т.е. число, на которое делят) остается без изменения и равен числу объектов минус один.

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

1. Прежде всего, нужно получить знаменатель дроби, который равен числу находящихся на сцене объектов минус один. Для этого введите после строки кода coll = $ * следующую строку:

bottomFraction = coll.count - 1 -- Получить знаменатель

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


Глава 1

2. Замените строку в цикле for следующей строкой кода:

for i = 1 to coll.count do

В этой строке значение переменной i заменено индексом объекта вместо самого объекта.

3. Внесите изменения в следующей строке: coll[i].pos = [0, 0, zNextObject]

Необходимо также внести изменения в той строке, в которой определяется координата Z положения следующего объекта:

zNextObject = zNextObject+ coll[i].height

А теперь следует ввести две строки кода, в которых задается цвет каркаса.

4. Введите следующие строки кода непосредственно перед закрывающей цикл круглой скобкой:

topFraction = i - 1

greenValue = (topFraction / bottomFraction) * 255

coll[i].wirecolor = [255, greenValue, 0]

5. Переместите немного объекты в видовых окнах, а затем выполните данный сценарий.

Объекты складываются в столбик, но имеют не совсем верные цвета: все объекты, кроме верхнего, оказываются красными.


Основы MAXScript

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

greenValue = (topFraction / bottomFraction) * 255

Обе переменные, topFraction и bottomFraction, имеют целые значения. В результате деления целых чисел в MAXScript всегда получается целое число, а дробная часть, если таковая образуется при делении, отбрасывается.

Следовательно, если значение переменной topFraction равно 1, при делении получается следующий результат:

1/4 = 0

На самом деле он должен быть равен 0,25. Но поскольку дробная часть при делении целых чисел отбрасывается, результат остается равным 0 вплоть до значения 4 переменной topFraction для последнего объекта в данной совокупности.

7. Для устранения данной ошибки достаточно привести переменную topFraction или bottomFraction к типу чисел с плавающей точкой. Для этого внесите следующие изменения в выражение присваивания значения переменной bottomFraction:

bottomFraction = coll.count - 1.0

Благодаря использованию в данном выражении числа 1.0 вместо целого числа 1, значение, сохраняемое в переменной bottomFraction, автоматически приводится к типу чисел с плавающей точкой. Теперь при делении значения переменной topFraction на это числовое значение будет также получаться число с плавающей точкой.

Примечание. Для достижения того же результата можно было бы изменить на 1.0 число в выражении topFraction = i - 1.

8. Выполните данный сценарий.

Теперь объекты получают цвета градиента от красного внизу до желтого вверху столбика.

9. Сохраните видоизмененный сценарий в файле MyPileUp.ms.

Завершенный вариант данного сценария можно найти в файле \chapter1\ pile_up.ms на прилагаемом к этой книге CD-ROM.

Совет. Данный сценарий можно немного усовершенствовать, организовав массив objects. Он представляет собой совокупность всех объектов, автоматически создаваемых в 3dsMax. Вместо того чтобы использовать массив coll для управления циклом for, замените соответствующую строку в данном цикле следующей строкой кода:

for i = 1 to objects.count do

После этого следует заменить все ссылки на массив coll ссылками на массив objects и удалить строку coll = $*. В итоге получится такой же результат, как при выполнении сценария, созданного в предыдущем упражнении. Данный вариант сценария можно найти в файле \chapter1\pile_up_2.ms на прилагаемом к этой книге CD-ROM.


Глава 1

 

 


Заключение

В этой главе вы научились пользоваться MAXScript для создания простых сценариев. В частности, вы использовали приемник команд MAXScript Listener для объявления переменных и присваивания им значений, а также для определения и применения функций. Кроме того, вы ознакомились с основными понятиями программирования, включая условные операторы, циклические конструкции, область действия, передачу параметров функции, массивы и структуры. И наконец, вы создали рабочий сценарий, видоизменяющий свойства объектов.


Построение пользовательских интерфейсов Глава 2

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

Глава 2

Задание

После изучения этой главы вы должны уметь следующее.

• Создавать перемещаемые диалоговые окна или свитки утилиты

• Вводить в свиток элементы управления пользовательского интерфейса

• Организовывать реакцию сценария на пользовательский ввод