Как сделать стерео картинку на компьютере

Обновлено: 06.07.2024

Лично для меня программа выше всех похвал. Я бы сказал она уникальна, проста и действительно создает (конечно, не без вашего участия) качественные стереофото и самое важное, без потери цветовой гаммы обрабатываемой фотографии.

Плюсы программы:
- Не требует инсталляции. Прямой EXE - файл.
- Работает под Win.XP, Win.7/ Win.8. Под десятку не проверял.
- Множество дополнительных функций по обработке и доработки изображения.
- Два режима стерео очков.
- Не нужно заранее обрабатывать исходное изображение и делить их на правое и левое. Эффект создается с использованием одной фотографии. Программа сама расположит их на левое и правое и наложит друг на друга.
- Простое создание.

Минус программы:
- Не русифицирована.
Этот минус мы с вами устраним, разобрав важное. Я подробно остановлюсь именно на том, что вам понадобиться для создания стереофото, остальные необязательные функции вы освоите сами. Перед тем как мы вместе создадим стереофото, разберемся в нюансах.

1. Стереоочки. Для этого описания и созданных мной стереоизображений я взял стандартные простые пассивные бумажные очки. Их можно купить с детской раскраской. Левая линза красная. Правая линза синяя.

2. Фотографии. С фотографиями я пошел по пути от сложного к простому. Почему от сложного? Для вашего понимания. Разберем два фото. Фото Су-34, может и 35, поправьте если что. Второе фото космонавта с Роскосмоса. На оригиналах вы видите один существенный недостаток для создания стерео.

К примеру, на фото Су, самолет “маскируется” своим окрасом с фоном неба. На фото космонавта с МКС, в открытом космосе, его кисть руки с призывом: “Хорош бухать! Откройте. ” сливается с цветом скафандра.

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

3 . Фон должен быть второстепенным, но не расплывчатым. При этом! Чем больше объектов на главном плане, тем сложнее создать стереофото. Особо сложно этого добиться, когда множество изображений разноцветных и ярких смешаны с первым планом, вторым планом и фоном.

4 . Не забывайте главного. Ваша стереофотография не должна искажать оригинал. Она должна быть его повторением, даже если вы создаете фрагмент.

5 . Создавая стереофото, берите за основу фотографии с одним или двумя объектами главного плана изображения фотографии. Не все фотографии могут быть объемными. В стереофильмах таким сложным изображениям создают обратный эффект. Не объем, а глубина и это тоже интересный стереоэффект.

6 . Любой стереоэффект замечательно смотрится с расстояния не менее 1 метра!

НАЧИНАЕМ РАБОТУ.
1. Открываем нашу программу и выбранную фотографию. Одна и та же фотография будет и левой и правой.


Скрин программы - 1.

Скрин программы – 2.



Скрин программы – 3.



2. Нажимаем кнопку квадратики с шашечками. Программа объединяет нашу левую и правую фотографии, накладывая одно изображение на другое. Смотрим на фотографию боевого самолета. Сама по себе фотография уже имеет зрительный эффект объема.



3. Я очертил квадратами те точки на фото, которые желательно сделать объемными.



Главный план: Фонарь кабины пилота; Плоскости, ведущие к двигателям; Пилоны крыльев. Нос самолета чуть опущен вниз. Не станем нарушать конструкцию, лишь слегка выразим.

Второй план: Разогретый двигателями воздух; Облака. Облакам не следует повторяться или расплываться; Поверхность земли. Создадим глубину высоты.


ПЕРЕХОДИМ В РЕДАКТОР.
Нажимаем кнопку “Красный квадрат на синем квадрате”.

Одеваем стерео очки. Советую развернуть окно редактора на весь экран. Редактор черно-белый, за что разработчикам спасибо. Глаза не устают. Но это не значит, что ваше изображение будет чёрно-белым.

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

1. Basic. Вначале левое изображение L разворачиваем влево. Для этого пользуемся бегунками Rotation. Левое изображение L, увеличиваем бегунком Image Size. У нас есть бегунки H и V Position. Ими совмещаем наше изображение самолета. Нажимаем “OK” и уже на цветном изображении корректируем на клавиатуре стрелочками. Те стрелочки, что расположены под клавишей SHIFT.


2. Снова заходим в редактор. Вкладка Barrel. Разворачиваем левое изображение, тянем бегунок вправо. Переходим на вкладку V_Pers и тянем правое изображение R чуть вправо. Нажимаем “OK”. Корректируем на клавиатуре стрелочками наш самолет. Делаем выразительными фонарь кабины и пилоны.


3. Возвращаемся в редактор для создания высоты, постановки крыльев. Именно постановка крыла по отношению к земле нам создаст эффект высоты. Для этого переходим во вкладку H_Pers. Нажимаем “OK”.


