Анимация камеры

Board index Геймдев в Blender Игровой движок Blender

Description: Все вопросы и обсуждения, касающиеся BGE
Moderators: exooman, denis8424

Post #41by Korchy » 07.04.2017, 19:10

Mihanik wrote:Теперь начал ругаться bpy у него видишь ли не определён.
Code: Select all
import bpy

напиши перед проверкой
Code: Select all
print(filename)
и в консоли посмотри, какой путь лежит в filename и соотв. что нужно добавить, чтобы получить корректный путь к файалм

Может лучше делать, как подсказывает Bibo, я в bge не влезал в api, в тонкостях не разбирался, а там похоже немного подругому, чем для обычной сцены.
Korchy M
Avatar
Posts: 3024



Post #42by Mihanik » 08.04.2017, 13:57

Bibo, Korchy, Спасибо, что помогаете!
Однако чудеса продолжаются.
Bibo wrote:К слову, а почему проверяется существование пятого файла с конца, а не текущего файла сразу после сохранения?
Как-то так у меня получилось
Korchy wrote:Может лучше делать, как подсказывает Bibo, я в bge не влезал в api, в тонкостях не разбирался, а там похоже немного подругому, чем для обычной сцены.

Так я с этого начал, но while, если чё не так, вешает блендер, после аварийного закрытия фиг чего посмотришь, вот и написал более безопасный вариант. Кроме того подумалось, что пока он в цикле он не проверяет наличие файла, в теле цикла то ни чего не написано.
Мне то вариант Bibo тоже больше нравится, и сохранять в папку проекта, это правильно. Однако после первого повисания while заменил на if и написал печатать пути в консоль. Вот такая фигня получается, пути совпадают, файлы там лежат, а if not os.path.exists(full_path) всё равно срабатывает.
Spoiler
Image
Скрипт целиком
Spoiler
Code: Select all
from bge import render, logic
import time
import os.path

save_folder = "//bge_rendered/" # Относительный путь к папке сохранения
file_name = "frame_"            # Имя сохраняемого файла
counter = 0                     # Счетчик кадров

def shoot():
    global counter
    save_path = save_folder + file_name + str(counter).zfill(8) #Получаем относительный путь к файлу
    render.makeScreenshot(save_path) # Сохраняем скрин
    full_path = logic.expandPath(save_path)    # Получаем абсолютный путь к файлу
   
    print (full_path) # Печатаем абсолютный путь к файлу
    if not os.path.exists(full_path): # Ждем до тех пор, пока файл не будет сохранен
        print (save_path) #Печатаем относительный путь к файлу
        time.sleep(0.05)
    counter += 1 # Увеличиваем переменную счётчика кадров на 1
Mihanik M
Avatar
Posts: 1571

Post #43by Bibo » 08.04.2017, 16:28

Хреновый из меня программист короче...
Забыл что движок делает свое дело (в том числе сохранение скриншота) после выхода из всех скриптов и контроллеров, то есть тот цикл становился бесконечным и не давал создать скриншот существование которого и проверял.
Переменной full_path забыл добавить в конец ".png", что делало проверку не полного имени.
В общем вот
Spoiler
Code: Select all
from bge import render, logic
import time
import os.path

save_folder = "//bge_rendered/" # Относительный путь к папке сохранения
file_name = "frame_"            # Имя сохраняемого файла
counter = 0                     # Счетчик кадров


def shoot():
    global counter
    if counter == 0:
    # Первый кадр
        save_path = save_folder + file_name + str(counter).zfill(8) #Получаем относительный путь к файлу
        render.makeScreenshot(save_path) # Сохраняем скрин
        counter += 1
    else:
        old_path = save_folder + file_name + str(counter-1).zfill(8) #Получаем относительный путь к файлу
        full_path = logic.expandPath(old_path) + ".png"    # Получаем абсолютный путь к файлу
        if os.path.exists(full_path):
        # Появился ли последний скриншот в папке
            save_path = save_folder + file_name + str(counter).zfill(8) #Получаем относительный путь к файлу
            render.makeScreenshot(save_path) # Сохраняем новый скрин
            counter += 1
Вроде работает. Скриншоты сохраняет в папке bge_render в папке с бленд-файлом.
Bibo
Avatar
Posts: 612

Post #44by Mihanik » 08.04.2017, 17:31

