Как сделать запись и воспроизведение "демки на движке" ?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Как сделать запись и воспроизведение "демки на движке" ?

Сообщение Alex2013 » 04.04.2021 11:01:32

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

По идее так как задача отнюдь не уникальная где-то должен быть набор готовых компонентов но найти что-то подходящие пока не получилось .
Зы
В моем проекте "Цифрова оптика" есть возможность записи и воспроизведения состояния, но это разумеется, не то что нужно мне сейчас ( как-то пробовал сделать там "анимацию" из набора "сэйвов состояния" вместо кадров но это как-то криво работает дискретно и без "ощущения полета" ) .
Alex2013
долгожитель
 
Сообщения: 2922
Зарегистрирован: 03.04.2013 11:59:44

Re: Как сделать запись и воспроизведение "демки на движке"

Сообщение скалогрыз » 04.04.2021 22:06:20

Alex2013 писал(а):В моем проекте "Цифрова оптика" есть возможность записи и воспроизведения состояния, но это разумеется, не то что нужно мне сейчас ( как-то пробовал сделать там "анимацию" из набора "сэйвов состояния" вместо кадров но это как-то криво работает дискретно и без "ощущения полета" ) .

запись состояния это то, что тебе нужно.
при воспроизведении списка состояний, тебе просто нужно интерполировать результат, и тогда будет "ощущения полёта", потому что всё будет плавно.

Естественно, сохранять состояние "целиком" может быть избыточным. Но это уже вопрос к "движку".
Если в "движке" есть некоторые данные, которые можно надёжно интерполировать опираясь на предыдущее значение + время, тогда такие данные не нужно сохранять на "каждое состояние", а только в те моменты, когда эти данные меняются.

Как в видео кодировке, есть "ключевой кадр" (который по сути - картинка целиком), есть последующие слайды, которые "только изменения к ключевом".

Общий подход прост:
* снимать состояние на каждый "кадр" ("тик", "апдейт") движка
* сохранять те данные, которые невозможно надёжно интерполировать
* те данные, которое можно интерполировать, сохранять только с тем "кадрами", когда значение данных меняется/задано впервые.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Как сделать запись и воспроизведение "демки на движке"

Сообщение Sharfik » 04.04.2021 22:59:43

Читаю и суть вопроса не совсем ясна, что в конце. Наверно шифр для избранных. Можно записать "демку движения" двумя способами:
1. Запись положений камеры и потом в той же программе проигрывание ее положений, без участия пользователя, просто зная временные интервалы. Как в Counter-Strike
2. Запись видео файла. Тут балаган из записи положений камеры, записи чистого видео покадрам, и его кодированию последующему кодеком. И в конце зависание с перегрузкой памяти.)))
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 759
Зарегистрирован: 20.07.2013 01:04:30

Re: Как сделать запись и воспроизведение "демки на движке"

Сообщение Alex2013 » 05.04.2021 10:49:06

Sharfik писал(а):Читаю и суть вопроса не совсем ясна, что в конце. Наверно шифр для избранных.

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

Если еще не понятно, то объясню более конкретно :
Сейчас я пишу управляемую 3D/VR техно демку, а раз она управляемая значит не содержит заранее заданного сценария, а это и хорошо и плохо . Хорошо, потому что с ней можно провозится "в ручном режиме" и вообще использовать как полезную утилиту, но плохо если я хочу просто показать "возможности технологии" и похвастаться достижениями. А поскольку технодемка постепенно усложняется, то сходу четко показать ее возможности чем дальше тем сложнее (Получается эдакий "орган" на котором нужно сходу "слабать мурку" )
Да, для "простого 3D" можно просто записать с экрана ролик ....

Изображение
(Запуск оп клику.)

Но во первых, это местами проблемно (в программе уже сейчас несколько окон с настройками + есть неизбежная потеря качества ) а вторых демка рассчитана на поддержку VR, что вообще делает "плоскую" запись изрядно бессмысленной, а если пытаться записывать "сферическое стерео" это еще сложнее и файлы выходят чудовищными по размеру + такой ролик не позволит показать работу программы в целом .