При каждом изменении фотографии обязательно смотрите на полученный результат в 100% размеров самой фотографии. В программе предусмотрен просмотр изображения без интерфейса, а также сетка.

СОХРАНЯЕМ.
4. В программе есть возможность добавить надпись, но только на латинице и поставить на свое изображение логотип.



5. Свой результат, с которым вы еще хотите продолжить работать можете сохранить как File -- Save Left/Right Images. Лучше всего сохранять в формате BMP. У вас сохраниться два изображения левое и правое, которые вы всегда сможете загрузить и продолжить обработку.



Наш готовый самолет мы сохраняем как стереоизображение. File – Save Stereo Image. Я сохраняю в формате BMP.
Для этого поста в JPEG. Смотрим на полученный результат.

ИТОЖИМ.
Старайтесь создавать изображение с перерывами. Сделали, сняли очки, передохнули и продолжили. Полезно делать несколько вариантов изображений и затем с отдохнувшими глазами выбрать что-то одно. Я так поступил при обработке фотографии космонавта.



Вот ссылка на тему автора. Экскурсия на Мосфильм.

Теперь я предлагаю вам самим ознакомиться с созданием стерео. Создайте свое стерео. Программа "StereoPhoto Maker" - Бесплатно.

СКАЧАТЬ

Успешного вам творчества!

Комментарии к публикациям временно отключены.

Пришли очередные выходные, надо написать пару десятков строк кода и нарисовать картинку, да лучше не одну. Итак, на прошлых и позапрошлых выходных я показал, как делать трассировку лучей и даже взрывать всякое. Это многих удивляет, но комьпютерная графика — очень простая вещь, пары сотен строк голого C++ вполне хватает на создание интересных картинок.

Тема сегдоняшнего разговора — бинокулярное зрение, причём сегодня даже до ста строк кода не дотянем. Умея рендерить трёхмерные сцены, было бы глупо пройти мимо стерепар, сегодня будем рисовать примерно вот такое:




Безумие разработчиков Magic Carpet не даёт мне покоя. Для тех, кто не застал, эта игра позволяла делать 3Д рендер и в анаглиф, и в стереограммы в основных настройках, просто доступных в меню! Мозг это взрывало просто конкретно.

Итак, приступим. Для начала, благодаря чему вообще наш зрительный аппарат позволяет воспринимать глубину? Есть такое умное слово «параллакс». Если на пальцах, то давайте сфокусируем взгляд на экране. Всё, что находится в плоскости экрана, для нашего мозга существует в единичном экземпляре. А вот если вдруг муха пролетит перед экраном, то (если мы не меняем взгляда!) наш мозг её зарегистрирует в двух экземплярах. А заодно и паук на стене за экраном тоже раздваивается, причём направление раздвоения зависит от того, находится объект перед точкой фокуса или позади:


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

Давайте преставим, что наш экран — это окно в виртуальный мир :)


Наша задача — нарисовать две картинки с тем, что будет видно через это «окно». Картинок будет две, по одной на каждый глаз, на схеме выше я их показал красно-синим «бутербродом». Давайте пока не будем заморачиваться, как именно мы скормим эти картинки зрительному аппарату, нам нужно просто сохранить два файла. Конкретно меня интересует, как эти изображения можно получить при помощи нашего трассировщика лучей.

Ну, положим, направление взляда не меняется, это вектор (0,0,-1). Допустим, положение камеры мы можем сдвинуть на межглазное расстояние, что же ещё? Есть одна маленькая тонкость: конус взгляда через наше «окно» несимметричен. А наш рейтрейсер умеет рендерить только симметричный конус взгляда:


Что же делать? Читить :)
На самом деле, мы можем отрендерить картинки шире, нежели нам нужно, и просто обрезать лишнее:


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


Мы просто сделаем два пре-рендера не цветными, а чёрно-белыми, левую картинку запишем в красный канал, а правую — в синий. Получится вот такая картинка:


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

Анаглифные рендеры — один из самых древних способов просмотра (компьютерных!) стереокартинок. У них много недостатков, например, плохая цветопередача (кстати, попробуйте в зелёный канал финальной картинки записать зелёный канал правого глаза). Одна польза — такие очки легко сделать из подручных материалов.

С массовым распространением смартфонов мы вспомнили, что такое стереоскопы (которые, на секундочку, были изобретены в 19м веке)! Несколько лет назад гугл предложил использовать две копеечные линзы (к сожалению, на коленке не делаются), немного картона (валяется повсюду) и смартфон (лежит в кармане) для получения вполне сносных очков виртуальной реальности:


