PDA

Просмотр полной версии : Как сделать анимацию форточки или шторки скриптом?



proton2
12.04.2011, 00:15
Пожалуйста, помогите советом. Замучился подгонять точки привязки и pivot'ы с 50 - метровыми радиусами для того, чтобы сделать нормальное открывание форточки или шторки. Кто только придумал такую ерунду, как все хорошо было до Classic'a... Как я с этим намучился...

Подскажите, можно ли как-то сделать открывание форточки скриптом? Чтобы поставить точку привязки куда нужно и не ловить pivot через 50 метров от кабины...

TRam_
12.04.2011, 01:02
надо делать невидимый рычаг, за который легко было бы схватиться, анимацию форточки в нужное число кадров. И задавать нужный кадр в обработчике рычгов.

amd103
12.04.2011, 09:45
Там все просто.
http://storage8.static.itmages.ru/i/11/0412/h_1302589566_b874496657.png
В центре красной пентаграммой отмечена точка контрола, считаем, что её ось Z (то бишь та, вокруг которой идет вращение) направлена перпендикулярно экрану от нас, т. е. так:
http://storage7.static.itmages.ru/i/11/0412/s_1302589969_09bf4393df.png (http://itmages.ru/image/view/166108/09bf4393)
Продолжения остальных осей показаны на картинке.

Координатой положения контрола является угол поворота (альфа). Измеряется он в радианах. Именно он задается в пределах вращения контрола (тег angles).

Когда синенький радиус-вектор (r) совпадает с осью у, его угол равен нулю. Затем, поворачиваясь против часовой стрелки угол будет увеличиваться: когда r повернется на 90 градусов, угол станет равным пи / 2, т.е. 3.14 / 2, т.е. 1.57. И т.д.
Если поворачивать по часовой стрелке, то подем также, но в минус, т.е. при 90 градусах будет -пи/2.
Далее очевидно, что после поворота на круг (360 градусов) r вернется в исходное положение и его угол в радианах будет 2пи.
Можно и дальше продолжать поворачиваться — будет 2пи + пи/2, 2пи + пи, 2пи + 3пи/2, 4пи и т.д. Или -2пи - пи/2, ...:

..., -9пи/2, -4пи, -5пи/2, -3пи, -3пи/2, -пи, -пи/2, 0, пи/2, пи, 3пи/2, 2пи, 5пи/2 и так далее, хоть до бесконечности.

Т.к. полный круг равен 2пи, можно сокращенно записать альфа = что-то + 2пиk, где k — любое целое число.

Из всего этого бесконечного интервала мы выделяем отрезок и пишем его в angles. Чтобы не возиться, берем около нуля.

Градусы легко перевести в радианы и наоборот — градусы = радианы * 180 / пи.

Скажем, ручка крана 395 поворачивается, дай бог памяти, на 135 градусов. Для простоты поворачиваем точку так, чтобы ось у совпадала с I положением, в angles тогда пишем 0 и 135 * 3.14 / 180 = 2.355.

Итак, в общем, смысл значения в angles — предельные координаты контрола.
Далее я так и буду это называть..

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

И с этим делом связаны также notches. В нем пишется список значений в котором есть фиксированная позиция.

Возьмем контрллер ЭР2Т, к примеру. Имеем 5 тормозных, 5 моторных и 0.
Допустим, что интервалы между ними равны.
Тогда в лимитс мы пишем -5, 5
а в нотчес 0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0

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

---
Что касается кнопок и окон, делаемых на поворачивающихся леверах.

В этом случае точка находится на большом расстоянии от самой модели (по сравнению с расстоянием, на которое она перемещается при открывании/сдвиге).

Смотрим на рисунок. Точка там, где звездочка, расстояние — r. Допустим, что при нулевом угле форточка закрыта, а при угле, равном альфа — открыта, при этом альфа нам неизвестен, а известно h, т.е. расстояние, которое проходит открываемая/нажимаемая мешь.

