Лекция №2

Download Report

Transcript Лекция №2

Компьютерная визуализация
Лекция №2
СПбГУ ИТМО
2004
Модель формирования изображения
 предметы;
 источники;
 наблюдатель;
Установка порта вывода
void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
// (x,y) – координаты левого верхнего угла порта вывода;
// width – ширина порта вывода;
// height – высота порта вывода.
height
(x,y)
width
Координатная система
Перспективная проекция
void glFrustum(GLdouble left, GLdouble right,
GLdouble bottom, GLdouble top,
GLdouble near, GLdouble far);
// (left, bottom, near) – левый нижний угол ближней отсекающей рамки;
// (right, top, near) – правый верхний угол ближней отсекающей рамки;
// far – положение задней отсекающей рамки.
Перспективная проекция
void gluPerspective(GLdouble fovy, GLdouble aspect,
GLdouble near, GLdouble far);
// fovy – поле зрения в градусах;
// aspect – отношение ширины отсекающей рамки к высоте;
// near – положение передней отсекающей рамки;
// far – положение задней отсекающей рамки.
Ортографическая проекция
void glOrtho(GLdouble left, GLdouble right,
GLdouble bottom, GLdouble top,
GLdouble near, GLdouble far);
void gluOrtho2D(GLdouble left, GLdouble right,
GLdouble bottom, GLdouble top);
// (left, bottom, near) – левый нижний угол ближней отсекающей рамки;
// (right, top, near) – правый верхний угол ближней отсекающей рамки;
// far – положение задней отсекающей рамки.
Куб в различных проекциях
Сохранение пропорций
void Reshape(int width, int height)
{
// Установка порта вывода
glViewport(0, 0, width, height);
// Режим матрицы проекций
glMatrixMode(GL_PROJECTION);
// Сделать матрицу проекций единичной
glLoadIdentity();
// Определить отношение сторон
double aspect=width/double(height);
// Установить ортографическую систему координат
if(width>=height)
{
gluOrtho2D(-50.*aspect, 50.*aspect, -50., 50.);
}
else
{
gluOrtho2D(-50., 50., -50./aspect, 50./aspect);
}
//Режим видовой матрицы
glMatrixMode(GL_MODELVIEW);
}
Формирование сцены
void Draw(void)
{
//Очистка цветового буфера
glClearColor(1.0, 1.0, 1.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
// Режим отображения многоугольников
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
//Установка цвета отображения
glColor3d(0.0, 0.0, 0.0);
// Формирование списка вершин
glBegin(GL_POINTS);
glVertex2d(0., 0.); // 0
glVertex2d(-30., -30.); // 1
glVertex2d(-30., 0.); // 2
glVertex2d(-30., 30.); // 3
glVertex2d(0., 30.); // 4
glVertex2d(30., 30.); // 5
glVertex2d(30., 0.); // 6
glVertex2d(30., -30.); // 7
glVertex2d(0., -30.); //8
glEnd();
//Завершить выполнение команд
glFlush();
}
Отображение вершин
GL_POINTS
GL_TRIANGLE_STRIP
GL_LINES
GL_TRIANGLE_FUN
GL_LINE_STRIP
GL_QUADS
GL_LINE_LOOP
GL_QUAD_STRIP
GL_TRIANGLES
GL_POLYGON
Формирование геометрических примитивов
glRectd(GLdouble x1, GLdouble y1,
GLdouble x2, GLdouble y2);
- формирует прямоугольник
void gluCylinder(GLUquadricObj * qobj,
GLdouble baseRadius, GLdouble topRadius,
GLdouble height, GLint slices, GLint stacks);
- формирует цилиндр
void gluDisk(GLUquadricObj * qobj,
GLdouble innerRadius, GLdouble outerRadius,
GLint slices, GLint loops);
- формирует диск
void gluSphere(GLUquadricObj * qobj, GLdouble radius,
GLint slices, GLint stacks);
- формирует сферу
Перенос системы координат
void glTranslated(double x, double y, double z);
// (x, y, z) – координаты начала новой системы координат;
//Перенос вдоль x и y
glTranslated(1.,1.,0.);
glBegin(GL_LINE_LOOP);
glVertex2d(-2., 2.);
glVertex2d(2., 2.);
glVertex2d(2., -2.);
glVertex2d(-2., -2.);
glEnd();
Масштабирование системы координат
void glScaled(double x, double y, double z);
// x, y, z – коэффициенты масштабирования вдоль осей;
// Масштабирование вдоль x и y
glScaled(0.5, 1.5, 1.);
glBegin(GL_LINE_LOOP);
glVertex2d(-2., 2.);
glVertex2d(2., 2.);
glVertex2d(2., -2.);
glVertex2d(-2., -2.);
glEnd();
Поворот системы координат
void glRotated(double angle, double x, double y, double z);
// angle – угол поворота в градусах;
// (x, y, z) – координаты вектора, вокруг которого
осуществляется поворот;
// Поворот вокруг z
glRotated(30.,0.,0.,1.)
glBegin(GL_LINE_LOOP);
glVertex2d(-2., 2.);
glVertex2d(2., 2.);
glVertex2d(2., -2.);
glVertex2d(-2., -2.);
glEnd();
Стек матриц
void glPushMatrix();
- поместить текущую матрицу в стек;
void glPopMatrix();
- извлечь матрицу из стека.
Дисплейные списки
GLuint glGenLists(GLsizei range);
- находит свободный идентификатор;
void glNewList (GLuint list, GLenum mode);
- открывает дисплейный список;
void glEndList (void);
- закрывает дисплейный список;
void glCallList (GLuint list);
- выполняет дисплейный список;
void glCallLists(GLsizei n, GLenum type, const GLvoid * lists);
- выполняет набор дисплейных списков;
void glDeleteLists(GLuint list, GLsizei range);
- удаляет дисплейные списки.
Рисование шпальной миры
int target;
void Init()
{
target = glGenLists(1);
if (target != 0)
{
int n=5;
double dx=1./n;
double x=-1.+dx/2.;
void Draw(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3d(1.0, 1.0, 1.0);
glPushMatrix();
glTranslated(-25.,25.,0.);
glScaled(15.,15.,1.);
glCallList(target);
glPopMatrix();
glPushMatrix();
glTranslated(-25.,-25.,0.);
glScaled(15.,15.,1.);
glRotated(90,0.,0.,1.);
glCallList(target);
glPopMatrix();
glNewList(target, GL_COMPILE);
glBegin(GL_QUADS);
for(int i=0; i<n; ++i)
{
glVertex2d(x,1.);
glVertex2d(x,-1.);
glVertex2d(x+dx,-1.);
glVertex2d(x+dx,1.);
x+=2*dx;
}
glEnd();
}
}
glPushMatrix();
glTranslated(25.,-25.,0.);
glScaled(15.,15.,1.);
glRotated(45,0.,0.,1.);
glCallList(target);
glPopMatrix();
glEndList();
glPushMatrix();
glTranslated(25.,25.,0.);
glScaled(15.,15.,1.);
glRotated(-45,0.,0.,1.);
glCallList(target);
glPopMatrix();
}
glFlush();
Рисование координатных осей
void Draw(void)
{
//Очистка цветового буфера
glClearColor(1.0, 1.0, 1.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
//Установка цвета отображения
glColor3d(0.0, 0.0, 0.0);
//Рисование горизонтальной оси
glBegin(GL_LINES);
glVertex2d(-50., .0);
glVertex2d(50., .0);
for(int i=-50; i<=50; i++)
{
glVertex2d(i, .0);
if(i % 5)
{
glVertex2d(i, -1.);
}
else if(i % 10)
{
glVertex2d(i, -2.);
}
else
{
glVertex2d(i, -3.);
}
}
glEnd();
//Рисование вертикальной оси
glBegin(GL_LINES);
glVertex2d(.0, -50.);
glVertex2d(.0, 50.);
for(int j=-50; j<=50; j++)
{
glVertex2d(.0, j);
if(j % 5)
{
glVertex2d(-1., j);
}
else if(j % 10)
{
glVertex2d(-2., j);
}
else
{
glVertex2d(-3., j);
}
}
glEnd();
//Завершить выполнение команд
glFlush();
}
Рисование координатных осей
void Init(void)
{
//Формирование оси
axis = glGenLists(1);
if (axis != 0)
{
glNewList(axis, GL_COMPILE);
glBegin(GL_LINES);
glVertex2d(0., .0);
glVertex2d(100., .0);
}
}
for(int i=0.; i<97; i++)
{
glVertex2d(i, .0);
if(i % 5)
{
glVertex2d(i, 1.);
}
else if(i % 10)
{
glVertex2d(i, 2.);
}
else
{
glVertex2d(i, 3.);
}
}
glEnd();
glEndList();
int axis;
void Draw(void)
{
//Очистка цветового буфера
glClear(GL_COLOR_BUFFER_BIT);
//Установка цвета отображения
glColor3d(1.0, 1.0, 0.0);
//Рисование горизонтальной оси
glPushMatrix();
glTranslated(-50.,0.,0.);
glRotated(180.,1.,0.,0.);
glCallList(axis);
glPopMatrix();
//Рисование вертикальной оси
glPushMatrix();
glTranslated(0.,-50.,0.);
glRotated(90.,0.,0.,1.);
glCallList(axis);
glPopMatrix();
//Завершить выполнение команд
glFlush();
}