На алиэкспрессе их завались, сто рублей штука. По сравнению с анаглифом делать вообще ничего не надо, просто взять две картинки и составить их бок-о-бок, вот коммит.


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


А что же делать, если вообще не хочется использовать дополнительных приборов? Тогда вариант один — окосеть. Вообще говоря, предыдущей картинки вполне хватает для просмотра стерео, достаточно использовать трюк для просмотра стереограмм. Принципов просмотра стереограмм два: либо сдвигать глаза, либо раздвигать. Вот я нарисовал схему, на которой показываю, как можно смотреть на предыдущую картинку. Предыдущая картинка двойная, два красных штриха на схеме показывают два изображения на левой сетчатке, два синих — на правой.


Если мы сфокусируем взгляд на экране, то из четырёх изображений у нас получится два. Если скосим глаза к носу, то вполне возможно показать мозгу «три» картинки. И наоборот, если раздвинуть глаза, то тоже можно получить «три» картинки. Наложение центральных картинок и даст мозгу стереоэффект.

Разным людям эти приёмы даются по-разному, я, например, совсем не умею глаза сдвигать, зато с лёгкостью развожу. Важно то, что стереограмма построенная для одного способа, должна этим же способом и просматриваться, иначе получается инвертированная карта глубин (см. отрицательный и положительный параллакс). Проблема такого способа просмотра стерео в том, что очень сложно сильно сдвинуть глаза относительно нормального состояния, поэтому приходится довольствоваться маленькими картинками. А что делать, если хочется больших? Давайте полностью пожертвуем цветом, и захотим получить только восприятие глубины. Забегая вперёд, вот картинка, которую мы получим в конце этой части:


Эта стереогрмма создана для «разведения» глаз (wall-eyed stereogram). Тем, кто предпочитает обратный способ просматривания, картинку брать тут. Если вы не привыкли к стереограммам, попробуйте разные условия: картинка на полный экран, маленькая картинка, яркий свет, темнота. Задача развести глаза так, чтобы две соседние вретикальные полоски совпали. Проще всего фокусироваться на левой верхней части картинки, т.к. она плоская. Мне, например, мешает окружение хабра, я открываю картинку на полный экран. Не забудьте с неё убрать мышку!

Не довольствуйтесь неполноценным 3D-эффектом. Если вы только смутно осознаёте округлые формы посреди случайных точек наряду с некоторыми слабыми 3D-эффектами, это, конечно, неполная иллюзия! Если смотреть правильно, шарики должны явно выйти из плоскости экрана на зрителя, эффект должен быть стабильным и сохраняться благодаря постоянному и детальному изучению каждой части изображения, как переднего плана, так и фона. У стереопсиса есть гистерезис: как только удаётся получить стабильное изображение, оно становится тем яснее, чем дольше вы смотрите. Чем дальше экран от глаз, тем больше эффект глубины.

Эта стереограмма нарисована по методу, предложенному четверть века назад Thimbleby и др. в их статье «Displaying 3D Images: Algorithms for Single Image Random Dot Stereograms».

Отправная точка

Отправной точкой для отрисовки стереограмм является карта глубины (мы же забыли про цвет). Вот коммит, который рендерит вот такую картинку:


Глубины в нашем рендере обрезаны ближней и дальней плоскостями, то есть, самая дальняя точка в моей карте имеет глубину 0, самая ближняя 1.

Основной принцип

Пусть у нас глаза находятся на расстоянии d от экрана. Поместим (воображаемую) дальнюю плоскость (z=0) на том же расстоянии позади экрана. Выберем постоянную μ, которая определит положение ближней плоскости (z=0): она будет на расстоянии μd от дальней. Я в своём коде выбрал μ=1/3. Итого, весь наш мир живёт на расстоянии от d-μd до d за экраном. Пусть у нас определено расстояние e между глазами (в пикселях, в моём коде я выбрал 400 пикселей).


Если мы смотрим на точку нашего объекта, отмеченную на схеме красным, то два пикселя, отмеченных зелёным, должны иметь одинаковый цвет в стереограмме. Как найти расстояние между этими пикселями? Очень просто. Если текущая проецируемая точка имеет глубину z, то отношение параллакса к расстоянию между глазами равно отношениям соответствующих глубин: p/e = (d-dμz)/(2d-dμz). Кстати, обратите внимание, что d сокращается и более нигде не участвует! То есть, p/e = (1-μz)/(2-μz), а это означает, что параллакс равняется p=e*(1-μz)/(2-μz) пикселей.

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

Подготавливаем исходную картинку

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