Вывод прост: нужно сделать запись и воспроизведение "полетов фантазии " в самой программе .

Добавлено спустя 44 минуты 21 секунду:

Скалогрыз, спасибо за отзыв и участие в мозговом штурме !
скалогрыз писал(а):
Alex2013 писал(а):В моем проекте "Цифрова оптика" есть возможность записи и воспроизведения состояния, но это разумеется, не то что нужно мне сейчас ( как-то пробовал сделать там "анимацию" из набора "сэйвов состояния" вместо кадров но это как-то криво работает дискретно и без "ощущения полета" ) .

запись состояния это то, что тебе нужно.
при воспроизведении списка состояний, тебе просто нужно интерполировать результат, и тогда будет "ощущения полёта", потому что всё будет плавно.

В принципе мысль годная . Но как это совместить с кучей настроек и переключений режимов во "внешнем интерфейсе" программы большой вопрос.
Естественно, сохранять состояние "целиком" может быть избыточным. Но это уже вопрос к "движку".
Если в "движке" есть некоторые данные, которые можно надёжно интерполировать опираясь на предыдущее значение + время, тогда такие данные не нужно сохранять на "каждое состояние", а только в те моменты, когда эти данные меняются.

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

Общий подход прост:
* снимать состояние на каждый "кадр" ("тик", "апдейт") движка
* сохранять те данные, которые невозможно надёжно интерполировать
* те данные, которое можно интерполировать, сохранять только с тем "кадрами", когда значение данных меняется/задано впервые.

По моем большая часть реализаций "записи ролика на движке" делается существенно проще! Просто записывается не состояние движка, а поток данных идущий от клавиатуры мышки и т.д., а при воспроизведении записанный поток тупо подменяет реальный. (Запись состояния нужна только одна и исключительно для задания верной "стартовой позиции" )
Последний раз редактировалось Alex2013 05.04.2021 12:06:20, всего редактировалось 2 раз(а).
Alex2013
долгожитель
 
Сообщения: 2922
Зарегистрирован: 03.04.2013 11:59:44

Re: Как сделать запись и воспроизведение "демки на движке"

Сообщение sts » 05.04.2021 12:05:30

в движке нужен слой абстракции в котором управляющие воздействие - нажатие кнопки, то се, переводятся в действия типа игрок идет из точки а в точку б, при этом используется тотже механизм что и для других интерактивных элементов типа монстров, действия привязаны к tick-ам - временным меткам. все процессы в сцене протекают путем обработки таких действий. при записи демки сохраняются ключевые состояния (с какойто периодичностью) и поток действий между ними.

Добавлено спустя 6 минут 2 секунды:
Re: Как сделать запись и воспроизведение "демки на движке" ?
sts писал(а):в движке нужен слой абстракции

он же используется для поддержки разных контроллеров, типа клавамышь, геймпад, сенсорный экран

Добавлено спустя 3 минуты 9 секунд:
Re: Как сделать запись и воспроизведение "демки на движке" ?
да и сетевая игра тоже через проигрывание действий делается
sts
постоялец
 
Сообщения: 406
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Как сделать запись и воспроизведение "демки на движке"

Сообщение Alex2013 » 05.04.2021 12:33:20

sts писал(а):в движке нужен слой абстракции в котором управляющие воздействие - нажатие кнопки, то се, переводятся в действия типа игрок идет из точки а в точку б, при этом используется тот-же механизм что и для других интерактивных элементов типа монстров, действия привязаны к tick-ам - временным меткам. все процессы в сцене протекают путем обработки таких действий. при записи демки сохраняются ключевые состояния (с какойто периодичностью) и поток действий между ними.

