3ds max 5. Библия пользователя

         

Движения рыбки после обновления сценария



Рис. 40.12. Движения рыбки после обновления сценария

Теперь проанализируем обновленный сценарий. В нем добавляется новая переменная (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 можно использовать "сокращенный" вариант присвоения значений переменным. Вместо а=а+Ь можно написать а+=Ь. Эти два оператора идентичны.



Содержание раздела