Обратите внимание, что в целом цвета просто случайные, за исключением того, что я в красном канале положил rand()*sin, чтобы обеспечить периодические волны. Эти волны сделаны с расстоянием в 200 пикселей, это (при выбранных μ=1/3 и e=400) максимальное значение параллакса в нашем мире, оно же дальняя плоскость. Эти волны необязательны, но они облегчат нужную фокусировку зрения.

Рендерим стереограмму

Собственно, полный код, относящийся к стереограмме, выглядит вот так:


Если что, то коммит брать тут. Функция int parallax(const float z) даёт расстояние между пикселями одинакового цвета для текущего значения глубины. Мы рендерим стереограмму построчно, так как строчки независимы между собой (у нас нет вертикального параллакса). Поэтому основной цикл просто пробегает все строчки; для каждой из них мы начинаем с полного неограниченного набора пикселей, на который затем будем накладывать попарные ограничения равенства, и в итоге у нас окажется некое количество кластеров (несвязных) пикселей одного цвета. Например, пиксель с индеком left и пиксель с индексом right должны в итоге оказаться одинаковыми.

Как хранить этот набор ограничений? Самый простой ответ — union–find data structure. Её я описывать не буду, это и так только три строчки кода, можно прочитать в википедии. Основная мысль в том, что для каждого кластера у нас окажется некий «ответственный» за него, он же коренной, пиксель, его мы оставим того цвета, какого он был в исходной картинке, а все остальные пиксели кластера перекрасим:

Ну, собственно, и всё. Двадцать строчек кода — и наша стереограмма готова, ломайте глаза и головы, рисуйте картинки! Кстати, просто случайные цвета в стереограмме — это вообще роскошь, в принципе, если постараться, то можно сделать и частичную передачу цвета нашей картинки.

Другие системы просмотра стерео, например, связанные с поляризацией, я вынес за рамки обсуждения, так как они выходят из бюджета ста рублей. Если что упустил, дополняйте и поправляйте!

Почти все видели стерео картинки, я, например, помню в школе у нас были тетрадки, на обложке которых были напечатаны непонятные каракули. Но если посмотреть на них «правильно» - эти каракули обретали объем. Не у всех получалось увидеть их сразу, кому это было просто, а кто так и не смог. Есть несколько рекомендаций как достигнуть иллюзию объема: смотреть «сквозь» картинку или приложить ее вплотную к носу и медленно отводить.

Как человек воспринимает объем? Чем ближе расположен рассматриваемый объект, тем больше наблюдатель «сводит» глаза. Т.о. если рассматриваемый объект расположен на бесконечно удаленном расстоянии, то глаза будут смотреть на него «параллельно».

Теперь рассмотрим как достигнуть иллюзию объема на плоской картинке. Итак, у нас имеется человек с двумя глазами (рис.1): левый глаз O1 и правый O2,а так же плоскость проекции стерео изображения D1D2. Пусть рассматриваемый объект B расположен на расстоянии h от наблюдателя. Тогда для того чтоб «увидеть» его на картинке необходимо совпадение рисунка в точках B1 и B2. Получается мы держим перед собой плоский рисунок и смотрим как бы «сквозь» него. Левый глаз видит точку B1, правый B2, изображения для них на листе совпадают и создается иллюзия того, что на самом деле мы видим объект B, расположенный за плоскостью листа. Т.о. чем больше расстояние между точками B1 и B2,в которых совпадает изображение, тем «дальше» воспринимается объект B.

Теперь выведем пару расчетных формул, которые пригодятся для просчета стерео изображения. Пусть a – расстояние между глазами, H – расстояние до максимально удаленного объекта, h – расстояние до объекта h_max – расстояние от максимально удаленного объекта до плоскости проекции стерео изображения. Из подобия треугольников BB1B2 и BO1O2 следует B1B2/BE= O1O2/BF. B1B2=d , O1O2=a, BF=h, BE=BF-EF, EF=AF-AE=H-h_max, BE=h-(H-h_max). Итого d/(h-H+h_max))=a/h.

Пожалуй теории пока достаточно, можно перейти к практике. Для этого понадобится Photoshop и 3dsMAX. В Photoshop’е создадим текстуру, из которой в последствии будет построено стерео изображение. Несколько рекомендаций: чем больше на текстуре деталей, тем лучше получиться окончательный вариант (с однотонными вообще ничего не получиться); высота текстуры должна совпадать с высотой изображения (поэтому сразу надо определить размер финального стерео изображения); а ширина зависит от того, где вы собираетесь в дальнейшем использовать полученную картинку. На рис.1 величина d_max как раз соответствует ширине текстуры, поэтому в реальности (на экране монитора или после распечатки) она не должна превышать расстояния между глазами a. В тоже время чем больше пикселей по ширине будет в исходной текстуре, тем более качественным получиться окончательный результат. У меня получилась вот такая текстура:

