Опубликован: 02.12.2011 | Доступ: свободный | Студентов: 980 / 117 | Оценка: 5.00 / 4.00 | Длительность: 09:26:00
Специальности: Программист
Теги: .net, open source, opengl
Лекция 6:

Координатные преобразования в OpenGL

< Лекция 5 || Лекция 6: 123456 || Лекция 7 >

Преобразования области вывода

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

Большинство устройств вывода, например, такие как монитор и принтер, используют целочисленные координаты для отображения графической информации. Поэтому кроме преобразования масштабирования координат к координатам устройства вывода, на этом этапе обычно выполняется округление полученных координат до целочисленных значений. Кроме того, в ряде случаев (например, для отображения на мониторе) выполняется изменение направления осей координат. Например, в библиотеке OpenGL проецирование выполняется на плоскость, задаваемую осями OX и ОY, где ось OY направлена вверх. В экранной же системе координат ось OY направлена вниз.

Универсальные команды работы с матрицами

Необходимо отметить, что OpenGL не накладывает какие-либо ограничения на использование тех или иных команд преобразования матриц на изменение определенных матриц. Практически все команды преобразования матриц могут быть использованы для преобразования любой из матриц библиотеки и выбор выполняемых преобразований определяется разработчиком программы.

Выбор текущей матрицы

Как уже говорилось выше, OpenGL реализует несколько матриц, содержание которых хранится в самой библиотеке. Получить доступ в каждый конкретный момент времени можно только к одной из этих матриц. Матрица, с которой будут выполняться те или иные преобразования, должна быть предварительно выбрана в качестве текущей с помощью команды MatrixMode. Выбранная матрица остается текущей до следующего вызова команды MatrixMode.

В C# команда реализована как статический метод класса GL:

void MatrixMode(MatrixMode mode);

В Object Pascal команда, выполняющая данную операцию, реализована в виде процедуры:

procedure glMatrixMode (mode: GLenum);

Параметр mode определяет выбираемую для дальнейших преобразований матрицу и может принимать значения, перечисленные в таблица 5.1.

Таблица 5.1. Возможные значения параметра mode команды MatrixMode
Назначение параметра Значение параметра
Библиотека OpenTK, C# Object Pascal
Видовая матрица MatrixMode.Modelview GL_MODELVIEW
Матрица проекции MatrixMode.Projection GL_PROJECTION
Матрица текстуры MatrixMode.Texture GL_TEXTURE

После инициализации библиотеки текущей является видовая матрица.

Изменение текущей матрицы на единичную матрицу

Для замены текущей матрицы (которая выбрана с помощью команды MatrixMode) на единичную матрицу используется команда LoadIdentity. Команда не имеет параметров.

На C# команда реализована как статический метод класса GL библиотеки OpenTK:

void LoadIdentity();

В Object Pascal команда, выполняющая данную операцию, реализована в виде процедуры:

procedure glLoadIdentity;

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

Замена текущей матрицы на произвольную

Для замены текущей матрицы OpenGL (которая выбрана с помощью команды MatrixMode) на произвольную матрицу используется команда LoadMatrix[fd]. Команда существует в двух вариантах: для матрицы вещественных значений одинарной точности и двойной точности. Команде передается один параметр – указатель на новую матрицу размером 4*4. Матрица должна быть вертикальной.

В библиотеке OpenTK команду реализуют ряд статических методов класса GL (C#):

void LoadMatrix(double* m);
void LoadMatrix(double[] m);
void LoadMatrix(float* m);
void LoadMatrix(float[] m);
void LoadMatrix(ref double m);
void LoadMatrix(ref float m);
void LoadMatrix(ref Matrix4 mat);
void LoadMatrix(ref Matrix4d mat);

В Object Pascal в файле OpenGL.pas объявлено так же несколько процедур, которые реализуют данную команду:

procedure glLoadMatrixd (m: PGLdouble);
procedure glLoadMatrixf (m: PGLfloat);
procedure glLoadMatrix(m: PGLdouble); overload;
procedure glLoadMatrix(m: PGLfloat); overload;

Умножение текущей матрицы на произвольную матрицу

Команда умножения матриц MultMatrix[f d] выполняет умножение текущей матрицы библиотеки (M) на произвольную матрицу (N).

M’ = N*M

Указатель на произвольную матрицу передается команде в качестве параметра. Матрица, передаваемая в качестве параметра, должна быть вертикальной.

В C# команда реализована как ряд статических методов класса GL библиотеки OpenTK:

void MultMatrix(double* m);
void MultMatrix(double[] m);
void MultMatrix(float* m);
void MultMatrix(float[] m);
void MultMatrix(ref double m);
void MultMatrix(ref float m);
void MultMatrix(ref Matrix4 mat);
void MultMatrix(ref Matrix4d mat);

В файле OpenGL.pas также объявлено несколько процедур, которые реализуют данную команду:

procedure glMultMatrixd (m: PGLdouble);
procedure glMultMatrixf (m: PGLfloat);
procedure glMultMatrix(m: PGLdouble);overload;
procedure glMultMatrix(m: PGLfloat); overload;

Умножение матриц обычно используется, когда необходимо добавить какое-либо преобразование к тем, которые выполняет текущая матрица.

Видовые преобразования

К видовым преобразованиям в OpenGL относятся преобразования, выполняемые с помощью видовой матрицы.

Для изменения видовой матрицы она должна быть предварительно выбрана с помощью команды MatrixMode.

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

Для изменения видовой матрицы могут использоваться все универсальные команды для преобразования матриц. Кроме того, OpenGL реализует команды, которые предназначены для выполнения видовых преобразований, такие как: параллельный перенос, масштабирование, поворот вокруг произвольной оси в пространстве. Во многих случаях более сложные преобразования удаётся представить в виде набора этих трех преобразований.

< Лекция 5 || Лекция 6: 123456 || Лекция 7 >
Владислав Нагорный
Владислав Нагорный

Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки?

Спасибо!

Лариса Парфенова
Лариса Парфенова

1) Можно ли экстерном получить второе высшее образование "Программная инженерия" ?

2) Трудоустраиваете ли Вы выпускников?

3) Можно ли с Вашим дипломом поступить в аспирантуру?