Хм ! Интересно. Но у меня не пока, что не игра или просто программа "с встроенным" перманентно однообразным миром с ограниченным числом взаимодействий, а растущая как "на дрожжах" техно-демка сочетающая в себе множество разных тестов для будущих "полноразмерных" проектов . Так что если сделать "запись ролика с опрой на движок" , то в самом его написании и развитии , нужно будет постоянно учитывать и поддерживать необходимость записи состояния ( а часть реализации это "по умолчанию" вообще отрицает ) А в случае записи и воспроизведения "потока управления без опоры на движок" это блок будет почти полностью независим и универсален. (Хотя есть проблемы с реализацией "режима перемотки", но это ИМХО куда меньшая проблема )
Последний раз редактировалось Alex2013 05.04.2021 16:54:22, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 2922
Зарегистрирован: 03.04.2013 11:59:44

Re: Как сделать запись и воспроизведение "демки на движке"

Сообщение Sharfik » 05.04.2021 16:01:35

ИМХО, самый дешевый способ:
SetParam('кубик35','X',45)
SetParam('Main',ViewFPS',True)
GetParam('кубик35','X',0)
При активной галочке записи они же и будут параллельно записывать изменений состояния в лог и проигрывать его во всех направлениях.
Замучишься потом поддерживать, если по другому.

GUI/Keyboard/Mouse
|
ClassController
|
Крутой движок
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 759
Зарегистрирован: 20.07.2013 01:04:30

Re: Как сделать запись и воспроизведение "демки на движке"

Сообщение Alex2013 » 05.04.2021 17:32:44

Текущие состояние.
"Крутой движок" - нет
"ClassController" - нет
GUI - почти нет.
/Keyboard/Mouse - система перемещений из демки с танком ( похожим на кирпич)
(Прямо планета Шелезяка ... :wink: )

Разумеется, если будет запись "скрипта" в файл, то скорее всего там будет похожий "псевдо текстовый" формат.
И включения выключения галочек будут записываться похожим на предложенный формат образом .

Но все-же тотальная запись всех обрабатываемых событий проще .
То есть "общая форма записи" скорее всего будет такой Event +1.51 kb Down 'W"
1.51 время в секундах после предыдущего события .
(Да кстати, пока малая (но впоследствии большая) часть GUI находится непосредственно в 3д сцене (уже сейчас есть выбор и сдвиг "чипов" причем несколькими способами ) . )

Но проблема во первых, в том как собрать и правильно сохранить события из нескольких окон, а после записи правильно подменить реальный поток при воспроизведении. В общем мне бы для начала, хорошо бы найти пример создания и воспроизведения клавиатурных и "мышиных" макросов. :idea:
Зы
То что для чего я взялся писать эту технодемку довольно далеко от игровых проектов ( В основном правда потому что достаточно интересный игровой проект я сейчас просто не потяну - не хватит знаний и опыта ) и как я написал в ReadMe .
Основные направления :
1 Сбор элементов нужных для создания программы наподобие всем известного пакета "Виртуал Десктоп" .
2 Разработки аналогов GUI интерфейса "общего назначения" для ВиАр (с возможностью использовать его и на обычном экране).
3 Разработка редактора мнемонических схем ( для проектов вроде среды программирования HiAsm ).
4 Генерация 3д ландшафта и возможность взаимодействия с ним (на будущее и не только для игр )
5 В планах также использование наработок из этого проекта в проекте "Цифровая оптика" (Разработка интерфейса дополненной реальности )


В принципе на "первом уровне" все задачи хоть частично но решены и ведеться подготовка к подъему на "уровень 2" :

1 Несколько виртуальных экранов (под отдельные программы )+ возможность произвольного расположения их в пространстве
(Сейчас в основном есть возможность "крутить всю сцену" но это разумеется слишком неудобно )
2 Полный 3D аналог GUI формы или хотя бы готовые базовые элементы (меню ,читалка длинных текстов, вывод строк и т.п. )
(Сейчас есть только некая условно " зеркальная форма" )
3 Загрузка реальных схем HiAsm с подписям и просмотром параметров каждого элемента
(сейчас есть некая отдаленно похожая абстракция + нет удобного просмотра )
4 Загрузка и частичная генерация простого "3д- интерьера"
(Сейчас есть только несколько моделек + "фоновая сфера" )
5 Хотя бы минимальная интеграция с программой "Подзорная труба" из проекта "Цифровая оптика"
(Сейчас возможен захват видео потока из ПТ, но это точно не интеграция )


Так что запись макрос-роликов пока не очень актуальная часть проекта но думать о ней можно и нужно уже сейчас .
Alex2013
долгожитель
 
Сообщения: 2922
Зарегистрирован: 03.04.2013 11:59:44

Re: Как сделать запись и воспроизведение "демки на движке"

Сообщение Cheb » 12.04.2021 15:11:12

Слой абстракции ввода и сериализации всех событий - лишь начало
Дальше идёт борьба за сериализацию (я два года положил, с 2006 по 2008-й, и до сих пор допиливаю), борьба за детерминизм физики (что даёт идентичный до бита результат при идентичных событиях ввода) - к счастью, расчёты, сделанные на Паскале без применения asm+sse, детерминистичны - подгонка структуры физики так, чтобы не зависела от частоты кадров рендера...

Фундамент под эту "простую" задачку приходится пилить годами. См. мой движок, на 70% состоящих из этих решений.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Как сделать запись и воспроизведение "демки на движке"

Сообщение Alex2013 » 12.04.2021 15:57:14

Cheb писал(а):Фундамент под эту "простую" задачку приходится пилить годами. См. мой движок, на 70% состоящих из этих решений.

В принципе я догадываюсь что "правильное решение" подобной задачи совсем не простое дело .
Но пока у меня даже "задача минимум" ( натолкать в технодемку простых и быстро реализуемых механизмов на уровне вопроса "а стоит ли вообще ими заморачиваться" ) не решена.
И опять-же по опыту знаю что перфекционизм в моем случае не работает как надо . То есть я запросто могу зарыться в "побочный квест" и в кой-то момент "упустить время актуальности основной задачи" . Так что мне нужна разработка в стиле "Старшип имени Илона Маска"
То есть постараться на каждом уровне приближения иметь перед глазами "экспериментальный образец".
Alex2013
долгожитель
 
Сообщения: 2922
Зарегистрирован: 03.04.2013 11:59:44

Re: Как сделать запись и воспроизведение "демки на движке"

Сообщение runewalsh » 12.04.2021 22:25:45

Cheb
С тем, что описал sts, детерминизм и не нужен. Через определённые промежутки времени, пусть каждые 10 секунд, запоминается полное состояние (даже дельта с предыдущим полным). Какая-либо рассинхронизация будет ограничена этими 10 секундами.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 578
Зарегистрирован: 27.04.2010 00:15:25

Re: Как сделать запись и воспроизведение "демки на движке"

Сообщение Alex2013 » 11.01.2022 23:09:23

В общем что-то похожее на то что должно быть сделал ...
Секрет оказался довольно прост, вместе с восстановлением состояния нужно самостоятельно вызвать рендер не дожидаясь "штатного прохода" (и отключив его на время нужное для экстренного обновления ) . А при восстановлении состояния менять только те параметры и опции что реально изменились.
Зы
Если будете делать что-то похожее обязательно сразу озаботьтесь режимом перемотки (Иначе при отладке будет мерва ! ) :wink:

Добавлено спустя 23 часа 35 минут 11 секунд:
Re: Как сделать запись и воспроизведение "демки на движке" ?
Вчера чуть не спятил ловя "нерегулярный глюк" но зато теперь функционал окна записи и проигрывания демо ролика достаточно полный
(есть пуза, перемотка , продолжение записи,запись на диск и чение с диска пока что все это заметно сыровато но уже работает )
Изображение

Изображение
Alex2013
долгожитель
 
Сообщения: 2922
Зарегистрирован: 03.04.2013 11:59:44


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 29

Рейтинг@Mail.ru