Ширина ее 100 пикселей, а высота 600 (в итоге рассчитываю получить стерео изображение размером 800 на 600 пикселей). Хотя лучше сделать ее так, чтоб она тайлилась по горизонтали. Далее создаем или открывает любой 3D-объект в MAX’е. Я для этого использовал модель осы:

Для результата не пригодятся ни материалы, ни сторонние рендеры, ни источники света. Поэтому если все это имеется в сцене, то назначаем на все стандартный материал, удаляем все источники света и используем Default Scanline Renderer. Теперь можно приступить к написанию скрипта. Для этого в меню Max’а выбираем MAXScript->New Script и откроется окно редактирование скриптов. Наш скрипт будет иметь свой собственный интерфейс. Это можно реализовать двумя способами: на панели Utilites или в отдельном окне. Выберем первый вариант и создадим новую скрипт-утилиту:

utility stereoImg "Stereo Image"

-- утилита создания стерео изображения

Сохраним ее с названием stereoImg.ms и отправим ее на просчет. Для этого надо в меню редактора скриптов выбрать Tools->Evaluate All или нажать комбинацию клавиш Ctrl+E. После этого наша утилита приобрела свой интерфейс (рис.4) и единственное что можно с ней сделать – это открыть и закрыть.

Разберем что же мы сделали: utility – зарезервированное слово с помощью которого создаются новые скрипт-утилиты, stereoImg – имя переменной, с помощью которой можно осуществлять контроль над утилитой, “Stereo Image” – символьная строка, именно она отображается в списке утилит (рис.4-3), далее в круглых скобках идет тело утилиты. Более подробную информацию по созданию скрипт-утилит и MAXScript’у можно найти в файле помощи MAX’а (в основном меню Help->MAXScript Reference). Для добавления комментариев используется «--», после него компилятор игнорирует все символы до конца строки . Пора наполнить нашу утилиту кнопками и другими элементами пользовательского интерфейса. Будем ориентироваться на следующий вариант:

Итак, список необходимых элементов: две группы Texture и Render. В группе Texture имеется метка, в которой будет отображаться информация о текстуре, и кнопка, запускающая диалог открытия файла с текстурой. В группе Render – спиннер (определяет ширину рендера), метка (информация о высоте рендера), спиннер (качество стерео изображения), индикатор процесса, кнопка выбора объекта и «самая главная» кнопка запускающая скрипт на просчет. Для этого в тело утилиты надо добавить следующие строки:

fn fltr_cam obj = superClassOf obj == camera -- функция возвращает истину если obj камера (для фильтра выбора)

label l_T_img "no texture" -- информация о размере

button b_T_img "Load texture bitmap" -- загрузка текстуры

group "Render:"

label l_R_h "height:0" -- высота

progressBar prb_R_status value:0 -- прогресс рендера

pickbutton pb_R_cam "Pick camera" filter:fltr_cam across:2 -- выбор камеры

button b_R_stereo "<GO>" -- запуск рендера

В самом начале тела утилиты (перед описанием пользовательских элементов) определим локальные переменные, необходимые для создания стерео изображения:

-- определение локальных переменных

local T_img = undefined -- текстура

local width, height, d_max -- ширина и высота рендера, ширина текстуры

Осталось прописать обработчики событий от элементов пользовательского интерфейса. Описание всех событий должно быть следующим образом: on<имя элемента> <название события> <список аргументов>do(<обработка события>). Для начала опишем поведение MAX’а на нажатие кнопки загрузки текстуры. Что должно происходить: открыться окно диалога выбора файла, после выбора файла текстуры она загружается в MAX, выводиться на форму информация о размере текстуры и ее название, далее инициируются локальные переменные и настраиваются глобальные параметры рендера.

on b_T_img pressed do

T_file_name = getOpenFileName types:"bitmap(*.bmp)|*.bmp" -- диалог открытия файла

if T_file_name != undefined then -- если все файл бы выбран

T_img = openBitMap (T_file_name) -- загрузка картинки

b_T_img.caption = filenameFromPath T_file_name -- на кнопку имя файла картинки

l_T_img.caption = "width: " + (T_img.width as String) + " height:" + (T_img.height as String) -- вывести информацию о картинке

d_max = T_img.width -- обновление всех локальных переменных

height = T_img.height

width = 4*height/3 as Integer -- определение ширины рендера так чтоб в итоге получились пропорции 3:4

s_R_w.value = width -- отображение информации о разрешении рендера

l_R_h.caption = "height:" + height as String

renderWidth = width -- настройка глобальных параметров рендера (ширина, высота)

renderHeight = height