Bibo, да работает, но не так как надо).
time.sleep совершенно необходим. Сейчас он проверяет наличие файла, продолжая воспроизведение и сохраняет следующий, тогда когда сохранился предыдущий, но воспроизведение продолжается, и получаются воспроизведённые но не записанные кадры кадры, это недопустимо. Если нет лучших предложений, придётся вернуться к проверке ранее записанных кадров, 5-го, или 105-го от конца. Смысл всей этой операции просто в том чтоб не дать движку забить оперативу не сохранёнными кадрами. Просто time.sleep(0.05) на каждом кадре работает, но приводит к лишнему ожиданию. Ожидания 0.05, может хватить и на один кадр, и на 5 кадров, в зависимости от многих условий.
Mihanik M
Avatar
Posts: 1571

Post #45by Korchy » 08.04.2017, 19:54

Mihanik,
Расширения же нет в full_path. Добавь для проверки в exists.
Korchy M
Avatar
Posts: 3024



Post #46by Mihanik » 09.04.2017, 05:50

Korchy wrote:Расширения же нет в full_path.
Да не внимательный я.
В общем, вот такой вариант скрипта.
Spoiler
Code: Select all
from bge import render, logic
import time
import os.path

save_folder = "//bge_rendered/" # Относительный путь к папке сохранения
file_name = "frame_"            # Имя сохраняемого файла
counter = 0                     # Счетчик кадров

def shoot():
    global counter
    save_path = save_folder + file_name + str(counter).zfill(8) +".png"#Получаем относительный путь к файлу
    render.makeScreenshot(save_path) # Сохраняем скрин

    full_path = logic.expandPath(save_path)    # Получаем абсолютный путь к файлу
    verify = 0 # переменная для проверки сохранения
    while verify == 0 :# Ждем до тех пор, пока файл не будет сохранен
      if os.path.exists(full_path):
          verify = 1
          print (verify)
      else: 
          print (verify)
          time.sleep(0.001)
    counter += 1 # Увеличиваем переменную счётчика кадров на 1
Скрипт создаёт папку bge_rendered в папке проекта, и пишет секвенцию туда. Если записывать новую секвенцию по верх старой, то защита от переполнения оперативной памяти не срабатывает. Даже не знаю, стоило ли оно таких усилий в то время как, вот такой вариант
Spoiler
Code: Select all
from bge import render, logic
import time
import os.path

save_folder = "//bge_rendered/" # Относительный путь к папке сохранения
file_name = "frame_"            # Имя сохраняемого файла
counter = 0                     # Счетчик кадров

def shoot():
    global counter
    save_path = save_folder + file_name + str(counter).zfill(8) +".png"#Получаем относительный путь к файлу
    render.makeScreenshot(save_path) # Сохраняем скрин
    time.sleep(0.05) # ждём пока файл запишется
    counter += 1 # Увеличиваем переменную счётчика кадров на 1
проще, работает всегда, но гарантированно теряет на кадре, 0.05 секунды. Первый вариант, в моём случае, в среднем терял на кадре 0.01 секунды.
В общем кто потестит на тяжёлых сценах, не идущих в реалтайм, отпишитесь.
Mihanik M
Avatar
Posts: 1571

Post #47by Bibo » 09.04.2017, 11:55

Стану капитаном и отправлюсь в плавание по просторам очевидности.
Вообще эту проблему можно решить только наличием самостоятельной записывающий аппаратуры, которая будет перехватывать видеопоток. Возлагая запись на железо мы, в любом случае, вынуждаем ЦПУ производить компрессию изображения, а задача эта не самая простая для риалтайма.

Для компрессии в PNG (файл с прозрачностью), мы получаем по 4 байта данных на каждый пиксель - по 1 байту на каждый канал RGBA (канал со значением от 0 до 255). Захват с экрана с разрешение 1920х1280 дает нам 2457600 пикселей, что есть (*4) 9830400 байта данных. Итого, перед записью на диск ЦПУ должен обработать ~9 мегабайт данных ужав их в несколько сотен килобайт PNG. Работа в любом случае медленная, ставь слип, не ставь слип, ограничивай, не ограничивай.
Фризы можно было бы сильно снизить, существуй возможность использования способностей BGE в отдельный поток, но увы.

