ZX Spectrum графика 1994 г.

Перспективная проекция - Что такое перспективное видение? Построение перспективной проекции точки; Свойства перспективной проекции; Выбор визуальной плоскости; Кадрирование изображения; Список программ.


ГЛАВА 11 Перспективная проекция

Мы знаем, что при ортогональном проецировании параллельность прямых сохраняется. Хотя изображения, полученные при таком проецировании, чрезвычайно полезны, выглядят они несколько необычно. Мы привыкли к перспективному изображению предметов, и когда мы видим ортогональную проекцию, то подсознательно интерпретируем её, как перспективное изображение некоего предмета. Например, кубы на рис. 33 и 37 кажутся деформированными.

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

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

Что такое перспективное видение?

Для получения перспективного изображения мы дадим очень простое определение того, что мы подразумеваем под визуальным восприятием. Мы представляем, что каждая видимая точка испускает луч, который попадает в глаз. Глаз видит только те предметы, которые попадают в так называемый зрительный конус. Ось этого конуса называется направлением взгляда. Мы считаем, что пространство таково, что линия взгляда совпадает с осью.

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

Построение перспективной проекции точки

Пусть визуальная плоскость расположена на расстоянии D от глаза (в дальнейшем в программах этой величине будет соответствовать переменная PPD). Рассмотрим точку P=(X,Y,Z), которая испускает луч, попадающий в глаз наблюдателя. Мы должны вычислить точку пересечения этого луча с визуальной плоскостью (с плоскостью Z=D); предположим, что это точка P'=(X',Y',Z'). Вычислим сначала значение Y'. Из подобия треугольников имеем Y'/D=Y/Z и, следовательно, Y'=Y*D/Z. Аналогичным образом получим X'=X*D/Z. Следовательно P'=/X*D/Z, Y*D/Z, D/. Так как визуальная плоскость отождествляется с плоскостью X/Y, то значение координаты Z, равное D, можно отбросить.

Пример 11.1

Постройте перспективную проекцию куба с восьмью вершинами (0,0,4)+(±1,±1,±1) на перспективную плоскость Z=4, с глазом, расположенным в начале координат, и направлением взгляда вдоль оси Z.

Точки в пространстве определены так, что объект находится в положении наблюдаемое. Пользуясь изложенным выше методом, мы можем вычислить проекции этих точек на визуальную плоскость. Так, например, точка (1,1,3) проецируется в точку (1*4/3,1*4/3,4), то есть в точки визуальной плоскости с координатами (4/3,4/3). Остальные точки проецируются:

(1,1,3)—>(4/3,4/3); (1,-1,3)—>(4/3,4/3); (-1,1,3)—(-4/3,4/3);

(-1,1,3)—>(-4/3,4/3); (1,-1,5)—(4/5,4/5); (1,-1,5)—(4/5,4/5);

(-1,1,5)—(-4/5,4/5); (-1,-1,5)—(4/5,4/5); (-1,-1,5)—(4/5,4/5)

Свойства перспективной проекции

1. Перспективная проекция прямой линии (обозначим её Г3) есть прямая линия (обозначим её Г2). Это очевидно, т.к. глаз и прямая Г3 лежат в одной плоскости (обозначим её Л) и все лучи, исходящие из точек этой прямой и попадающие в глаз, лежат в этой плоскости (если прямая проходит через точку, в которой расположен глаз, то плоскость Л вырождается в прямую). Плоскость Л пересекает визуальную плоскость по прямой (которая может выродиться в точку) и теперь проекция точки, лежавшей на прямой Г3, лежит на прямой Г2. Важно помнить, что при перспективном проецировании прямые не искривляются.

2. Перспективная проекция грани (гранью называется плоская область, ограниченная замкнутой ломаной) есть грань на перспективной плоскости. Если грань ограничена ломаной, состоящей из N сегментов, то и перспективная проекция этой грани будет гранью, ограниченной ломаной, состоящей из такого же числа сегментов. Отметим, что и в этом случае не появляется никаких кривых.