Определим вид, который мы желаем получит на стерео изображении. Для этого нам понадобиться камера. Если в сцене уже имеются камеры с «нужным» видом – отлично, можно использовать их. Если нет, то необходимо создать камеру. Проще всего перейти к виду Perspective, где выбрать необходимый ракурс. После чего создать камеру из вида: в главном меню Create->Cameras->CreateCameraFromView или Crtl+C. Вспомним теорию, там были такие параметры как H – расстояние до максимально удаленного объекта и h_max – расстояние от плоскости проецирования до максимально удаленного объекта. Чтоб не вводить их вручную, будем брать их из свойства камеры, а именно из Clipping Planes. Выберем необходимую камеру, на панели Modify раскроем свиток Parameters, ставим галочку возле Clip Manually. Осталось только настроить Near Clip и Far Clip. Плоскость Near Clip соответствует плоскости проекции стерео изображения, а Far Clip – расстояние до максимально удаленного объекта. Рекомендации: объекты, по которым будет строиться стерео изображение, должна располагаться между Far Clip и Near Clip, Near Clip равно приблизительно половине Far Clip, объекты должны быть расположены подальше от Near Clip и вплотную к Far Clip. Хотя можно этим пренебречь и в дальнейшем экспериментировать с Clipping Planes, для получения более желаемого результата. Т.о. вид настроен, осталось «объяснить» скрипту, что мы будем работать с этой камерой, для этого напишем обработчик нажатия кнопки выбора камеры:

on pb_R_cam picked cam do

pb_R_cam.caption = pb_R_cam.object.name -- на кнопку имя камеры

После этого ссылка на камеру содержится в pb_R_cam.object.Так же необходимо скрипту отреагировать на изменение пользователем ширины рендера:

on s_R_w changed val do

-- обработка изменения ширины рендера

width = s_R_w.value

renderWidth = width

Осталось обработать последнее событие – нажатие «самой главной» кнопки. Опять придется заняться теорией на основе полученной ранее формулы: d/(h-H+h_max))=a/h. Здесь a, H и h_max – констаны. Последние две получаються из Clipping Planes камеры. Определим a, для этого подставим вместо h величину H – крайний случай, когда объект находиться на максимальном расстоянии. Отсюда a=d_max*H/h_max. И последняя формула: d=a*(h-H+h_max)/h – по ней вычисляется расстояние между точками d, изображения в которых совпадают, для того чтоб создавалась иллюзия, что рассматриваемый объект расположен на расстоянии h от наблюдателя.

on b_R_stereo pressed do

-- просчет стерео изображения

-- создание битмапы для будущего стерео изображения

OUT_img = bitmap (width+d_max) height color:black

-- заполнение первой полосы текстурой

for x = 0 to (d_max-1)do

for y = 0 to (height-1) do

c =(getPixels T_img [x,y] 1)[1] -- берем пиксель из текстуры

prb_R_status.value =(100 * x / d_max)as integer -- обновление прогресса текущей операции

prb_R_status.value = 0

-- отрисовка стерео изображения

H = pb_R_cam.object.farclip -- расстояние от глаз до максимальной глубины

h_max = pb_R_cam.object.farclip - pb_R_cam.object.nearclip -- расстояние от плоскости проецирования до макс. глубины

a = d_max*H/h_max -- расстояние между глазами

-- построчное построение стерео изображения

for y = 0 to (height - 1)do

for x = 0 to (width - 1) do

-- берем из рендера глубины расстояние от камеры до ближайшей точки

if dist > H then dist = H -- не должно быть больше макс. глубины

d =(a*(dist+h_max-H)/(dist)+.5)as integer -- вычисляем расстояние на котором должны совпадать пиксели стерео изображения

setPixels OUT_img [x+d_max,y](getPixels OUT_img [x+d_max-d,y] 1) -- и дубируем пиксели согласно этому расстоянию

prb_R_status.value =(100 * y / height) as integer

prb_R_status.value = 0

display OUT_img -- открываем окно с финальным стерео изображением

Потом идет построчное сканирование канала глубины (с проверкой на то, чтоб расстояние не превысило Far Clip камеры). На основе этой величины h (в скрипте dist) и полученных ранее формул вычисляется расстояние между повторяющимися пикселами. Таким образом идет построение стерео изображения, попутно обновляется прогресс вычислений. И в конце концов на экран выводиться окончательный результат (рис.7).

Ниже приведен полный листинг скрипт-утилиты с некоторыми улучшениями:

utility stereoImg "Stereo Image"

-- утилита создания стерео изображения

-- определение локальных переменных

local T_img = undefined -- текстура

local width, height, d_max -- ширина и высота рендера, ширина текстуры