С другой стороны, мы можем заставить BGE записывать на диск изображение без компрессии вовсе. То есть, взять из графического буффера данные отрендеринного изображения без прозрачности (3 байта на пиксель - 1920х1280*3/1024**2 ~ 7 метров) и сохранить эти данные на диск не как изображение, а как простую последовательность байт, а уже по завершению записи когда скорость не важна, прогнать результат через какой-нибудь скрипт, который произведет компрессию в нужный формат.
Но здесь встает вопрос объема жетского и его скорости записи ибо 7mb на каждый кадр, при 30fps получим 63gb на 5 минут видео.
Bibo
Avatar
Posts: 612

Post #48by Mihanik » 09.04.2017, 13:36

Bibo, Да это всё понятно, Но мы вроде бы преследуем задачу создать видео, а не реал тайм приложение, то есть использовать БГЕ рендер не в реалтайме, а как обычный рендер. Для этого, необходимо всего лишь, что бы вся анимация работала строго по кадрам, то есть один цикл расчёта кадра в БГЕ соответствовал одному кадру анимации, и по барабану сколько времени этот кадр рассчитывался, сжимался и сохранялся на диск.
Вот тут
http://blender.stackexchange.com/questions/48976/export-video-from-game-engine-scene
Пишут, что для этого надо снять эту галку.
Spoiler
Image
И мне тоже показалось этого достаточно, но сейчас сравнил кадры, они не соответствуют. Так что и для камеры, и для других анимаций придётся ещё что то написать.
Mihanik M
Avatar
Posts: 1571

Post #49by M_Rodionov » 10.04.2017, 10:42

я пришел к выходу что интернал если использовать запеченку с циклов вместо света по каналу эмишшена + фейковое стекло дает просто бешеную скорость рендера + честное зеркало высокого разрешалова + неограниченную геометрию + честное блюреное отражение там около 3 минут на кадр получается вместе с подготовкой сцены к рендеру. Проблемой тяжелых сцен будет не рендер а именно подготовка к нему - будет занимать больше времени чем сам рендер из за того что идет на 1м ядре
M_Rodionov
Posts: 843

Post #50by Mihanik » 10.04.2017, 23:31

Конечно игровые отражения фейк ещё тот, но и три минуты, не доли секунды. А если заказчику цвет обоев не понравился?
Mihanik M
Avatar
Posts: 1571

Post #51by M_Rodionov » 11.04.2017, 08:30

Mihanik wrote:А если заказчику цвет обоев не понравился?
статичные картинки перед анимацией показать и все утвердить - и все

Added after 2 minutes 39 seconds:
но интерактив в БГЕ вполне можно делать - будет ничем не хуже того же анрыла ибо нам не надо динамический свет и анимацию и всякие эффекты с частицами, нам надо только запеченкку ГИ и гибкую систему материалов - все это в БГЕ есть
M_Rodionov
Posts: 843

Post #52by stanpy » 12.04.2017, 00:02

будет ничем не хуже того же анрыла ибо нам не надо динамический свет и анимацию и всякие эффекты с частицами

Вот именно поэтому и будет хуже. Хотя для потоковой коммерции некритично.
Ryzen7 2700x, 64 Gb, RTX 2070 Super, Win10
stanpy
Avatar
Posts: 976

Post #53by M_Rodionov » 12.04.2017, 08:10

stanpy wrote:для потоковой коммерции
важна цена и сроки при приемлимом результате - отсюда на БГЕ гораздо проще делать проект ибо не надо реэкспортить всю модель а только запечь лайтмапы и быстро перепилить материалы под БГЕ - скорсть сборки ИМХО будт на порядок быстрее анрыла при сопоставимом результате.

Жаль что сообществом БГЕ не форсится...
M_Rodionov
Posts: 843

Post #54by Mihanik » 12.04.2017, 12:08

M_Rodionov wrote:нам не надо динамический свет и анимацию и всякие эффекты с частицами,
Я продолжаю утверждать, что всё это возможно в BGE или лучше говорить о UPBGE., и качество картинки можно получить равное анрилу и превосходящее юнити. Да такие приложения будут медленнее. Сложные, большие, тяжёлые сцены доступные анрилу и юнити могут оказаться недоступны в UPBGE, в равном качестве. Да производительность основное свойство игрового движка. Но если говорить о создании именно видео, все преимущества топовых движков сразу теряются. А если равнять с не реалтайм, получаем производительность на несколько порядков выше, при не значительном снижении качества. Скажем для архивиза качество критично, но там как правило и нужно несколько секунд. Мне приходилось несколько раз делать видео инструкции по монтажу чего либо,(пример ) там уже минуты, десятки минут, а корректность отражений преломлений, освещения далеко не первое требование к такому видео. В общем своя ниша у этой техники определённо есть.
Mihanik M
Avatar
Posts: 1571

  • 6

