Проекция

Проекция

Изобразить основные типы проекций. Подобрать соответствующие матрицы преобразований.

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

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

Матрица общего перспективного преобразования:
a x x p
x d x q
x x e r
m n L s

В этой матрице элементы a, d, е отвечают за масштабирование, m, n, L — за смещение, p, q, r — за проецирование, s — за комплексное масштабирование, х — за вращение.

Например, матрица для одноточечного проецирования на плоскость z = 0 будет выглядеть так:
1 0 0 0
0 1 0 0
0 0 1 r
0 0 0 1
Подразумевается, что на оси Z выбрана точка на некотором фокусном расстоянии F. Тогда коэффициент матрицы r = 1/F.

Именно таким образом получена первая матрица для моей программы:

1 0 0 0
0 1 0 0
0 0 1 -0.002
0 0 0 1

Для того, чтобы применить преобразование, задаваемое такой матрицей, координату каждой вершины (x,y,z) надо превратить в вектор {x, y, z, 1} и умножить на матрицу. Если 4-я координата полученного вектора не равна 1, следует все координаты вектора разделить на значение 4-й координаты. На экран выводим точку, задаваемую первыми двумя координатами такого вектора (x,y).

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

-0.93 -0.13 0.35 0
0 -0.93 -0.35 0
-0.38 0.33 -0.36 0
0 0 0 1

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

Программа получает входные данные из двух файлов: matrix.txt, где заданы матрицы преобразований, и in.txt, в котором задаётся нужная пространственная фигура.

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

Матрицы перспективных преобразований заслуживают более пристального внимания: в файле matrix.txt заданы 3 матрицы для параллельных проекций и 3 – для перспективных. Первая матрица задаёт перспективную одноточечную проекцию, где точка схода лежит на оси Z. Вторая – двухточечную проекцию, где точки схода лежат на осях X и Y. Третья – трёхточечную проекцию, соответственно, точки схода лежат на всех трёх осях координат.

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

Чтобы применить то или иное преобразование, координату каждой вершины (x,y,z) надо превратить в вектор {x, y, z, 1} и умножить на соответствующую матрицу. Для эффекта одновременного применения перспективного и параллельного преобразования соответствующие им матрицы предварительно перемножаются. Матрица текущего преобразования хранится в mcur. Важно не забывать, что, поскольку мы не изменяем исходные координаты точек, то преобразовывать координаты следует не только в процедуре рисования void drawBody (HWND hWnd, HDC hdc), но и при определении видимости/невидимости ребра - bool isVisible (PSIDE side).

Если вы хотите увидеть непосредственно работу программы – поместите в одну папку файлы Projection.exe, in.txt, matrix.txt и запустите Projection.exe.

Ключевые слова: 
проективное преобразование, аксонометрическая, диметрическая, изометрическая, перспективная, параллельная проекция
ВложениеРазмер
Projection.zip3.14 Мб