fn fltr_cam obj = superClassOf obj == camera -- функция возвращает истину если obj камера (для фильтра выбора)

label l_T_img "no texture" -- информация о размере

button b_T_img "Load texture bitmap" -- загрузка текстуры

group "Render:"

label l_R_h "height:0" -- высота

progressBar prb_R_status value:0 -- прогресс рендера

pickbutton pb_R_cam "Pick camera" filter:fltr_cam across:2 -- выбор камеры

button b_R_stereo "<GO>" -- запуск рендера

on b_T_img pressed do

T_file_name = getOpenFileName types:"bitmap(*.bmp)|*.bmp" -- диалог открытия файла

if T_file_name != undefined then -- если все файл бы выбран

T_img = openBitMap (T_file_name) -- загрузка картинки

b_T_img.caption = filenameFromPath T_file_name -- на кнопку имя файла картинки

l_T_img.caption = "width: " + (T_img.width as String) + " height:" + (T_img.height as String) -- вывести информацию о картинке

d_max = T_img.width -- обновление всех локальных переменных

height = T_img.height

width = 4*height/3 as Integer -- определение ширины рендера так чтоб в итоге получились пропорции 3:4

s_R_w.value = width -- отображение информации о разрешении рендера

l_R_h.caption = "height:" + height as String

renderWidth = width -- настройка глобальных параметров рендера (ширина, высота)

renderHeight = height

on pb_R_cam picked cam do

pb_R_cam.caption = pb_R_cam.object.name -- на кнопку имя камеры

on s_R_w changed val do

-- обработка изменения ширины рендера

width = s_R_w.value

renderWidth = width

on b_R_stereo pressed do

-- просчет стерео изображения

if (height == undefined) or (width == 0) then

messageBox "No texture or invalid size"

return 0

if pb_R_cam.object == undefined then

messageBox "Pick camera first"

return 0

-- создание битмапы для будущего "расширенного" стерео изображения

-- причем ширина умножается на точность

prec = s_R_prec.value -- точность (коэф. качества)

OUT_img = bitmap ((width+d_max)*prec) height color:black

-- заполнение первой полосы текстурой

for x = 0 to (d_max-1)do

for y = 0 to (height-1) do

for i = 0 to (prec-1) do

c1 =(getPixels T_img [x,y] 1)[1] -- берем пиксель из текстуры

c2 = (getPixels T_img [x+1,y] 1)[1]

if c2 == undefined then c2 = (getPixels T_img [0,y] 1)[1]

c = c1*(1.*(prec-i)/prec)+ c2*(1.*i/prec) -- линейно сглаживаем растяжение

prb_R_status.value =(100 * x / d_max)as integer -- обновление прогресса текущей операции

prb_R_status.value = 0

-- отрисовка "расширенного" стерео изображения

H = pb_R_cam.object.farclip -- расстояние от глаз до максимальной глубины

h_max = pb_R_cam.object.farclip - pb_R_cam.object.nearclip -- расстояние от плоскости проецирования до макс. глубины

a = d_max*H/h_max -- расстояние между глазами

-- построчное построение стерео изображения ("расширенное")

for y = 0 to (height - 1) do

for x = 0 to (width - 1) do

for dx = 0 to (prec - 1) do

-- берем из рендера глубины расстояние от камеры до ближайшей точки (тут тоже идет линейное сглаживание)

if dist > H then dist = H -- не должно быть больше макс. глубины

d =(prec*a*(dist+h_max-H)/(dist)+.5)as integer -- вычисляем расстояние на котором должны совпадать пиксели стерео изображения

setPixels OUT_img [x*prec+dx+d_max*prec,y](getPixels OUT_img [x*prec+dx+d,y] 1) -- и дубируем пиксели согласно этому расстоянию

prb_R_status.value =(100 * y / height) as integer

prb_R_status.value = 0

-- получение из "расширенного" "нормальное" стерео изображение

FIN_img = bitmap (width+d_max) height color:black -- создание битмапы для финального стерео изображения

for y = 0 to (height - 1) do

for x = 0 to (width + d_max - 1) do

c = black

for i = 0 to (prec-1) do

c +=(getPixels OUT_img [x*prec+i,y] 1)[1]/prec -- получение сренего арифметического цвета

prb_R_status.value =(100 * y / height) as integer

prb_R_status.value = 0

display FIN_img -- открываем окно с финальным стерео изображением

Изменение здесь только в алгоритме просчета стерео изображения. Добавилась проверка «от дурака»: просчет не начнется, если не была выбрана текстура и камера. Так же тут был реализован алгоритм «улучшенного» расчета стерео изображения с использованием спиннера «качество». В двух словах в чем это заключается: изображение сначала линейно растягивается и просчет ведется тоже «растянуто», а потом полученный результат сжимается до первоначального размера. Разницу можно увидеть на рис.7, рис.8, рис.9.

