Алгоритм
построения стерео-картинок достаточно прост, несмотря на то, что мне пришлось
потратить чуть меньше недели на его понятие. Просто мне до этого никто
не рассказывал его, а перед моим лицом была только готовая картинка из
книжки. Ну да ладно - не буду оправдываться, а лучше избавлю вас от страданий
:-). Начнём... Для начала вам нужно научиться их смотреть. Краткий совет
о том, как надо это делать вы найдёте здесь.
Теперь преступим к самому главному. Как вы наверное знаете, человек, имеющий
два глаза, может оценить расстояние до предмета и среди нескольких вещей
выделить более приближённые и более отдалённые. Так вот, это связано со
свойством человеческих глаз, а точнее, восприятием мозга положения глаз.
Другими словами, если из каждого глаза "провести два луча", которыми посмотреть
на предмет, то в точке, на которую смотрят глаза, эти "лучи" пересекутся.
Мозг сопоставляя углы поворота этих "лучей", делает соответствующие выводы
о расстоянии до предмета. А если попробовать обмануть глаза (мозг)? Именно
это и происходит, когда смотришь такую картинку. Ведь есть и ещё одно
свойство глаз. А как глаза находят точку, в которой надо "пересечь лучи"?
Очень просто - в каждом глазу формируется своя картинка. Обе они похожи
друг на друга, но отличия есть - один глаз может видеть какой-то фрагмент,
а другому в этот момент может мешать какое-нибудь препятствие. Мозг максимально
похожие фрагменты этого рисунка и пытается совместить в один, но для этого
в каждой точке ему приходится менять углы "лучей", иначе эти фрагменты
не совпадут. На стерео-картинке такими фрагментами являются пиксели, а
точнее их цвета. Давайте взглянем на картинку, которую я специально нарисовал
по этому случаю.
Теперь посмотрим, как строит картинки моя программа. Для простоты обозначим "исходный объём" за ИО, а Background за БГ (что это такое читайте здесь). Прежде всего надо создать поле для рисования (сдвига точек для образования стерео). Роль такого поля будет выполнять рисунок, получившийся в результате размножения БГ. Таким образом мы получим уже стерео-картинку, но только с задним (самым удалённым) фоном. Сразу скажу, что ширину БГ я буду называть периодом. Начнём... Сдвигать (почему сдвигать - вы позже поймёте) можно с любой стороны, а можно от центра (советую вам именно так и делать), но для простоты объяснения будем это делать слева на право. На счёт ограничений - ИО должен быть в формате BMP 256 цветов, причём с чёрно-белой палитрой (её очень хорошо ставит PHOTOSHOP), БГ также должен быть в формате BMP и иметь 256 цветов, но уже с произвольной палитрой. Обработаем одну точку ИО. Не зря БГ должен иметь ч-б палитру, т.к. это нужно для алгоритма построения - чем светлее точка, тем её номер должен быть больше. Так вот читаем точку из ИО. Запоминаем её номер (для простоты назовём его буквой Н). Затем обращаемся к строке рисунка размноженного БГ. Начинаем сдвиг: первую точку, соответствующую положению той же точки в ИО, не трогаем, а точку, взятую через период, сдвигаем влево на Н точек. Затем сдвигаем точку, взятую через два периода на Н точек, через три и т.д. до конца строки. Т.о. мы получаем строку точек, расставленных на одном расстоянии друг от друга, но только две точки расположены ближе друг к другу, нежели остальные. Собственно всё... Проделываем эту операцию со следующими точками, тем самым получаем стерео-строку. Проделываем тоже самое с точками в следующей строке и так далее. Получаем стерео-картинку!!! Правда есть пара ньюансов, без которых у вас получится не "рулезная" картинка. Это мои ноухау... Дерзайте! |