О способах увидеть на экране монитора объемные изображения
ZXNet echo conference «zx.spectrum»
From Andrew Savichev → To All 21 February 1998
Hi, All!
Вот мы как то касались проблем объемного восприятия, но тогда речь шла о
стерео-видео. Но люди в другой эхе интересуются и псевдо-стерео.
Т.к. я знаю, что эту мессагу прочтут и люди из ZX-NET, то настоятельно
рекомендую теребить их своих нодов подписаться на эху SU.GRAPHICS, отрывок
из FAQ которой, посвященный SUBJ, я здесь привожу.
-----------
SU.GRAPHICS Frequently Asked Questions
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Выпуск 1.
Date: 18 feb 1998.
[skip]
Если вы хотите дополнить FAQ или что-либо пpедложить - пишите:
Alexey A. Monastyrenko,
2:5030/168.26@fidonet
2:5030/303.8@fidonet
2:5030/304.8@fidonet
mon...@magnit.spb.ru
FAQ будет выкладываться на http://members.tripod.com/~almonster
и поститься в эху SU.GRAPHICS.
^^^^^^^^^^^
0. Предисловие.┼
²²²²²²²²²²²²²²²▄
Во-первых, немного о терминологии, которой я здесь буду пользоваться.
Как правило, речь будет идти о растровых изображениях - либо RGB,
либо с палитрой, либо черно-белых - greyscale.
Для RGB изображений:
R[x,y], G[x,y], B[x,y] - три компоненты (красная, зеленая, синяя) цвета
пиксела с координатами (x,y).
╙ ▐
┐ R[x,y] ┐
C[x,y] = ┐ G[x,y] ┐
┐ B[x,y] ┐
░ ╘
Для изображений с палитрой:
C[x,y] - индекс в палитре цвета пиксела с координатами (x,y).
Для черно-белых:
C[x,y]=I[x,y] - яркость пиксела с координатами (x,y).
Если квадратные скобки с координатами не указаны, речь идет о текущей точке.
[skip]
6.1. Красно-синие очки.┼
²²²²²²²²²²²²²²²²²²²²²²²▄
Строятся черно-белые изображения сцены с двух точек зрения -
из левого глаза и из правого глаза.
Далее для каждой точки экрана берется цвет
R[x,y]=Left[x,y] {картинка для левого глаза}
G[x,y]=0
B[x,y]=Right[x,y] {картинка для правого глаза}
При работе в 256-цветном видеорежиме на каждую компоненту получается
16 градаций. Этого вполне достаточно для построения более-менее
реалистичного изображения.
На пользователя надеваются специальные очки: синий светофильтр на
левый глаз и красный светофильтр на правый.
Недостаток метода - изображение черно-белое (точнее, черно-фиолетовое).
6.2. Поляроидные очки.┼
²²²²²²²²²²²²²²²²²²²²²²▄
Этот метод дает полноценное цветное трехмерное изображение.
К сожалению, для его реализации нужны 2 проектора и, как следствие,
его сложно сделать динамически меняющимся (если, конечно, у вас нет
лишней пары киноаппаратов :-) ).
В общем, рассчитываются изображения для двух глаз, после чего
каждое из них переводится на слайд. Два слайда проектируются
двумя проекторами на общий экран, но свет из каждого проектор
пропускается через поляризатор (к примеру, поляроидную пленку
от жидкокристаллического индикатора). Плоскости поляризации для
проекторов перпендикулярны (к примеру, на левом вертикальна, на
правом горизонтальна).
На пользователя надеваются очки из двух поляризаторов, плоскости
поляризации которых совпадают с плоскостями поляризации проекторов.
По такой схеме делал изображение Bohdan Afanasjev, 2:463/416.13.
6.3. 'Magic Eye' - скрытые картинки.┼
²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²▄
Картинки, на которых с первого взгляда есть лишь какой-то орнамент,
но если вглядеться хитрым взглядом (глядя сквозь нее в бесконечность),
можно увидеть объемные фигуры.
Достоинства - не нужна никакая дополнительная техника.
Недостатки - отражает только форму, цвет и даже яркость теряются.
--------+--------▐
X - - - -▒ z
/ \
/ \
/ \
----/-------\---- плоскость экpана
/ \
/ \
/ \
() глаза ()
+ - начало кооpдинат, ось z - вниз, ось x - впpаво
X - точка объекта
Кооpдинаты глаз: (-b/2,L) - левый, (b/2,L) - пpавый.
(L - pасстояние от глаз до плоскости pисyнка - т.е. где z=0)
Точки пеpесечения 'лyчей из глаз' с экpаном:
z_l = z_r = h (h - от экpана до фона pисyнка)
x_l = x - (x - x_l_eye)*(h-z)/(L-z) (1)
x_r = x - (x - x_r_eye)*(h-z)/(L-z) (2)
Вот. И, соответственно, цвета точек с кооpдинатами x_l и x_r должны
совпадать - нy или соответствовать, но тогда бyдет блестеть и тpyдно
совмещаться.
Пpямые pасчеты по фоpмyлам (1),(2) пpоводить с пpиличной (e.g. для
анимации) скоpостью неpеально.
А тепеpь yпpощения: 1/H = 1/h - 1/L x_r ~= x*(1-C) + x_r_eye*C +(x-x_r_eye)*z/H (2a) x_r-x_l = b*C - b*z/H (3) (x_r+x_l)/2 = x*(1-C) + x*z/H (4) Кстати, веpтикальная кооpдината на экpане y_r = y_l = y*(1-C) - это точное выpажение. 2. Опpеделим x чеpез x_r (фоpмyла несимметpичная, зато быстpый Т.к. z< Вместо x,y,z yдобнее pаботать с x*(1-C), y*(1-C). Тогда фоpмyлы Для симметpизации каpтинки/ypавнений можно либо бpать цикл по x
1. Пyсть z<
= x*(1-C) + x_l_eye*C + (x - x_l_eye)*z/H (1a)
H=h*L/(L-h)=h/(1-C); H ~ h
обсчет - т.к. пойдет цикл по отобpажаемым точкам).
x*(1-C) = (x_r - x_r_eye*C) (5)
(5) и (3) пеpепишyтся в виде
x = (x_r + b/2*C)
x_r-x_l = b*C - b*z/h.
Hетpyдно видеть, что b*C - пеpиод стеpеогpаммы для pовной повеpхности z=0.
Обозначим его B.
Итак, счет в циклах по y и x_r идет по фоpмyлам
x := x_r + B/2
z := z(x,y)
x_l := x_r - z*B/h
screen(x_r,y) := screen(x_l,y)
и вычислять x_l и x_r по фоpмyлам (1a) и (2a) (но пpи этом могyт
возникнyть чеpные полосы), либо потpебовать, чтобы сpедний по
сканлайнy z был pавен нyлю (к пpимеpy, посчитав его и 'загнyв
кpая' сканлайна для выхода на 0.
6.4. Затворные очки.┼
²²²²²²²²²²²²²²²²²²²²▄
[Dmitry Tjurev, 2:5061/15.49]
Одним из способов получения по-настоящему объёмного изображения
является использование, так называемых, затворных очков. Принцип их
работы состоит в следущем. Изображение для левого и правого глаза
строится на двух видеостраницах. Во время обратного хода луча
переключается видимость страниц и одновременно поступает управляющий
сигнал на очки, которые по очереди открывают то один, то другой глаз,
демонстрируя таким образом для каждого глаза свою видеостраницу. Такие
очки называются 3D-MAX. По сути, принцип получения объёмного
изображения аналогичен красно-синим очкам, с той лишь разницей, что у
последних теряется информация о цвете, а в затворных очках нет.
Что касается принципов построения картинок для каждого глаза (это
относится как к затворным очкам, так и к красно-синему режиму).
Начнём с того, что у нас должна быть возможность получить изображение
сцены из любой точки и в произвольном направлении. Обычно это
используется в 3d-играх, но ни кто не мешает применить такой эффект,
например, в 3d studio. Итак, первым условием получения объёма является
разнесённость точек набдюдения в пространстве на некоторое ненулевое
расстояние, называемое стреобазисом (тут прямая аналогия с глазами ;).
Второе условие - сведение лучей зрения друг к другу. Т.е. лучи зрения
должны пересекаться на некотором расстоянии от наблюдателя. Объект,
находящийся в точке пересечения будет визуально находиться в плоскости
экрана монитора. Всё находящееся ближе этой точки будет вылазить за
экран, объекты расположенные позади пересечения лучей - будут утопать
в мониторе. Подбирать стереобазис и угол сведения нужно очень
аккуратно, т.к. иначе стереоэффект может получиться либо слишком
неявным (изображение практически плоское), либо слишом выраженным (на
картинке трудно сфокусироваться).
[skip]
В FAQ использованы фрагменты из DEMO.DESIGN FAQ. Кстати, если Вы не
^^^^^^^^^^^
нашли ответ на свой вопрос здесь - поищите там.