Временные интервалы
Ось вращения
Написанный выше сценарий можно было бы сделать более удобным для пользователя, чтобы он мог выбрать также ось вращения колеса с помощью кнопок - переключателей, которые следует ввести в определение пользовательского интерфейса данного сценария. Для этого введите следующие строки кода после строки определения кнопки
button but_setkeys:
label lab_rotAxis "Local Rotation Axis: "
radiobuttons rbt_rotAxis labels:#("X","Y","Z") default:3
Если ввести эти элементы пользовательского интерфейса, то для их размещения в диалоговом окне придется соответственно изменить его высоту (сделайте это в предпоследней и последней строках сценария). Далее в той части кода, где
Глава 5
устанавливаются ключевые кадры анимации колеса, можно воспользоваться состоянием кнопки rotAxis.state, чтобы задать конкретную ось вращения. Итак, замените код из блока контекста with animate on в обработчике событий
on but_setKeys pressed следующим фрагментом кода:
rAxis = rbt_rotAxis.state
at time spn_startFrame.value
wheelObject.rotation.controller[rAxis] \
.controller.value = 0
at time spn_endFrame.value wheelObject.rotation.controlIer[rAxis] \ .controller.value = totalDegrees
Созданный только что сценарий вполне работоспособен для анимации автомобиля, преодолевающего весь путь с одинаковой скоростью. Но если скорость или направление движения автомобиля может измениться в любой момент, то придется установить ключевые кадры через определенные интервалы и рассчитать вращение колеса для каждого ключевого кадра.
Для того чтобы предоставить пользователю возможность устанавливать конкретные интервалы времени, сценарий можно дополнить счетчиком TimeStep (Временной интервал), введя следующую строку кода перед определением кнопки buttonbut_setkeys:
spinner spn_timeStep "Time Step: " range: [1,10,5]
Если ввести этот элемент пользовательского интерфейса, то для его размещения в диалоговом окне придется соответственно изменить высоту данного окна.
Для получения в любой момент длины пройденного пути в процентах необходимо знать, какой объект следует по этому пути. Для выбора этого объекта можно предоставить соответствующую кнопку или же предположить, что это родительский объект выбранного колеса. Для доступа к родительскому объекту колеса можно воспользоваться следующим оператором:
wheelObject.parent
А длину пути, пройденного автомобилем, в процентах можно рассчитать с помощью следующего выражения:
wheelObject.parent.controller.percent / 100
Для установки только двух ключевых кадров вместо контекста animate лучше организовать цикл. На каждом шаге цикла выбирается значение из счетчика Time Step и по нему определяется конкретный кадр анимации для установки ключевого кадра. Итак, замените весь блок кода с контекстом with animateon следующим фрагментом кода:
local rAxis = rbt_rotAxis.state
local curDeg, curPerc, distTraveled, numRotations
for t = spn_startFrame.value to spn_endFrame.value \
by spn_timeStep.value do
(
at time t
Преобразования и анимация
(
curPerc = wheelObject.parent.position.controller.percent / 100
distTraveled = curPerc * pathLength
numRotations = distTraveled / (2 * pi * wheelObject.radius)
curDeg = numRotations * 360.0
animate on wheelObject.rotation.controller[rAxis]. \
controller.value = curDeg
)
)
Для того чтобы сделать вращение колеса более привлекательным визуально, установите режим Show Trajectory (Показать траекторию) для объекта Wheel01- Motionlndicator.
А для проверки данного метода воспользуйтесь сценой из файла \chapter5\ Roadster_reverse.max на прилагаемом к этой книге CD-ROM. В этой сцене автомобиль проезжает весь путь, а затем возвращается назад, останавливаясь на полпути. За ним, соответственно, следует камера.