Если считать точно, то альфа и h связаны так: h = r sin a. Однако, т.к. в данном случае r в разы больше h, очевидно, что h практически совпадает с дугой L. А по определению радианной меры угла длина дуги L = r * a, значит, a = L / r ≈ h / r.
Итак, в angles будет 0, h / r

---
Я не зря говорил, что в angles записаны координаты, и limits работает с ними как с координатами. Углы являются координатами у контролов типа левер, пулллевер, свитч. У пуллроуп в angles — метры, координаты сдвига, а у анимированных леверов angles вообще не используется, минимальное и максимальное значение в limits соответствуют нулевому и последнему кадру анимации.

TRam_
12.04.2011, 15:23
а у анимированных леверов angles вообще не используетсяда, эти лучше не делать. Если кабина анимирована, то анимированным ппц приходит (одна из причин, по которой забросил кабину для КДЭ161)

amd103
12.04.2011, 16:18
Что с ними происходит?

TRam_
12.04.2011, 18:31
Перестают работать - мышью невозможно дотронуться до box'а до тех пор, пока анимация не вернёт кабину в первоначальное положение.

amd103
12.04.2011, 19:11
Т.е. коллижн-прокси не двигается, или как?

TRam_
12.04.2011, 22:18
да.

amd103
13.04.2011, 10:48
Очень странно, а сама модель левера движется с анимацией?
Ну а при SetMeshOrientation/Translation такой беды, надеюсь, нет?

TRam_
13.04.2011, 16:38
Ну а при SetMeshOrientation/Translation такой беды, надеюсь, нет?без понятия. Может и нету, когда делал кабину об этих функциях ещё не знал.


а сама модель левера движется с анимацией?движется.

amd103
24.09.2011, 17:05
а в нотчес -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5
Колоссальная ошибка, ваш покорный слуга убивается об стену. Исправил на правильное:

а в нотчес 0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0

Skif
24.09.2011, 19:08
А что, анимированные детали в кабинах могут без скриптования только вращатся? Ползать не могут? Мне казалось, просто меняются кадры анимации, когда тянешь мышью анимированную фигню.

TRam_
24.09.2011, 22:32
Ползать могут (тип pulllever вроде) но как выползут, так и уползут назад когда мышь отпустишь (см. боковые окна на ВЛ10-1628). Потому можно повесить мешь очень далеко от оси поворота, тогда не будет заметно, поступательно ли она движется или вращается.

Ну а "анимированные леверы" (у которых коллизион бокс закреплён на левере) могут вовсе как угодно двигаться. Вот только они не переносят внешней анимации - в раскачивающейся кабине работать не будут.

amd103
24.09.2011, 22:53
А что, анимированные детали в кабинах могут без скриптования только вращатся? Ползать не могут? Мне казалось, просто меняются кадры анимации, когда тянешь мышью анимированную фигню.
В анимлевере может быть все что угодно.

Я не зря говорил, что в angles записаны координаты, и limits работает с ними как с координатами. Углы являются координатами у контролов типа левер, пулллевер, свитч. У пуллроуп в angles — метры, координаты сдвига, а у анимированных леверов angles вообще не используется, минимальное и максимальное значение в limits соответствуют нулевому и последнему кадру анимации.

ZIMA
25.09.2011, 12:29
Ползать могут (тип pulllever вроде) но как выползут, так и уползут назад когда мышь отпустишь (см. боковые окна на ВЛ10-1628). Потому можно повесить мешь очень далеко от оси поворота, тогда не будет заметно, поступательно ли она движется или вращается.

Ну а "анимированные леверы" (у которых коллизион бокс закреплён на левере) могут вовсе как угодно двигаться. Вот только они не переносят внешней анимации - в раскачивающейся кабине работать не будут.
А как у меня тогда форточки, козырьки и крышка от ЭПК работают? Они ведь сделаны как анимированные леверы и прекрасно работают во время раскачки



New