• Добро пожаловать на Quest3D - Русскоязычное сообщество.
 

Новости:

Форум Quest3D восстановлен!

Главное меню

[Логика]Управление анимацией

Автор Paul_Winex, 07 сентября 2009, 19:58:44

« назад - далее »

Paul_Winex

Приветсвую, уважаемые.
Такой вопрос в тему "Как сделать?" Хочу сделать анимацию которая проигрывается туда-сюда реагируя на одно и то же действие. То есть, классический пример - дверь. Тыкнули мышой - открылась, тыкнули еще - закрылась. Так же сигналом может быть другой объект или триггер. Анимация находится на одном Таймере. Открытие с кадра 1 по 50, закрытие 50-100. В обем как это реализовать?
Мерси за содействие всем кто поможет. ;)

Paul_Winex

Да, вопросы ламерские, но наверное для этого и сделан форум. Кто знает отвечает или показует где это уже описано. К сожалению база знаний здесь только в виде форума. Уроки не очень расчитаны к пониманию для чайников.

barmadjar

#2
Лови, дружище!
Набросал на скору руку простейшую схему.
С таймерами, надеюсь разберешься сам - что для чего (смотри здесь: https://guest3d.wohlnet.ru/g3d/?q=node/24 )
Клавиша Q открывает дверь, W - закрывает и так далее до посинения ;)
Ежели чего не ясно - спрашивай!
PS: единственное что - смотри в режиме Perspective View, а не Camera View, поскольку с камерой я не заморачивался)

Paul_Winex

Спасибки за пример. Одну проблему решил 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

Ниже представлена схема, которую я собрал без использования IF. Основан он на канале Call Selected. Он принимает значение и относительно него вызывает соответствующий канал. Дефолтное значение я поставил 0, и нулевой канал сделал пустым. В канале UserInput менял значение True на 1-3 и при нажатии вызывается соответствующий канал (да, стати, сделал 3 участка на таймлайне с разной анимацией). Внизу слева канал AND, который при совпадении внизу двух единиц тоже получает 1. На основе него надо сделать счетчик, который имеет формулу что-то типа:

If A<3
then
A=A+1
else
A=1


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

Подскажите где можно такое сделать? С Expression Value я не смог подружиться, не пойму что она возвращает.

Paul_Winex

#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-м канале пусто, туда можно и дефолтную запуздырить.

Paul_Winex

#6
Но не думайте что мытарства закончены. Если это дверь или какой аниматорик в музее, то будет глупо если получится его запустить стоя в 20 метрах от него. Надо еще добавить условие расстояния до объекта. Кто знает как вычислять расстояние?
Потом его сравнить по формуле А<=Б и сделать вывод - запускать анимацию или нет.
Так же можно сделать это с помощью учёта коллизии с окружающим (невидимым) объектом. Ну думаю лучше один раз за нажатие просчитать вектор, чем каждый кадр просчитывать наличие коллизии.

Paul_Winex

Если видели схему выше, то поймете.
Между верхним триггером и Call Selected я вставил канал IF. На условие поставил Expression Value с такой формулой:

A=0 || A=10 || A=20 || A=21 || A=30

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

PS. Что насчет рассстояний? Я даже не знаю чем их менрять! Знаю только что надо применить матрицу положение камеры и объекта. А куда применить...?

Paul_Winex

Задача вычисления расстояния уводят нас к истокам другого форума...
https://guest3d.wohlnet.ru/forum/index.php?topic=375.0

DimiS

дядя, это ты сейчас с кем общяешся?)))
в общем всё я не осилил, но могу посоветовать заменить конструкцию типа
Цитата: Paul_Winex от 08 сентября 2009, 15:49:39

If A<3
then
A=A+1
else
A=1



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

Paul_Winex

#10
ЦитироватьА=(А+1)%3

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

PS. хотел выложить исходник, но решил дооформить. Так как на объект надо тыкать мышой, хотел сделать в центре экрана типа прицела и им тыкать. В центре сделал, курсор спрятал, а как теперь сделать так чтобы этот прицел считался курсором? На данном сайте такого не очень нашел или недосмотрел. Поможите!!!! Пример хороший пропадает!!!!
В общем надо как в стрелялках, мышой крутить камеру, цетром совершать взаимодействия.

Paul_Winex

В общем если кто не понял что я скажу, пусть попробует походить по сцене и потыкать по объектам. Что не удобное обраруживается?

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

Чтобы сработала поочередная анимация, надо тыкнуть по кубику с расстояния не менее 2. Тыкая по сфере можно запустить 4-ю анимацию. К сфере тоже надо подойти.
Самое главное - попасть курсором по объекту!!!

DimiS

'%' -- так обозначают операцию "получить остаток от деления"
вызывая А=(А+1)%3 будем перебирать последовательность
0->1->2->0->1->2...
перебирая от 0 до N-1, а не от 1 до N удобнее пользоваться тем же Channel Switch -- не надо делать этих финтов ушами с одним пустым линком

Что касается прицела как в стрелялках, то посмотри ченел Copy Image. Им можно нарисовать прицел. А чтоб определить центр экрана можешь воспользоваться ченелом SysInfo

Paul_Winex

Финт с пустым слотом сделан для отсутствия дефолного положения, мне так легче. Я туда мог просто пустую ноду тыкнуть, это без разницы. Плюс есть возможность добавить дефолтное если потребуется.
Что касается прицела, если ты качал сцену то видел что плюс и так в центре, что я сделал как раз через SysInfo. Вопос в другом, как сделать этот прицел активным для нажатия на объекты вместо курсора?

Paul_Winex

МОЖЕТ МНЕ КТО-НИБУДЬ ПОЯСНИТЬ О ЧЕМ РАЗГОВОР НА ЭТОМ ФОРУМЕ? Я не про перевод а про решение.
http://forum.quest3d.com/index.php?PHPSESSID=r3cjn6uaaq8ouadladffoelv57&topic=39891.msg91918#msg91918 ???