22 Сентября 2024, 06:30:25
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Навигация по форуму







guest3d
Quest3D - Русскоязычное сообщество > Quest3D > Логика > [Логика]Управление анимацией
[Логика]Управление анимацией
(Прочитано 40011 раз)
  [1] 2 3 4
Печать
Paul_Winex | ** | Пользователь | Сообщений: 59 | « 07 Сентября 2009, 18:58:44 »
[Логика]Управление анимацией |
0
Приветсвую, уважаемые.
Такой вопрос в тему "Как сделать?" Хочу сделать анимацию которая проигрывается туда-сюда реагируя на одно и то же действие. То есть, классический пример - дверь. Тыкнули мышой - открылась, тыкнули еще - закрылась. Так же сигналом может быть другой объект или триггер. Анимация находится на одном Таймере. Открытие с кадра 1 по 50, закрытие 50-100. В обем как это реализовать?
Мерси за содействие всем кто поможет. Подмигивающий
« Последнее редактирование: 08 Сентября 2009, 00:13:25 от Sqwer »
Paul_Winex | ** | Пользователь | Сообщений: 59 | «Ответ #1 07 Сентября 2009, 19:23:45 »
Re: Управление анимацией |
1
Да, вопросы ламерские, но наверное для этого и сделан форум. Кто знает отвечает или показует где это уже описано. К сожалению база знаний здесь только в виде форума. Уроки не очень расчитаны к пониманию для чайников.
barmadjar | *** | Постоялец | Сообщений: 142 | «Ответ #2 07 Сентября 2009, 23:31:49 »
Re: Управление анимацией |
2
Лови, дружище!
Набросал на скору руку простейшую схему.
С таймерами, надеюсь разберешься сам - что для чего (смотри здесь: http://guest3d.wohlnet.ru/g3d/?q=node/24 )
Клавиша Q открывает дверь, W - закрывает и так далее до посинения Подмигивающий
Ежели чего не ясно - спрашивай!
PS: единственное что - смотри в режиме Perspective View, а не Camera View, поскольку с камерой я не заморачивался)
* Door_Animation.cgr (101.25 Кб - загружено 1366 раз.)
« Последнее редактирование: 07 Сентября 2009, 23:42:50 от barmadjar »
Paul_Winex | ** | Пользователь | Сообщений: 59 | «Ответ #3 08 Сентября 2009, 12:49:09 »
Re: [Логика]Управление анимацией |
3
Спасибки за пример. Одну проблему решил TimeCommander с тапаметром GoToStart и с ренжем 0-00.1. Он решил пролему однаразовой анимации, то есть теперь можно прокручивать много раз.
Но всё ж надо доработать.
1 - Если нажать открытие с уже открытой дверью, она опять проиграет анимацию открытия. Но это может решить испльзоване одной клавиши.
2 - Надо настроить на использование одной клавиши.

Я немного подшаманил и соеденил на логику AND два канала - Mouse Intersection (курсор на объекте) и LeftMouse(нажата ЛКМ), если оба правда, то AND возвращает 1 на Trigger типа Llip\Flop (переключатель), который при получении еденицы поочередно меняет 1 и 0 (другого метода определения положения я пока не знаю). Когда подключил это всё на условие к IfElse, пришел косяк, один из каналов IfElse активен сразу же. Когда прикручиваю те же условия нажатия и пересечения в купе с AND на тригер выше IfElse, но первые условия на AND не работают.

Хотел бы понять как действуют команды в канале TimerCommand?
Например:
- Play to End > значит играть От заданного кадра ДО заданного, или до самого конца.
- Rewind > это к началу анимации или к предыдущему кадру?
- GoTo Start > Это в начало таймера или в указанный в параметре кадр? А команды GoTo start & Play / Stop кажутся скрещены из нескольких других команд.

И как выполнить какой-то действие когда анимация наприер выполнилась с кадра 0 до 50. Например после открытия двери зажегся свет.

Еще раз спасибо barmadjar'у за помощь!
Paul_Winex | ** | Пользователь | Сообщений: 59 | «Ответ #4 08 Сентября 2009, 14:49:39 »
Re: [Логика]Управление анимацией |
4
Ниже представлена схема, которую я собрал без использования IF. Основан он на канале Call Selected. Он принимает значение и относительно него вызывает соответствующий канал. Дефолтное значение я поставил 0, и нулевой канал сделал пустым. В канале UserInput менял значение True на 1-3 и при нажатии вызывается соответствующий канал (да, стати, сделал 3 участка на таймлайне с разной анимацией). Внизу слева канал AND, который при совпадении внизу двух единиц тоже получает 1. На основе него надо сделать счетчик, который имеет формулу что-то типа:

Код:
If A<3
then
 A=A+1
else
 A=1

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

Подскажите где можно такое сделать? С Expression Value я не смог подружиться, не пойму что она возвращает.
* ButtonMove2(V_4.2.3).rar (12.35 Кб - загружено 1218 раз.)

* map.gif (96.08 Кб, 1200x823 - просмотрено 2643 раз.)
Paul_Winex | ** | Пользователь | Сообщений: 59 | «Ответ #5 08 Сентября 2009, 15:25:04 »
Re: [Логика]Управление анимацией |
5
Прошу прощения если много задаю вопросов, но у меня часто бывает так что пока не спрошу, сам ответа не нахожу, а как только нажал ОТПРАВИТЬ, в голову приходит ответ Улыбающийся Ну вот так и щас получилось. Сделал я поочередную смену анимаций. Смотрите картинку. Не наю стоит ли выкладывать исходник, у меня версия квеста 4.2.3. Ну там собственно и не так сложно.
Кстати без barmadjar у меня бы не получилось.

Теперь о решении. Как я и думал, проще написать скрипт чем крутить кучу нод. Вот код:
Код:
-- CallChannel function is called when channel is called
function CallChannel()
end

-- GetValue function is called when this channels is used as Value
function GetValue()

local ch0 = channel.GetChild(0) -- получаем значение потомка
local v = ch0:GetValue() -- пишем это значение в v

 if v<3 then v=v+1 else v=1 end -- счетчик
 ch0:SetValue(v) -- обновляем потомка
return v --возвращаем текущее значение счетчика
end

Не знаю, надо ли было использовать две Value, просто не знал как сверху получить текущее значение. А хранить в потомке удобно.
Меняя в формуле выражение v<3 на например v<5 мы можем прикрутить 5 разных анимаций. В моем примере в 0-м канале пусто, туда можно и дефолтную запуздырить.

* map2.gif (54.25 Кб, 849x764 - просмотрено 2595 раз.)
« Последнее редактирование: 08 Сентября 2009, 15:26:57 от Paul_Winex »
Paul_Winex | ** | Пользователь | Сообщений: 59 | «Ответ #6 08 Сентября 2009, 15:30:28 »
Re: [Логика]Управление анимацией |
6
Но не думайте что мытарства закончены. Если это дверь или какой аниматорик в музее, то будет глупо если получится его запустить стоя в 20 метрах от него. Надо еще добавить условие расстояния до объекта. Кто знает как вычислять расстояние?
Потом его сравнить по формуле А<=Б и сделать вывод - запускать анимацию или нет.
Так же можно сделать это с помощью учёта коллизии с окружающим (невидимым) объектом. Ну думаю лучше один раз за нажатие просчитать вектор, чем каждый кадр просчитывать наличие коллизии.
« Последнее редактирование: 08 Сентября 2009, 15:42:41 от Paul_Winex »
Paul_Winex | ** | Пользователь | Сообщений: 59 | «Ответ #7 08 Сентября 2009, 15:49:22 »
Re: [Логика]Управление анимацией |
7
Если видели схему выше, то поймете.
Между верхним триггером и Call Selected я вставил канал IF. На условие поставил Expression Value с такой формулой:

Код:
A=0 || A=10 || A=20 || A=21 || A=30

В ней фигурируют ключевые кадры анимации. На формулу снизу подключил таймер. В результате канал Expression Value получает значение таймера и сравнимает его с указанными кадрами. Если ни одно значение не подошло - другая анимация не запустится. Это решене проблемы, когда во время анимации повторное нажатие запускает другую анимацию. С этой формулой пока не закончится одна, другая не начнется.