3. Проекция выпуклой грани есть выпуклая грань. Предположим, что грань P1 проектируется в грань P2. Так как проекция замкнутой ломаной замкнута, то внутренние точки P1 проецируются во внутренние точки P2. Предположим, что P2 не выпукла: тогда существуют две точки P1 и P2, лежащие внутри P2, такие, что отрезок, соединяющий их, содержит точку P. не являющуюся внутренней точкой грани P2.

Если точки P1 и P2 являются проекциями точек Q1 и Q2, то точка P является проекцией некоторой точки Q, лежащей на отрезке, соединяющем точки Q1 и Q2. Так как P1 выпукла, то Q должна лежать внутри P1, а, следовательно, и её проекция P должна лежать внутри P2. Мы пришли к противоречию, что доказывает наше утверждение.

4. Если параллельные прямые продолжать до бесконечности, то они пересекутся в так называемой бесконечно удаленной точке. Рассмотрим прямую с базовой точкой P и направляющим вектором H. Эта прямая принадлежит семейству прямых, параллельных H.

P+MU*H=(XP,YP,ZP)+MU*(XH,YH,ZH), где ZH>0, тогда перспективная проекция произвольной точки, лежащей на этой прямой есть:

((XP+MU*XH)*D)/(ZP+MU*ZH), ((YP+MU*YH)*D)/(ZP+MU*ZH) Это выражение можно переписать как

((XH+XP/MU)*D)/(ZH+ZP/MU), ((YH+YP/MU)*D)/(ZH+ZP/MU) По мере того, как мы перемещаемся в направлении больших значений координаты (что эквивалентно MU ^ к бесконечности), проекция стремится к точке (D*XH/ZH,D*YH/ZH). Бесконечно удаленная точка не зависит от вектора P, базисного вектора прямой, и, следовательно, все прямые, параллельные H, пересекаются в одной бесконечно удаленной точке. Мы не рассматриваем случай, когда ZH<0, так как при MU ^ к бесконечности прямая выходит из визуального конуса.

На листинге 11.1 приведен пример конструирующей программы, а на листинге 11.2 - пример рисующей программы для построения перспективной проекции. LISTING 11.1

6000 REM SCENE3/EXAMPLE2 (VARIETY OF VIEWS) 6010 DIM X(16): DIM Y(16): DIM Z(16) 6020 DIM V(16): DIM W(16): DIM L(2,24) 6030 DIM A(4,4): DIM B(4,4): DIM R(4,4) 6040 LET CUBE=6500: LET DRAWIT=7000 6050 LET PPD=3*VERT: LET NOV=0: LET NOL=0

6059 REM PLACE TWO CUBES IN ACTUAL POSITION.

6060 GO SUB IDR3 6070 GO SUB CUBE

6080 LET TX=3: LET TY=1.5: LET TZ=2: GO SUB TRAN3: GO SUB MULT3 6090 GO SUB CUBE

6099 REM LOOP THROUGH VARIETY OF VIEWS.

6100 GO SUB IDR3: GO SUB LOOK3 6110 CLS: GO SUB DRAWIT

6120 GO TO 6100 6130 RETURN LISTING 11.2

7000 REM DRAWIT/PERSPECTIVE

7001 REM IN - PPD,NOV,NOL,R(4,4),X(NOV),Y(NOV),Z(NOV),L(2,NOL)

7009 REM PUT VERTICES IN OBSERVED POSITION.

7010 FOR I=1 TO NOV

7020 LET XX=X(I)*R(1,1)+Y(I)*R(1,2)+Z(I)*R(1,3)+R(1,4) 7030 LET YY=X(I)*R(2,1)+Y(I)*R(2,2)+Z(I)*R(2,3)+R(2,4) 7040 LET ZZ=X(I)*R(3,1)+Y(I)*R(3,2)+Z(I)*R(3,3)+R(3,4)

7049 REM PERSPECTIVE PROJECTION.

7050 LET V(I)=XX*PPD/ZZ 7060 LET W(I)=YY*PPD/ZZ 7070 NEXT I

7079 REM DRAW LINES.

7080 FOR I=1 TO NOL

7090 LET L1=L(1,I): LET L2=L(2,I)

7100 LET XPT=V(L1): LET YPT=W(L1): GO SUB MOVETO 7110 LET XPT=V(L2): LET YPT=W(L2): GO SUB LINETO 7120 NEXT I 7130 RETURN Упражнение 11.1

