Render.ru

Помогите с MaxScript`ом...

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

Я делаю следующее, но он отказывается понимать pos... незнаю в чем ошибка.
box=Box01
sphere=Sphere01
startframe=26 \ начальный кадр
endframe=32 \кадр в котором должна закончиться зависимость

for t = startframe to endframe do
at time t

sphere.pos.x = old_val
sphere.pos.x = old_val + box.pos.x

Заранее благодарен
 
#2
T'orl wrote:
>
> Народ, помогите, необходимо, чтобы в определенном кадре один
> объект изменял свою позицию, по одной из осей, на столько же
> , насколько изменит позицию другой объект. Я попробовал
> реализовать все это через maxscript, но что-то не получилось...
>
> Я делаю следующее, но он отказывается понимать pos... незнаю
> в чем ошибка.
> box=Box01
> sphere=Sphere01
> startframe=26 \ начальный кадр
> endframe=32 \кадр в котором должна закончиться зависимость
>
> for t = startframe to endframe do
> at time t
>
> sphere.pos.x = old_val
> sphere.pos.x = old_val + box.pos.x
>
> Заранее благодарен

Привет!
Ошибки прошу не проверять... :) Русского не знаю... :-(
Не уверен поможет Вам мой совет или нет но во всяком случае это полезно применить где-нибудь (если конечно это не применялось).

Задача: Если 1 объект перемещается на 100 ед по оси X то 2 объект переместится на столькоже по оси Z

Решение:
1) Создали объект... (ведущий)
2) Задали ему движение любым известным способом. (ведущему)
3) Содаем второй (ведомый) объект которым нужно управлять за счет первого.
4) Либо через Track View ищем ведомый (второй), либо выделяем его и идем в Command Panel -> Motion -> свиток Assign Controller
5) Выделяем Position и кнопкой Assign Controller назначаем контроллер Postion XYZ... После этого кликаем на плюсик и раскрываем "ветвь"

*** по умолчанию для всех X, Y и Z - Postion, назначен котроллер Bezier Float (что собственно не очень важно в данном примере)***

6) Делаем для первого ведущего объекта тоже самое, т.е. назначаем на Position контроллер Position XYZ, затем вернемся поять ко второму объекту...

7) Теперь самое интересное. У второго объекта выделяем Z Position и назаначаем контроллер Float Expression (управление по математическому выражению). Выделяем его и правой кнопкой мыши открываем мню и выбераем Properties... Должно открыться окно Expression Controller... Если не открылось - то мне пора на пенсию... :)

8) В поле Name вводим "X1" потом кликаем на Create... тип пусть останется скалярный (векторным не приходилось пользоваться но что-то помнится о том что он может хронить в себе все три координаты, хотя может я и ошибаюсь).
Внизу нажимаете кнопку Assign to Controller, потом появится окно... в нем открывете ветвь объекты, потом ветвь ведущего (первого) объекта, потом Transform, затем Position, на завершение выбераете ось от которой нужно получать данные о перемещении. В нашем случае выбераем X Position
Если появилось сообщение о чем-то там, то скорее всего вы пытаетесь назначить объекту его же "позицию"...

9) Тперь в поле Expression просто набираете X1 (хотя можете его умножить на два и получите вдвое болшее растояние перемещения, список прелестей там емт есть: Function List). Чтобы быть более уверенней чем в "памперсах" нажмите кнопку Debug... можите потоскать ползунок анимации и посмотреть изменение результатов...

10) Теперь Close & Play Play Play - проверяем результат... Получилось?! Замечательно!

999) Там есть еще контролер Script Controller - хорошая вешь. Прорбуйте...
Я с Expression познакомился когда делал гусеницы для танка, а точнее чтобы колеса у танка вращались с соответствующей скоростью движения танка и колес.. Но я всеже пришел к выводу что скрипты в этом плане даже удобнее... (иногда)...

ВСЕГО ХОРОШЕГО! ОСОБЕННО ИДЕЙ!
 
#3
b = $Box01
s = $Sphere01
startframe=26
endframe=32

at time (startframe - 1) old_val = b.pos.x

with animate on (
for t = startframe to endframe do at time t (
s.pos.x = s.pos.x + (b.pos.x - old_val)
old_val = b.pos.x
)
)
deleteKey s.pos.controller 1
 
Сверху