Динамическая стереограмма

15.08.2007 Владимир Бабушкин

С игрой не связано, но имеет прямое отношение к 3D — любую трёхмерную штуку можно представить в виде стереограммы.

Существует множество программ для создания статичных стереокартинок, но мне было интересно, как этот эффект будет выглядеть в динамике.

Алгоритм построения анимированного стереоизображения я реализовал около года назад на Flash. Получился довольно простой и короткий код, который из графического шума строит стереограмму по специальной чёрно-белой карте, созданной по принципу «чем ближе, тем светлее» (очень похоже на визуализацию z-буфера). На каждый кадр анимации создаётся такая карта глубин и по ней стереокадр. Получается стереоанимация.

Не все умеют видеть стереограммы, но те у кого получается, увидят пульсирующий логотип Альтернативы.

Stereogram

  • Пробел — остановить/возобновить анимацию.
  • Комментарии (17) на “Динамическая стереограмма”

    1. 3Dimka Says:

      Забавно получилось :)
      http://community.livejournal.com/3d_magic_eye/

    2. Vee Says:

      супер эффект! сначало ниче не видел! а потом как в стеклянном телевизоре лого пульсирует!

    3. Антон Волков Says:

      Даёшь стерео-режим в 3D-движке! :)

      Кстати, можно попробовать стерео для анаглифных очков.

    4. FSB Says:

      Первый раз вижу анимированное стереоизображение )

    5. MixailV Says:

      Раньше тоже увлекался просмотром стереограмм, с анимацией просто башню срывает, супер!
      А можно как нить увидеть алгоритм преобразования «специальной чёрно-белой карты» в стерео?

      p.s. Анаглиптика кстати не сложно делается, эксперементировал в свое время — эффект прикольный.

    6. Владимир Бабушкин Says:

      Да вот вобщем-то и весь алгоритм:

      bitmapData.noise();
      bitmapData.applyFilter(bitmapData, bitmapData.rectangle, new Point(), new DisplacementMapFilter(grayScaleMap, new Point(), 1, 0, 256, 0, «ignore»));

      Там ещё около 50 строчек, но это импорты классов, объявления переменных, события и разные графические украшательства. Основа эффекта — DisplacementMapFilter. Даёшь ему чёрно-белую карту и он сам по ней делает стереограмму, его только надо заставить правильно работать. Я был в шоке, когда случайно обнаружил это. Поскольку это встроенный фильтр, у него внутри быстрые низкоуровневые алгоритмы обработки растра. Поэтому всё так шустро работает. Если бы я реализовал этот эффект через getPixel/setPixel, ФПС был бы наверное меньше 0.1.

    7. ALFer Says:

      Да, всё гениальное просто!

    8. 3Dimka Says:

      Я сначала даже не сразу осознал, что стереограмма генерируется на лету, вот это да! Это же можно делать 3D игры в режиме стереограммы! Я делал Stereogram Tetris на флеше, но для этого пришлось все комбинации сгенерировать отдельно и включить готовыми изображениями во флэшку.

      К сожалению у меня не получилось повторить такой же результат как у вас:
      http://pics.livejournal.com/3dimka/pic/00040pxc
      Не могли бы вы подробнее описать ваш метод, или еще лучше выслать/выложить исходник (3dimka/gmail/com)?

      Я слышал в фотошопе тоже есть такой фильтр, можно ли вашем методом делать стереограммы в фотошопе?

      Вообще ваш проект — просто фантастика, я и не подозревал, что Такое можно делать на флеше!

    9. Владимир Бабушкин Says:

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

    10. VapeS Says:

      Нашел очень интересную вещь. Переписал ваш код на as3 и нашел разницу в применении DMF.
      Вот исходник http://vapes.na.by/bug.fla. Снизу написано на 3, сверху — на 2. На первый взгляд различий нет (или я ошибся?), но работает по разному.
      Если это всеже баг плеера, то можно ли как-нибудь его обойти? (например клонировать текстуру и потом применить фильтр?)

    11. Владимир Бабушкин Says:

      Глянул, так и не понял, почему такая разница при одинаковом коде.
      Однако, если применение фильтра (последняя строка) вызывать столько раз, сколько периодов (в данном случае 9), то всё гут. Наверное 8 так и делает, только сама :))

    12. VapeS Says:

      Спасибо за подсказку (на заметку: делаю онлайн генератор стереограмм на флексе). Коды и исходники выложу на блоге (если вообще его закончу).
      А вот по поводу бага наверное лучше запостить в адобовскую jira. Я уже 2 серьезный баг нахожу у этого малоизведанного, но любимого фильтра.

    13. moby Says:

      Владимир, мне на работе дали задание. Часть этого задания — это генерация стереограммы. Что-то получаеться, что-то вызывает трудности.

      Пожалуйста помогите. :) Я пишу на шарпе и те две строчки кода, что вы привели мне особо ничего не сказали.

      Если вас не затруднит, вышлите, если не весь когд, то хотябы часть про алгоритм построения на почту moby@iitp.ru

    14. k06a Says:

      Не могли бы вы пояснить параметры у DisplacementMapFilter ?
      Нужно понять что именно делает этот фильтр . . .
      Потому-что делаю сейчас проект по стереограммам не на флеше . . .

    15. Владимир Бабушкин Says:

      Этот фильтр двигает пикселы в соответствии с картой.
      Подробнее можно прочитать на http://livedocs.adobe.com/flex/gumbo/langref/

    16. Антон Волков Says:

      Ссылка на русский хелп по DisplacementMapFilter:
      http://help.adobe.com/ru_RU/AS3LCR/Flash_10.0/flash/filters/DisplacementMapFilter.html

    17. Kindboy Says:

      Уважаемый автор статьи. У меня есть давняя мечта -идея для реализации которой необходимо использование фильтра из этого примера, но сам я только начал постигать азы программирования Flash. Я дизайнер. Если Вам не солжно отпишите мне в skype — nifa_kind_boy или icq 470891794.

    Оставить комментарий

    (Регистрация)