Post #55by Mihanik » 25.04.2017, 18:17

В общем так, чтоб не быть голословным, несколько дней ковырял UPBGE на предмет создания не игровых качественных матов, света-тени, отражений-преломлений, и видео в целом.
Я б даже сказал, что если у вас нет личной рендерфермы, то UPBGE просто вне конкуренции.
Настройка сцены конечно по дольше и по сложнее , чем для обычного рендера, прежде всего по тому что придётся раздать отражения-преломления всем нуждающимся в них объектам, индивидуально для каждого, и запечь свет (если циклами, то это на сутки). Но две секунды кадр ! всё окупает. Это притом что на простых матах сцена крутилась 60 FPS.
upbge рендер чистый без поста.

Added after 8 minutes 12 seconds:
Ютубка жмёт здорово, покажу несколько скринов.
Spoiler
https://img-fotki.yandex.ru/get/102548/80739172.8/0_ddad2_86a137b9_orig
https://img-fotki.yandex.ru/get/225029/80739172.8/0_ddad4_bf6427e_orig
https://img-fotki.yandex.ru/get/251308/80739172.8/0_ddad3_3bc26231_orig
https://img-fotki.yandex.ru/get/59977/80739172.8/0_ddad6_318fce_orig
https://img-fotki.yandex.ru/get/197102/80739172.8/0_ddad5_9bbb6c41_orig
Mihanik M
Avatar
Posts: 1571

Post #56by niccolo » 25.04.2017, 18:52

Черт, я в шоке! Прямизна рук впечатляет!!!
Mihanik +
Linux Mint Cinnamon 18 3.0.7.
Intel Core i5 CPU3.20GHzx4 16Gb GTX970
niccolo M
Avatar
Location: kazan
Posts: 481

Post #57by ChEmIsT » 25.04.2017, 19:34

Круто конечно...
Это специально отрендерено с эффектом motion blur?
ChEmIsT M
Avatar
Location: Украина, Сумы
Posts: 1556



Post #58by Mihanik » 25.04.2017, 19:59

Пасиб други, но это просто тест, больше смотрел, что можно покрутить и в какую сторону, много чё недокрутил),по старой привычке, рендер намного не контрастный, чтоб иметь возможность поста, и избежать засветов или затемнений.
motion blur, да силами движка, скрипт.
Mihanik M
Avatar
Posts: 1571

Post #59by M_Rodionov » 25.04.2017, 20:49

вопрос, сколько по времени уходит на подготовку сцены? сравнимо ли время подготовки/запекания с рендером в циклах с учетом денойза и упрощенки?
просто свет на 1 комнату - это одно, а на на дом, например на английскую классику в 4 этажа + подвал?
помню когда настраивал комнату - большой геморрой был делать антураж - его надо либо моделить, либо печь лайтмапы высого разрешалова - что в общем то тоже не быстро...
M_Rodionov
Posts: 843

Post #60by Mihanik » 25.04.2017, 21:24

M_Rodionov, это больше от длинны планируемого видео зависит. А упращенка, так она и приподготовке сцены возможна, можно печь интералом, можно и в циклах экономить, меньше семплов-больше блюр. Необязательно все обьекты печь, только крупные. Мелочевку можно отдельной группой только оклюжен. Отражения тоже не каждому обьекту... Тут сам смотри, я то не работаю интерьерным визом, струдом представляю чего там надо. Думаю если от 30 секунд, при всех раскладах UPBGE выграет.

Added after 42 minutes 24 seconds:
Mihanik wrote:motion blur, да силами движка, скрипт.
Упс, поправка, motion blur штатный фильтр БГЕ, там ещё рассеянный свет немного, вот он скриптом.
M_Rodionov, Тут ещё, что понимать под подготовкой, я имел ввиду, что обе сцены делаются с нуля, а ведь у интерьерщиков принято пользоваться готовыми библиотеками моделей и матов. И ещё не юзал денойз, и что там под урощёнкой понимается не особо понял, просто последний интерьер в HD разрешении у меня считался цыклами несколько часов кадр.
Mihanik M
Avatar
Posts: 1571

PreviousNext

Return to Игровой движок Blender

Who is online (over the past 5 minutes)

Users browsing this forum: 1 guest

cron