Компьютерная визуализация Лекция №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(); }