|
|
|
|
|
13.10.2019, 00:28
|
#1
|
Скрипт Составной Анимации
Letos
Консультант
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,035 раз(а) в 367 сообщениях
13.10.2019, 00:28
Рейтинг:
()
Всем доброго времени суток. В 11 версии заработали асинхронные функции. Пара примеров с поворотом камеры и поворотом первого объекта в модели (габаритной рамки по умолчанию):
Поворот камеры
PHP код:
var timers = require('timers');
//var X = 30;
var Y = Model.DS.Camera.AngleY;
function Rotate(){
// Model.DS.Camera.AngleX = X;
Model.DS.Camera.AngleY = Y;
}
const inc = 0.5;
timers.setInterval(()=>{
Rotate();
Y += inc;
}, 20);
Action.Continue();
[свернуть]
Поворот первого объекта модели
PHP код:
var timers = require('timers');
var limits = Model.Objects[0];
const incAngle = 0.5;
timers.setInterval(()=>{
Undo.Changing(limits);
limits.RotateGCS(AxisY, incAngle)
}, 20);
Action.Continue();
Action.OnFinish = function(){
Action.Revert();
}
[свернуть]
И буквально пару дней назад я наткнулся на то, что не всем хватает стандартной базисной анимации:
Цитата
Цитата:
Сообщение от LeoAN
Для этого, похоже надо что-то как дерево анимации. В котором будет указано каких вложенных объектов анимация включается, каких с интервалом времени.
За пример возьмем стол, на нем находится корзина с яблоками.
1) Поднимаем стол под угол.
- Настройка анимации: поворот на 60 гр; 2 сек.
2) стол поднялся до угла 15 гр. Корзина с яблоками начала скользить.
- Настройка анимации: сдвиг расстояние х; 1,5 сек. ; 0,5 сек задержка.
3) Корзина соскользнула со стола.
- Настройка анимации: поворот 35 гр (60+35 примерно вертикаль + инерция); время- 1 сек.; Задержка 2 сек.
4) Корзина упала на пол.
- Настройка анимации: сдвиг расстояние у (до пола); время- 1 сек.; Задержка 2 сек.
5) Корзина упала.
- Настройка анимации: поворот; время- 1 сек.; Задержка 3 сек.
6) Яблоки разъезжаются.
- Настройка анимации: сдвиг - z; время- 1 сек.; Задержка 4 сек.
7)Яблоки катятся.
- Настройка анимации: поворот (вокруг своей оси)-1080 гр.; время- 1 сек.; Задержка 4 сек.
Или включение по отдельности.
Как с данной партой.
Парту мы можем регулировать по высоте.
Отрегулировали. Подняли.
Также мы можем регулировать наклон рабочей поверхности.
Т.е. в меню стоит галочка в свойствах анимации - "независимая анимация".
1-й пример - это зависимые процессы;
2-й пример - это независимые процессы.
|
[свернуть]
И меня осенило - можно же теперь с асинхронными функциями сделать скрипт, который позволит создавать составную анимацию с зависимостями. Учитывая, что создание такого скрипта займёт достаточное количество времени, хотелось бы делать его при наличии большого количества заинтересованных в его применении людей. Я решил создать отдельную тему, потому что обсуждение такого скрипта может затянуться и не хотелось бы засорять ни это обсуждение, ни остальные темы.
Если вы заинтересованы в данном скрипте - оставляйте благодарность к этому сообщению (чтобы мне знать, стоит ли этим вообще заниматься).
Если есть какие-то предложения/дополнения - буду рад обсудить их в этой теме.
Последний раз редактировалось Letos; 13.10.2019 в 13:56..
Причина: Поправил скрипт поворота
|
Просмотров: 20486
|
14 пользователя(ей) сказали cпасибо:
|
|
13.10.2019, 12:03
|
#2
|
VIP
Регистрация: 31.10.2009
Адрес: Рівне. УкраЇна
Сообщений: 10,580
Сказал(а) спасибо: 14,588
Поблагодарили 20,033 раз(а) в 6,492 сообщениях
Вес репутации: 5261
|
Цитата:
Сообщение от Letos
Поворот первого объекта модели
|
При завершении работы скрипта ("Esc" или "Отменить команду") габаритная рамка не возвращается в исходное положение, а остается смещённой на 0,5° относительно оси вращения "Y" :
__________________
Уж лучше беспокойство в сомнении, чем успокоенность в заблуждении. .
(Мандзони Алессандро)
------------------------------------
Троллей не кормлю...
|
|
|
13.10.2019, 13:57
|
#3
|
Консультант
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,035 раз(а) в 367 сообщениях
Вес репутации: 347
|
Цитата:
Сообщение от Uncle
При завершении работы скрипта ("Esc" или "Отменить команду") габаритная рамка не возвращается в исходное положение, а остается смещённой на 0,5° относительно оси вращения "Y"
|
Поправил скрипт в шапке.
|
|
|
Пользователь сказал cпасибо:
|
|
13.10.2019, 14:11
|
#4
|
VIP
Регистрация: 31.10.2009
Адрес: Рівне. УкраЇна
Сообщений: 10,580
Сказал(а) спасибо: 14,588
Поблагодарили 20,033 раз(а) в 6,492 сообщениях
Вес репутации: 5261
|
Цитата:
Сообщение от Letos
Если есть какие-то предложения
|
Как бы для начала...
Возможно ли, используя вышеописанные новые возможности (асинхронность функций), реализовать ситуацию, обсуждаемую в теме с регулируемой партой, откуда, собственно, и была Вами взята цитата в шапке.
Цитата:
Сообщение от Uncle
В общем, видео...
|
__________________
Уж лучше беспокойство в сомнении, чем успокоенность в заблуждении. .
(Мандзони Алессандро)
------------------------------------
Троллей не кормлю...
|
|
|
21.10.2019, 20:09
|
#5
|
Консультант
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,035 раз(а) в 367 сообщениях
Вес репутации: 347
|
Цитата:
Сообщение от Uncle
Как бы для начала...
Возможно ли, используя вышеописанные новые возможности (асинхронность функций), реализовать ситуацию, обсуждаемую в теме с регулируемой партой, откуда, собственно, и была Вами взята цитата в шапке.
|
Я немного пошарил и оказалось так - идея в моей голове была сумбурна и заморочена (самому реализовывать анимацию), а оказалось всё проще - у блока есть метод AnimateTo(), который принимает числовой параметр от 0 до 1. В связи с чем удалось написать маленький пример по анимации каждого блока по отдельности. При запуске скрипта в свойствах появляется список кнопок с именами блоков. По нажатию на кнопку отрабатывает анимация связанного блока (анимация вложенных не запускается).
Код v1
PHP код:
var blocks = [];
function MakeProps() {
var props = Action.Properties;
for (var i = 0; i < blocks.length; i++) {
var block = blocks[i];
var b = props.NewButton(block.Name);
b.Tag = i;
b.OnClick = function (btn) {
var bl = blocks[btn.Tag];
if (bl._anim)
bl.AnimateTo(0);
else
bl.AnimateTo(1);
bl._anim = ! bl._anim;
}
};
}
/**
* @param {List3D} list
*/
function AddToAnimlist(list) {
var anim = list.Animation;
if (anim && anim.Duration != 0) {
blocks.push(list);
}
for (var i = 0; i < list.Count; i++) {
if (list.Objects[i].List) {
AddToAnimlist(list.Objects[i]);
}
}
}
AddToAnimlist(Model);
MakeProps()
Action.Continue();
[свернуть]
Из-за неиспользования асинхронных функций, работает в ранних версиях БМ. Спешно проверил - работает в 8-11 версиях.
|
|
|
5 пользователя(ей) сказали cпасибо:
|
|
17.03.2020, 23:20
|
#6
|
Местный
Регистрация: 01.09.2019
Сообщений: 424
Сказал(а) спасибо: 52
Поблагодарили 481 раз(а) в 147 сообщениях
Вес репутации: 197
|
Спасибо! Добавил так:
Код:
for (var i = 0; i < list.Count; i++) {
if (list.Objects[i].List) {
AddToAnimlist(list.Objects[i]);
var bl = list.Objects[i];
bl.AnimateTo(1);
bl.AnimateTo(0);
}
}
Теперь могу любоваться составной анимацией в БМ8.
Добавлено через 20 минут
А не подскажете как сделать чтобы запускать анимацию выделенного блока, в идеале конечно просто блока под мышкой?
|
|
|
18.03.2020, 10:22
|
#7
|
Консультант
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,035 раз(а) в 367 сообщениях
Вес репутации: 347
|
Цитата:
Сообщение от sergio1982
А не подскажете как сделать чтобы запускать анимацию выделенного блока, в идеале конечно просто блока под мышкой?
|
Объект под курсором можно получить с помощью функции Action.Get3DObject(). Пример с выделением объекта под курсором по клику:
PHP код:
Action.OnClick = function(){
var obj = Action.Get3DObject();
if (obj){
obj.Selected = true;
}
}
Эта функция не выделяет блоки даже если отключено "Выделение элементов внутри блоков", но у объекта можно посмотреть свойство Owner - блок, в который он вложен. Если это не блок с анимацией, можно посмотреть его Owner и т.д. до нужного блока (либо верхнего уровня - модели).
Ну а выделенный объект получить ещё проще - Model.Selected.
|
|
|
Пользователь сказал cпасибо:
|
|
18.03.2020, 23:41
|
#8
|
Местный
Регистрация: 01.09.2019
Сообщений: 424
Сказал(а) спасибо: 52
Поблагодарили 481 раз(а) в 147 сообщениях
Вес репутации: 197
|
Цитата:
можно посмотреть свойство Owner - блок, в который он вложен. Если это не блок с анимацией
|
В справке к 8ке не нашёл про "AnimateTo" и свойство "_anim".
Вопрос для меня, это - как определить что блок является анимацией?
|
|
|
19.03.2020, 09:17
|
#9
|
Консультант
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,035 раз(а) в 367 сообщениях
Вес репутации: 347
|
Цитата:
Сообщение от sergio1982
В справке к 8ке не нашёл про "AnimateTo" и свойство "_anim".
Вопрос для меня, это - как определить что блок является анимацией?
|
про "AnimateTo" нигде не написано, а "_anim" - введённая в скрипте переменная и к Базису отношения не имеет.
Определить, есть ли анимация, можно по свойству AnimationType - оно нулевое, если нет анимации. При анимации поворота возвращает 1, при анимации сдвига возвращает 2.
|
|
|
20.03.2020, 14:46
|
#10
|
Местный
Регистрация: 01.09.2019
Сообщений: 424
Сказал(а) спасибо: 52
Поблагодарили 481 раз(а) в 147 сообщениях
Вес репутации: 197
|
Цитата:
Сообщение от Letos
про "AnimateTo" нигде не написано
|
А как же вы это нашли, если не секрет?
Цитата:
Сообщение от Letos
"_anim" - введённая в скрипте переменная
|
А, да, пропустил. Не силён в JS.
А как понять что анимация применена.
То есть дверь находится в своём изначальном закрытом состоянии.
Например составной блок, я на одном из элементов нажму среднюю кнопки мыши, он сдвинется, потом применю скрипт выше, и всё поломается.
|
|
|
|
|
|
Нижняя навигация
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Текущее время: 14:13. Часовой пояс GMT +3.
|