From BlenderWiki

Jump to: navigation, search
Blender3D FreeTip.gif
IMPORTANT! Do not update this page!
We have moved the Blender User Manual to a new location. Please do not update this page, as it will be locked soon.

Модуль VideoTexture

Модуль VideoTexture позволяет управлять текстурами во время игры. Возможны несколько источников для текстур: видео файлы, файлы изображений, видео-захват, буфер обмена, рендеринг камеры или смесь этого всего. Видео и графические файлы могут быть загружены из интернет, используя URL вместо имени файла. Кроме того, вы можете применять фильтры изображений перед отправкой их в GPU, позволяя создавать видеоэфекты: blue screen, color band, gray, normal map. VideoTexture использует FFmpeg для загрузки изображений и видео. Все форматы и кодеки, которые поддерживает FFmpeg поддерживаются VideoTexture, включая, но не ограничиваясь ими:

  • AVI
  • Ogg
  • Xvid
  • Theora
  • dv1394 camera
  • video4linux capture card (this includes many webcams)
  • videoForWindows capture card (this includes many webcams)
  • JPG


Как это работает?

Принцип прост: сначала определите существующую текстуру объекта и имя, а затем вы создаете новую текстуру с динамическим контентом и подгружаете две текстуры в GPU. GE не знает о замене и продолжает выводить на экран объект как всегда, за исключением того, что Вы теперь контролируете текстуру. В конце удаляется новая текстура, и старая текстура восстанавливается.

Существующая страница - руководство по модулю VideoTexture
с простыми примерами.

Подготовка

Прежде чем использовать модуль VideoTexture, у вас должны быть объекты с текстурами, наложенные надлежащим образом.

Представьте что вы хотите иметь телевидение, которое показывает программы прямого вещания в игре. Вы создадите объект телевизор, покроете UV текстурой его экран, например "tv.png". То на что похожа эта текстура не важно, вероятно вы хотите сделать экран тёмно-серым, для имитации выключенного телевизора. При включении телевизора вы создаёте динамическую текстуру видеозахвата и используете её вместо tv.png: экран телевизора оживёт. Есть два способа определения текстур, которые вы можете получить с помощью модуля VideoTexture:

  1. UV текстура
  2. Материал с текстурой

Потому что VideoTexture работает на уровне текстуры, он совместим со всеми замысловатыми ухищрениями GE, текстурирования: GLSL, multi-texture, custom shaders и т.д.

Создание скрипта

Давайте предполагать, что у нас есть игровой объект с одной или более присвоенными материалом/изображением, на который мы хотим вывести на экран видео.

Первым шагом является создание Texture объекта. Мы будем делать это в сценарий, который выполняется один раз. Скрипт, как правило, присоединяется к объекту, на котором мы хотим отображать видео, так что мы легко можем получить ссылку на объект:

 import VideoTexture
 
 contr = GameLogic.getCurrentController()
 obj = contr.owner
 
 if not hasattr(GameLogic, 'video'):

Проверка атрибута “video” только уловка, чтобы убедиться, что мы создаем текстуру только один раз.

Поиск материала

     matID = VideoTexture.materialID(obj, 'IMvideo.png')

VideoTexture.materialID() удобная функция, чтобы получить объектный материал, который использует video.png как текстуру. Этот метод работает с материалом и UV текстурой. В случае текстуры UV текстуры, этот метод захватывает материал соответствующий поверхности, этой присвоенной текстуры.

IM” префикс указывает, что мы ищем имя текстуры, но мы можем также искать материал, давая “MA” префикс. Например, если мы хотим счесть материал вызванным VideoMat на этом объекте код становится:

     matID = VideoTexture.materialID(obj, 'MAVideoMat')


Создание текстуры

VideoTexture.Texture класс который создаёт Texture и загружает динамическую текстуру в GPU. Конструктор берет одно обязательное и три дополнительных параметра:

gameObj
игровой объект.
materialID
Материал индекса возвращается VideoTexture.materialID(), 0 = первый материал по умолчанию.
textureID
Индекс текстуры в случае мультиструктуры, 0 = первый канал по умолчанию. В случае UV текстуры этот параметр должен всегда быть 0.
textureObj
Ссылка на другой Texture объекта, в котором мы хотим повторно использовать текстуру. Если использовать этот аргумент, мы не должны создавать никаких источников на эту текстуру и нет необходимости обновлять её либо другие Texture объекта обеспечит текстуры для обоих материалов / текстур.
     GameLogic.video = VideoTexture.Texture(obj, matID)


Сделаем текстуру постоянной

Объект Texture должен быть постоянным. GameLogic объект модуля - удобное место, чтобы хранить постоянные объекты.

Создание источника

Мы должны создать исходный объект из одного из возможных источников доступных в VideoTexture:

VideoFFmpeg
Движущиеся картинки
Видео файл, захват видео, потоковое видео.
ImageFFmpeg
Фотоснимки.
Файл изображения, изображение в сети.
ImageBuff
Изображение из памяти приложения.
Для компьютерных изображений, используя приложения.
ImageViewport
Часть или вся область просмотра рендеринга активной камеры.
ImageRender
рендер от неактивной камеры.
ImageMix
Сочетание двух или более перечисленных источников.

В этом примере мы используем простой видео файл в качестве источника. VideoFFmpeg конструктор принимает имя файла в качестве аргумента. Чтобы избежать путаницы с расположением файла, мы будем использовать GameLogic.expandPath() для создания абсолютного имени файла, предполагая, что видео-файл находится в том же каталоге файл blend:

     movie = GameLogic.expandPath('//trailer_400p.ogg')
     GameLogic.video.source = VideoTexture.VideoFFmpeg(movie)

Мы создаем видео исходного объекта и присвоить его Texture объекта source атрибут установить источник и сделать его постоянным: Texture объекта является постоянной, исходный объект также будет постоянным.

Обратите внимание, что мы можем менять Texture источник в любое время. Предположим, мы хотим, чтобы переключаться между двумя фильмами в ходе игры. Мы можем сделать следующее:

     GameLogic.mySources[0] = VideoTexture.VideoFFmpeg('movie1.avi')
     GameLogic.mySources[1] = VideoTexture.VideoFFmpeg('movie2.avi')

А потом назначать (и переназначить) источник во время игры:

     GameLogic.video.source = GameLogic.mySources[movieSel]


Настройка источника

VideoFFmpeg источник имеет несколько атрибутов для контроля воспроизведения фильма:

range
[start,stop] (floats).
Установка времени начала и конца видео. Исчисление времени начинается с начала видео. По умолчанию воспроизводится всё видео.
repeat
(integer).
Повтор. установите -1 для бесконечного повтора.
framerate
(float).
Относительная частота смены кадров, <1,0 для медленного,> 1,0 для быстрой
scale
(bool).
Установите в True, чтобы активировать алгоритм масштабирования. Текстура ширины и высоты должно быть степенью 2. Если размер видео картина не является степенью 2, масштабирование не требуется. По умолчанию VideoTexture использует точной, но медленной gluScaleImage() функцию. Лучше всего провести масштабирование видео в оффлайне, так как необходимо время во время выполнения.
flip
(bool).
Установите в True, если изображение должно быть вертикально перевернутым. FFmpeg всегда обеспечивает изображение вверх ногами, так что этот атрибут имеет значение True по умолчанию.
filter
Установить дополнительный фильтр на видео перед отправкой на GPU. Назначают по 1 из VideoTexture объекта фильтра. По умолчанию изображение отправить в неизмененном виде GPU. Если альфа-канал присутствует в видео, оно будет автоматически загружен и отправлен в GPU также.

Мы просто установить для scale атрибут True потому gluScaleImage() действительно слишком медленно для видео в реальном времени. В случае, если размеры видео имеет степень 2, то это действие не имеет никакого эффекта.

     GameLogic.video.source.scale = True


Проигрывание видео

Теперь мы готовы проиграть видео:

     GameLogic.video.source.play()

Воспроизведение видео не в фоновом режиме: это происходит только тогда, когда обновить текстуры. Таким образом, мы должны иметь другой сценарий, который выполняется на каждом кадре, и призывает refresh() метод Texture объекта:

if hasattr(GameLogic, 'video'):
    GameLogic.video.refresh(True)

</source>

Если источник видео остановлен, то refresh() никакого эффекта не имеет. Аргумент refresh() является флагом, который указывает, текстуры должны быть пересчитаны на следующее обновления. Для воспроизведения видео, вы хотите окончательно установить значение сенсора True.

Проверка статуса видео

Видео источник классов (например, VideoFFMpeg) имеют атрибут status. Если видео играет, его значение 2, если он остановился, это три. Таким образом, в нашем примере:

 if GameLogic.video.source.status == 3:
     #остановка видео

Расширенная работы потока

True аргумент в Texture.refresh() метод лишает силы буфер изображения после посылки изображения в ГПУ невозможно образ загрузить из источника. Это побочный эффект делает изображение недоступны для Python. Вы также можете сделать это вручную, путем вызова с помощью метода refresh() источника напрямую.

Вот несколько возможных передовых потока работы:

  • Использование изображений буфера в Python (не влияет на текстуру):
     GameLogic.video.refresh(False)
     image = GameLogic.video.source.image
     # Изображение бинарного буфера строки пикселей ряд основных RGBA
     # ...использование изображений
     # лишает законной силы это для следующей структуры
     GameLogic.video.source.refresh()
  • Загрузить изображение от источника для Python wihtout обработки загрузки GPU:
    # Отметить, что мы даже не звонить на обновления текстур
    # Мы могли бы просто создать исходный объект без текстур объекта
     image = GameLogic.video.source.image
     # ...использование изображений
     GameLogic.video.source.refresh()


Загрузить демо

Для загрузки демо жми сюда.