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