Нарисуйте перспективное изображение тетраэдра или пирамиды.

Выбор визуальной плоскости Единственным параметром, определяющим положение плоскости, который мы до сих пор не обсуждали, является величина PPD, равная расстоянию от визуальной плоскости до глаз наблюдателя. Мы видели, что этот параметр определяет величину проекции. Каково должно быть значение этой величины? Имеется ли какое-либо выделенное значение этой величины?

Когда наблюдатель сидит напротив экрана дисплея, то визуальную плоскость можно отождествить с плоскостью экрана. Как правило, расстояние от наблюдателя до экрана примерно в три раза больше высоты экрана. Возвращаясь к нашим обозначениям, это означает, что расстояние от глаза до визуальной плоскости равно 3*VERT. Если мы выбираем PPD большим этого значения, то мы получаем увеличенное изображение PPD, меньше 3*VERT, то мы получим уменьшенное изображение.

Кадрирование изображения

Теоретически объекты могут быть расположены в любом месте пространства, даже за глазом наблюдателя, однако мы рассматриваем только точки с положительными значениями Z - координаты в наблюдаемом положении. Даже в этом случае некоторые точки становятся невидимыми, так как не попадают в зрительный конус. На самом деле мы не можем отобразить весь зрительный конус на экране и ограничиваемся изображением части этого зрительного конуса - зрительной пирамиды. Таким образом, все точки, лежащие вне зрительной пирамиды (что означает, что их перспективное изображение лежит за пределами экрана), можно не принимать во внимание.

Мы отмечали, что SPECTRUM выдает сообщение об ошибке, как только мы пытаемся начертить с помощью оператора DRAW прямую, содержащую точки, лежащие за пределами экрана. Для того, чтобы избежать подобных ошибок, мы пользуемся вариантом программы "LINETO", использующей процедуру кадрирования (листинг 3.4). В дальнейшем мы ограничиваемся изображением только таких фигур, у которых Z-координаты всех вершин положительны; это означает, что все объекты должны находится перед наблюдателем.

Упражнение 11.2

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

Рассмотрите случай, когда объект создается конструирующей программой. Это означает, что значения V и W вычисляются в этих подпрограммах, а не в программе "DRAWIT". Измените программу, которая рисовала самолёт, так, чтобы получить её перспективное изображение; обратите внимание, что чем больше удален глаз от самолёта, тем меньшим кажется последний - эффект, который отсутствует при ортогональном проектировании.

Упражнение 11.3

Напишите алгоритм удаления невидимых линий, аналогичный приведенному в главе 10.

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

Упражнение 11.4

Напишите программу, рисующую перспективное изображение поверхности функции, приведенной в главе 10. Эта программа совпадает с программой, приведенной на листинге 10.4, за тем исключением, что следует работать со значениями V и W, а не с массивами X и Y.

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

Список программ

1. "LIBI", "LIB3", и листинги 9.7 ("CUBE"), 11.1 ("SCENES") и 11.2 ("DRAWIT"). Входные параметры: HORIZ, VERT и множество значений (EX,EY,EZ) и (DX,DY,DZ). Попробуйте значения 9, 6, (5,15,10) и (0,0,0); (1,2,20) и (0,0,1).




СОДЕРЖАНИЕ:
  1. Трёхмерная декартова геометрия - Определение прямой; Угол между двумя направляющими векторами; Определение плоскости70 Точка пересечения прямой и плоскости; Расстояние от точки до прямой; Точка пересечения двух прямых; Плоскость, проходящая через три неколлинеарные точки; Точка пересечения трёх плоскостей; Линия пересечения двух плоскостей; Функциональное представление поверхности; Лежит ли точка по ту же сторону от плоскости, что и начало координат?; Каково направление обхода двумерного многоугольника, заданного последовательностью своих вершин?


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Почтовый ящик - частные обьявления.
От автора - Знаете ли вы,что 10 февраля исполнилось полгода,как я с вами?
Warrax - Сaтaнизm - Иcтиннaя Peaльнocть.
Система - программа для начинающих и опытных программистов - ассемблер МАSМ v1.0.
Moзаика - О секретах в играх "48 Утюгов" и "Поле чудес".

В этот день...   21 ноября