PS. Что насчет рассстояний? Я даже не знаю чем их менрять! Знаю только что надо применить матрицу положение камеры и объекта. А куда применить...?
Paul_Winex | ** | Пользователь | Сообщений: 59 | «Ответ #8 08 Сентября 2009, 16:09:04 »
Re: [Логика]Управление анимацией |
8
Задача вычисления расстояния уводят нас к истокам другого форума...
http://guest3d.wohlnet.ru/forum/index.php?topic=375.0
DimiS | **** | Старожил | Сообщений: 284 | «Ответ #9 08 Сентября 2009, 17:44:22 »
Re: [Логика]Управление анимацией |
9
дядя, это ты сейчас с кем общяешся?)))
в общем всё я не осилил, но могу посоветовать заменить конструкцию типа

Код:
If A<3
then
 A=A+1
else
 A=1


на выражение типа А=(А+1)%3
в случае использования Expression Value это выглядит так как на скрине

* ExpressionValue.JPG (5.94 Кб, 288x253 - просмотрено 2603 раз.)
Paul_Winex | ** | Пользователь | Сообщений: 59 | «Ответ #10 08 Сентября 2009, 18:25:54 »
Re: [Логика]Управление анимацией |
10
Цитировать
А=(А+1)%3

Что-то из ряда высшей математики Улыбающийся Поясни что делает формула.

PS. хотел выложить исходник, но решил дооформить. Так как на объект надо тыкать мышой, хотел сделать в центре экрана типа прицела и им тыкать. В центре сделал, курсор спрятал, а как теперь сделать так чтобы этот прицел считался курсором? На данном сайте такого не очень нашел или недосмотрел. Поможите!!!! Пример хороший пропадает!!!!
В общем надо как в стрелялках, мышой крутить камеру, цетром совершать взаимодействия.
« Последнее редактирование: 08 Сентября 2009, 18:33:52 от Paul_Winex »
Paul_Winex | ** | Пользователь | Сообщений: 59 | «Ответ #11 08 Сентября 2009, 22:06:34 »
Re: [Логика]Управление анимацией |
11
В общем если кто не понял что я скажу, пусть попробует походить по сцене и потыкать по объектам. Что не удобное обраруживается?

http://slil.ru/27965687 (exe 1700кб)

Чтобы сработала поочередная анимация, надо тыкнуть по кубику с расстояния не менее 2. Тыкая по сфере можно запустить 4-ю анимацию. К сфере тоже надо подойти.
Самое главное - попасть курсором по объекту!!!
* ButtonMove5(V_4.2.3).rar (24.29 Кб - загружено 1232 раз.)
DimiS | **** | Старожил | Сообщений: 284 | «Ответ #12 09 Сентября 2009, 11:42:33 »
Re: [Логика]Управление анимацией |
12
'%' -- так обозначают операцию "получить остаток от деления"
вызывая А=(А+1)%3 будем перебирать последовательность
0->1->2->0->1->2...
перебирая от 0 до N-1, а не от 1 до N удобнее пользоваться тем же Channel Switch -- не надо делать этих финтов ушами с одним пустым линком

Что касается прицела как в стрелялках, то посмотри ченел Copy Image. Им можно нарисовать прицел. А чтоб определить центр экрана можешь воспользоваться ченелом SysInfo
Paul_Winex | ** | Пользователь | Сообщений: 59 | «Ответ #13 09 Сентября 2009, 14:12:34 »
Re: [Логика]Управление анимацией |
13
Финт с пустым слотом сделан для отсутствия дефолного положения, мне так легче. Я туда мог просто пустую ноду тыкнуть, это без разницы. Плюс есть возможность добавить дефолтное если потребуется.
Что касается прицела, если ты качал сцену то видел что плюс и так в центре, что я сделал как раз через SysInfo. Вопос в другом, как сделать этот прицел активным для нажатия на объекты вместо курсора?
Paul_Winex | ** | Пользователь | Сообщений: 59 | «Ответ #14 09 Сентября 2009, 14:36:10 »
Re: [Логика]Управление анимацией |
14
МОЖЕТ МНЕ КТО-НИБУДЬ ПОЯСНИТЬ О ЧЕМ РАЗГОВОР НА ЭТОМ ФОРУМЕ? Я не про перевод а про решение.
http://forum.quest3d.com/index.php?PHPSESSID=r3cjn6uaaq8ouadladffoelv57&topic=39891.msg91918#msg91918 Непонимающий
 
  [1] 2 3 4
Печать
 
Quest3D - Русскоязычное сообщество > Quest3D > Логика > [Логика]Управление анимацией
Перейти в: