Опубликован: 13.07.2010 | Уровень: специалист | Доступ: платный
Самостоятельная работа 19:

Простая программа на OpenGL

Упражнение 2. Рисование прямоугольника внутри окна (GLRect)

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

  • В панели Solution Explorer щелкните правой кнопкой мыши на узле проекта и через контекстное меню выполните команду Add/New Item


  • В открывшемся окне задайте имя файла GLRect, а тип и размещение выберите в соответствии со снимком

  • Нажмите кнопку Add и к проекту добавится новый пустой файл C++
  • Исключите из проекта прежний файл Simple.cpp. Для этого в панели Solution Explorer щелкните правой кнопкой мыши на этом файле и через контекстное меню выполните команду Remove

Файл можно исключить из проекта и клавишей Del. В этом случае оболочка выдаст диалоговое окно


Кнопка Delete удалит файл физически, а кнопка Remove только исключит файл из проекта. Физически на диске он останется, но в проекте участвовать не будет. В последующем его всегда можно будет вновь добавить к проекту.

  • Щелкните на пиктограмме Show All Files панели Solution Explorer и убедитесь, что файл Simple.cpp действительно существует


  • Заполните файл GLRect.cpp следующим кодом
#include "stdafx.h"
  
// Прототипы функций
void RenderScene(void);
void SetupRC(void);
void ChangeSize(int, int);
  
//**********************************************************
// Точка входа приложения
void main()
{
  glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
  glutInitWindowSize(800, 600);
  glutCreateWindow("GLRect");
  glutDisplayFunc(RenderScene);
  glutReshapeFunc(ChangeSize);
  SetupRC();
  glutMainLoop();
}
  
//**********************************************************
// Вызывается для рисования сцены
void RenderScene(void)
{
  // Очищаем окно текущим цветом очистки
  glClear(GL_COLOR_BUFFER_BIT);
  
  // Устанавливаем текущим цветом рисования красный
  // в модели     R   G     B
  glColor3f(1.0f, 0.0f, 0.0f);
  
  // Рисуем прямоугольник, заполненный текущим цветом
  glRectf(-50.0f, 50.0f, 50.0f, -50.0f);
  
  // Выполняет всю очередь текущих команд
  glFlush();
}
  
//**********************************************************
// Устанавливаем состояние визуализации
void SetupRC(void)
{
    // Устанавливаем цвет очистки синий непрозрачный
    glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
}
  
//**********************************************************
// Вызывается библиотекой GLUT при изменении размеров окна
void ChangeSize(int width, int height)
{
  GLfloat aspectRatio;
  
  // Предотвращаем деление на нуль
  if(height == 0)
    height = 1;
  
  // Устанавливаем поле просмотра с размерами окна
    glViewport(0, 0, width, height);
  
  // Устанавливает матрицу преобразования в режим проецирования
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  
  // Устанавливаем размеры перспективы (отсекающего объема)
  // (left, right, bottom, top, near, far)
  aspectRatio = (GLfloat)width / (GLfloat)height;
    if (width <= height)
    glOrtho (-100.0, 100.0, -100 / aspectRatio,
        100.0 / aspectRatio, 
        1.0, -1.0);
    else 
    glOrtho (-100.0 * aspectRatio, 
        100.0 * aspectRatio, 
        -100.0, 100.0, 
        1.0, -1.0);
  
  // Восстановливает матрицу преобразования в исходный режим вида
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
}
Листинг 19.16. Усложненный файл реализации GLRect.cpp
  • Запустите приложение и получите результат


Александр Очеретяный
Александр Очеретяный
Украина, Киев
Анастасия Балыбердина
Анастасия Балыбердина
Украина, Киев, НТУУ КПИ