Меню

Как правильно сделать анаглиф чтобы выходил с экрана

Создание трехмерных (анаглифических) изображений

О себе. Я живу в одном из красивейших городов России городе Стерлитамаке республики Башкортостан, мне 28 лет, профессия моя не как не связана с компьютерной графикой, это мое хобби. Графикой занялся почти сразу как появился компьютер, начал с CorelDRAW, затем, нужно признаться, не без большого труда освоил 3ds max, а вот Photoshop как-то не дается, я понимаю что он совсем не сложный, ну как-то не лежит у меня к нему душа.

Прошу вас не относится к уроку слишком серьезно, возможно он вам покажется не очень последовательным, дело в том что я писал его с большими перерывами, при этом терялась мысль, возможно я что-то пропустил, ктому-же во время написания я сам делал какие-то открытия. У меня просто появилась хорошая идея, в рунете по ней я ничего не нашел и я решил донести до широкой общественности, решать что получилось вам. Мой e-mail min-almaz@Mail.ru

Создание трехмерных изображений

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

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

Хотя изображение плоское, мозг пытается совместить разные картинки отсюда появляется иллюзия объема. Обратите внимание что красный цвет является как бы главным.

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

Через голубой светофильтр, для спектра от зеленого до синего не происходит цветового искажения, но эти цвета, к несчастью, через красный светофильтр видны как черный. В этом смысле интерес могут представлять спектр от оранжевого до желтого (через красный не видны, через голубой «кажутся» оттенками зеленого) и от пурпурного до малиново(«кажутся» оттенками синего). Эта информация может понадобится для тех кто захочет что-нибудь сделать в 2D-редакторе. А так не нужно заморачиватся, после обработки фотографий и отрендеренных цветных изображений, весе пройдет автоматически(см. окончание).

Займемся глазами, в виде Font создаем камеру Target с стандартными параметрами назовем ее «Camera RED» ее цель располагаем в нулевых координатах.

Выделяем камеру инструментом Select and Move и нажав на кнопку Shift и переместив камеру создаем ее клон типа Instance(образец), это позволит легче управлять камерами, назовем новую камеру «Camera BLUE».

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

Если подойти к измерению точно, то можно сказать что расстояние между моими «зрачками» 67,5 мм, но это не так уж важно, учтите что это расстояние немного меняется в зависимости от того куда сфокусирован взгляд(где находится цель), я смотрю в объектив фотоаппарата, который находится в 70-90 см.

но лучше собрать вот такую систему

Здесь для обоих камер назначен контроллер позиции Path Constraint, а путём выбрана сплайновая окружность, созданные по умолчанию ключи анимации удалены.

Радиус окружности сплайна «равен» расстоянию от камеры до цели по оси Х. Цели, камера «Camera RED» и сплайн сгруппированы. Для изменения угла камер можно просто масштабировать, эту систему в виде Font(или Left) относительно оси Y, а чтоб удалить или приблизить камеры к центру нужно масштабировать в виде Top относительно всех осей или только X и Y, следите чтоб окружность не деформировалась.

«Camera BLUE».свободно двигается по сплайну, единственный недостаток стало труднее контролировать расстояние между камерами(Побольшому счету это расстояние не такуж важно, наблюдатель может быть дальше или ближе, следите только за тем чтоб не казалось что вы смотрите на комнату из-под потолка или эта комната кажется кукольным домиком и тп.).

С камерами закончили, займемся получением изображений.

Сначала, зададим материал цилиндру, для большей наглядности, пусть он будет с картой Checker

Ну вот все готова к рендеренгу, дальнейшие наши действия, получить изображения, обработать и соединить их в Фотошопе. Часть обработки можно произвести в 3d max, это может облегчить работу если вы делаете анимацию. В уже открытом нами окне Environment and Effects переходим на вкладку Effects, там жмем на Add. и выбираем эффект Color Balance. Вот настройки для красной и голубой камеры

Читайте также:  Как правильно сделать ленинградку в частном доме видео

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

остаются темные участки, повторяющие контуры объектов. Решать вам, для анимации может сгодится.

И так визуализируем, рендер может быть любым, названия для файлов должно быть с обозначением цвета, чтоб легче было ориентироваться, формат файла лучше без потерь качества, BMP, TIF, PNG, последний самый хороший, мало весит и в его альфа-канале 3d max сохраняет маску прозрачности(фона).

Переходим к соединению двух картинок, я пользуюсь русской версией Adobe Photoshop CS2, хотя подойдет любая (с 5 версии точно). Результат вы можете увидеть выше.

Объяснения я продолжу на более сложном примере примитивного интерьера.

Вот схема наших последующих действий:

Открываем результаты трудов в фотошопе, Задаем основной цвет для рисования на панели инструментов:

Затем, «берем» красную картинку и перекидываем ее на голубую, располагаем ее там так чтоб она полностью перекрывала слой голубого изображения, при этом, создается новый слой, его прозрачность(Непрозр.) устанавливаем на уровне 40-60%.

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

Более быстрым способом, может быть способ замены красного канала. Так же открываем изображения в Photoshop. Начнем с картинки красной камеры, на панели каналов выделяем красный канал.

И напоследок. Думаю, вы уже поняли что трехмерные картинки можно делать и из обычных фотографий, для этого используются стерео камеры, в место нее можно пользоваться обычным цифровым фотоаппаратом, нужны расчеты и штатив, хотя и необязательны 🙂, главное выбрать общую Цель для обеих фотографий, стремится чтоб обе точки съемки были на одном уровне, а потом правильно совместить фотографии.

Источник

О создании бюджетных стереоизображений на пальцах (стереограмма, анаглиф, стереоскоп)

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

2 8t3n oonieil v4f lntjpvzk

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

Параллакс

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

a40e9bb9d4a6e0cddcdce4bdfcc5095d

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

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

c9a645594d957d52f5d4c3e067bd3cb7

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

Читайте также:  Как сделать телепорт в деревню в майнкрафт

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

e005c1b996cc7eb9978bc434f6773196

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

cb8f493d14679c297d6510a1a79ef1a3

Анаглиф

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

cd47fb815c7a1e80e2d908049e8e4bf0

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

9d78f64f371b5960b1d19f5deaff0d9e

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

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

Стереоскоп

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

3285d898a99110b217a0fbdbc8ddb535

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

82e563cfe69db42b7f5f2f399261d12d

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

9e25839f5ea28b1f4e092106f60bebfe

Стереограммы

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

86e14a47b4e2ae8aa9246becb7155827

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

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

f7be7bab228dcd5133b2d1ff3a9032e1

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

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

Читайте также:  Как сделать автоматические ворота для замка в майнкрафте

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

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

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

53c20175f5fa2667a7dd7592fee343c4

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

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

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

5c60ebe872837aea90879fa0798ac7e7

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

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

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

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

197441685bf85d56e5416e0af899ace1

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

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

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

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

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

Заключение

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

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

Источник

Adblock
detector