На рис.7 качество выставлено в единицу, а на рис.8 и рис.9 – 4 и 8 соответственно. Конечно чем выше качество, тем больше время просчета.

Вот и все. Теперь у нас имеется скрипт-утилита, с помощью которой можно из любого 3D-объекта получить стерео изображение. Очень надеюсь что урок был понятен (для этого надо дружить с геометрией :) и полезен (по крайней мере тем, что можно действительно посмотреть свои модели «в объеме»).

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

Рассмотрим самые популярные сервисы для этого.

Make your own Stereogram

1. PATTERN (Текстура для стереограммы)

PATTERN

  • Use random dots background – формирование текстуры из случайных точек;
  • Use a pattern background – выбор текстуры из галереи сервиса;
  • Upload your own pattern – загрузка текстуры со своего компьютера.

Сохраните выбор текстуры щелчком по кнопке « Apply Chandes ».

2. MASK (Маска для стереограммы)

Mask

Выберете маску – черно белую картинку, которая формирует скрытый объем в стереограмме.

  • Mask-based stereogram – из галереи сервиса. В вашем распоряжении более 300 масок;
  • Text-based Stereogram – впишите свой текст. Получится стереограмма со скрытым посланием;
  • Upload your own mask – загрузите свою маску, щелкнув по этой кнопке.

После выбора маски, нажмите на кнопку « Apply Changes ».

3. STEREOGRAM (получение готовой стереограммы)

STEREOGRAM

Кликните по миниатюре стереограммы. После ее загрузки и просмотра сохраните на свой компьютер. Если вы что то захотите поменять в своей картинке, например выбрать другую текстуру, вернитесь назад, щелкнув по кнопке back в верхней правой части страницы.

Вот, что получилось у меня (кликните по картинке для увеличения):


3D-Stereogram

В панели инструментов конструктора в нашем распоряжении:

1. Размер кисти, которой вы будете рисовать по белому фону.

2. Жесткая и две разной степени мягкости кисти. К примеру, облака лучше рисовать мягкой кистью.

3. Яркость кисти. Помните, чем ярче точка на маске, тем ближе она к вам будет на стереограмме.

5. Выберете цвет текстуры вашей будущей стереокартинки а также ее яркость.

6. Кнопка Done . Нажмите, чтобы генерировать стереограмму.

Вот, что получилось из моего детского рисунка (кликните по картинке для увеличения):

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

Стереокартинки 3D: Как бесплатно создать онлайн без специальных программ и навыков

Что такое стереокартинки

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

Зачем смотреть стереокартинки

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

Применять же стереокартинки можно в любой области, до которой дотягивается фантазия — квесты, головоломки, реклама, тренировка глаз и т.д.

Где найти стереокартинки

Где найти стереокартинки

На многих web-сайтах есть целые разделы с большим количеством стереокартинок, однако проще всего написать в поиске Google запрос «стереокартинки» (или сразу нажмите здесь) и перейти в категорию «Картинки» — здесь их очень много на любой вкус и цвет.

Как создать свою стереокартинку онлайн

На самом деле, собственное стереоизображение можно изготовить за пару минут, не обладая специальными знаниями и программным обеспечением, понадобится лишь браузер с доступом в интернет. Ниже рассмотрим простые алгоритмы создания стереокартинок на двух популярных бесплатных сервисах.

Будет ли «работать» стереокартинка, если ее распечатать из интернета (файла) на бумагу?

EasyStereogramBuilder

Данный сервис радует большим количеством готовых масок и фонов, а также возможностью загружать собственные.

2. Выбираем один из 176 доступных на момент написания материала фонов (или загружаем свой по ссылке «Upload your own») и нажимаем «Apply Pattern»;

Стереокартинки 3D: Как бесплатно создать онлайн без специальных программ и навыков

3. Выбираем одну из 210 масок (или загружаем собственную) и нажимаем «Apple Mask»;

Стереокартинки 3D: Как бесплатно создать онлайн без специальных программ и навыков

4. Жмем квадрат с надписью «Click to generate Stereogram»;

Стереокартинки 3D: Как бесплатно создать онлайн без специальных программ и навыков

5. Нажимаем кнопку «Save stereogram to PC» и стереокартинка сохраняется на компьютер.

Стереокартинки 3D: Как бесплатно создать онлайн без специальных программ и навыков

Stereogram

Очень простой редактор, который позволяет создать простенькую стереокартинку, нарисованную своими руками (требуется Java).

Читайте также: