Визуализация в научных исследованиях. Ечкина Е.Ю - 49 стр.

UptoLike

Рубрика: 

Е. Ю. Ечкина, С. Б. Базаров, И. Н. Иновенков «Визуализация в научных исследованиях»
Кафедра АНИ факультета ВМК МГУ имени М. В. Ломоносова http://ani.cs.msu.su
49
В целом, для отображения трехмерных объектов сцены в окно приложения
используется следующая последовательность действий:
Координаты
объекта
=>
Видовые
координаты
=>
Усеченные
координаты
=>
Нормализованные
координаты
=>
Оконные
координаты
Рассмотрим каждое из этих преобразований отдельно.
Видовое преобразование
К видовым преобразованиям будем относить перенос, поворот и изменение масштаба
вдоль координатных осей. Для проведения этих операций достаточно умножить на
соответствующую матрицу каждую вершину объекта и получить измененные
координаты этой вершины:
(x’, y’, z’, 1)
T
=M * (x, y, z, 1)
T
где M матрица видового преобразования. Перспективное преобразование и
проектирование производится аналогично. Сама матрица может быть создана с
помощью следующих команд:
void glTranslate[f d](GLtype x, GLtype y, GLtype z)
void glRotate[f d](GLtype angle, GLtype x, GLtype y, GLtype z)
void glScale[f d](GLtype x, GLtype y, GLtype z)
glTranlsate..() производит перенос объекта, прибавляя к координатам его вершин
значения своих параметров.
glRotate..() производит поворот объекта против часовой стрелки на угол angle
(измеряется в градусах) вокруг вектора ( x,y,z ).
glScale..() производит масштабирование объекта (сжатие или растяжение), домножая
соответствующие координаты его вершин на значения своих параметров.
Все эти преобразования будут применяться к примитивам, описания которых будут
находиться ниже в программе. В случае если надо, например, повернуть один объект
сцены, а другой оставить неподвижным, удобно сначала сохранить текущую видовую
матрицу в стеке командой glPushMatrix(), затем вызвать glRotate..() с нужными
параметрами, описать примитивы, из которых состоит этот объект, а затем
восстановить текущую матрицу командой glPopMatrix().
Кроме изменения положения самого объекта иногда бывает нужно изменить
положение точки наблюдения, что однако также приводит к изменению видовой
матрицы. Это можно сделать с помощью команды
void gluLookAt (GLdouble eyex,
GLdouble eyey,
GLdouble eyez,
GLdouble centerx,
GLdouble centery,
GLdouble centerz,
GLdouble upx,
GLdouble upy,
GLdouble upz)
Е. Ю. Ечкина, С. Б. Базаров, И. Н. Иновенков «Визуализация в научных исследованиях»


В целом, для отображения трехмерных объектов сцены в окно приложения
используется следующая последовательность действий:
Координаты    Видовые       Усеченные     Нормализованные    Оконные
           =>            =>            =>                 =>
объекта       координаты    координаты    координаты         координаты
Рассмотрим каждое из этих преобразований отдельно.
Видовое преобразование
К видовым преобразованиям будем относить перенос, поворот и изменение масштаба
вдоль координатных осей. Для проведения этих операций достаточно умножить на
соответствующую матрицу каждую вершину объекта и получить измененные
координаты этой вершины:
(x’, y’, z’, 1)T =M * (x, y, z, 1)T
где M матрица видового преобразования. Перспективное преобразование и
проектирование производится аналогично. Сама матрица может быть создана с
помощью следующих команд:
       void glTranslate[f d](GLtype x, GLtype y, GLtype z)
       void glRotate[f d](GLtype angle, GLtype x, GLtype y, GLtype z)
       void glScale[f d](GLtype x, GLtype y, GLtype z)
glTranlsate..() производит перенос объекта, прибавляя к координатам его вершин
значения своих параметров.
glRotate..() производит поворот объекта против часовой стрелки на угол angle
(измеряется в градусах) вокруг вектора ( x,y,z ).
glScale..() производит масштабирование объекта (сжатие или растяжение), домножая
соответствующие координаты его вершин на значения своих параметров.
Все эти преобразования будут применяться к примитивам, описания которых будут
находиться ниже в программе. В случае если надо, например, повернуть один объект
сцены, а другой оставить неподвижным, удобно сначала сохранить текущую видовую
матрицу в стеке командой glPushMatrix(), затем вызвать glRotate..() с нужными
параметрами, описать примитивы, из которых состоит этот объект, а затем
восстановить текущую матрицу командой glPopMatrix().
Кроме изменения положения самого объекта иногда бывает нужно изменить
положение точки наблюдения, что однако также приводит к изменению видовой
матрицы. Это можно сделать с помощью команды
void gluLookAt (GLdouble eyex,
               GLdouble eyey,
               GLdouble eyez,
               GLdouble centerx,
               GLdouble centery,
               GLdouble centerz,
               GLdouble upx,
               GLdouble upy,
               GLdouble upz)

Кафедра АНИ факультета ВМК МГУ имени М. В. Ломоносова http://ani.cs.msu.su            49