Опубликован: 13.07.2010 | Доступ: свободный | Студентов: 889 / 20 | Оценка: 4.40 / 4.20 | Длительность: 77:34:00
Самостоятельная работа 20:

Геометрические примитивы в OpenGL

Аннотация: Поддержка меню в GLUT. Установка отсекающего объема (куба) для рисования сцены. Рисование точек (Points). Задание размера точки (PointsZ). Рисование линий в трехмерном пространстве (Lines). Ломаные и замкнутые линии. Управление шириной линий (LinesW). Фактура линий (LinesStipple). Рисование многоугольников в трехмерном пространстве. Рисование треугольников. Обход вершин. Ленты и вееры треугольников. Рисование конуса (Triangle). Удаление скрытых поверхностей. Отбор (culling). Каркасный режим и режим с заливкой. Фактура многоугольников (PolygonStipple). Каркасный режим: отсечение внутренних граней (Star).

Файлы к лабораторной работе Вы можете скачать здесь.

Сложные трехмерные объекты строятся в OpenGL на основе десяти базовых одно- и двухмерных объектов (примитивов) точно также, как из кирпичей строят здания любой сложности. В этой работе мы познакомимся с такими компоновочными элементами и обсудим вопросы, как рисовать объекты в трех измерениях с помощью простых форм: точек, линий, многоугольников.

Поддержка меню в GLUT

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

Библиотека GLUT имеет функции поддержки работы с всплывающим меню. Работа с меню в прикладной программе включает в себя несколько простых операций. Сначала надо определить в программе пункты меню. Нужно связать меню с определенной кнопкой мыши. И последнее - нужно определить функцию с обратным вызовом для обработки выбора каждого пункта меню. Реализацию и проверки изложенных шагов давайте выполним на коде программы Simple работы №19. В дальнейшем мы будем постепенно модифицировать эту первоначальную заготовку, наращивая меню в соответствии с возникающими задачами.

Создание заготовки приложения

Внимание. Шаги по настройке Visual Studio .NET 2005 для поддержки проектов библиотеками OpenGL и GLUT подробно изложены в работе "Простая программа на OpenGL"
  • Выберите место для размещения нового проекта C++ и командой File/New/Project создайте его с именем Primitives

  • Оставьте установки мастера по умолчанию и щелкните на кнопке Finish

  • Откорректируйте файл stdafx.h нового проекта Primitives, чтобы код стал таким
#pragma once
  
#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glut.h>  
  
#define WIN32_LEAN_AND_MEAN    // Exclude rarely-used stuff from Windows headers
#include <stdio.h>
#include <tchar.h>
Листинг 21.1. Код файла stdafx.h проекта Primitives
  • Возьмите код из файла Simple.cpp предыдущего проекта Simple и скопируйте его вместо автоматически сгенерированного кода файла Primitives.cpp проекта Primitives. Код должен быть таким
#include "stdafx.h"
  
// Прототипы функций
void RenderScene(void);
void SetupRC(void);
  
// Точка входа приложения
void main(void)
{
  glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
  glutCreateWindow("Primitives");
  glutDisplayFunc(RenderScene);
  SetupRC();
  glutMainLoop();
}
  
//****************************************************
// Функция обратного вызова для рисования сцены
void RenderScene(void)
{
  // Окно очищается текущим цветом,
  // установленным функцией glClearColor()
  glClear(GL_COLOR_BUFFER_BIT);
  // В буфер вводятся команды рисования
  glFlush();
}
  
//****************************************************
// Устанавливается состояние инициализации
void SetupRC(void)
{
  glClearColor(0.0F, 0.0F, 1.0F, 1.0F);// RGB + alpha-канал
}
Листинг 21.2. Код файла Primitives.cpp проекта Primitives
  • Постройте проект Primitives, должен получиться такой результат


Создание меню

Теперь давайте на этой модели создадим контекстное меню с пока тремя опциями и их условными названиями

    • Опция 1
    • Опция 2
    • Опция 3
  • Добавьте в функцию main() перед вызовом основного программного цикла glutMainLoop() следующий код, определяющий создание контекстного меню
#include "stdafx.h"
  
// Прототипы функций
void RenderScene(void);
void SetupRC(void);
// Прототип функции обработки выбора пользователя
void ExecuteMenu(int); 
  
// Точка входа приложения
void main(void)
{
  glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
  glutCreateWindow("Primitives");
  glutDisplayFunc(RenderScene);
  SetupRC();

  // Создание меню и добавление опций выбора
  glutCreateMenu(ExecuteMenu);
  glutAddMenuEntry("Опция 1", 1);
  glutAddMenuEntry("Опция 2", 2);
  glutAddMenuEntry("Опция 3", 3);
  glutAttachMenu(GLUT_RIGHT_BUTTON);
  
  glutMainLoop();
}
  
//****************************************************
// Функция обратного вызова обработки выбора пользователя
void ExecuteMenu(int choice)
{
  switch(choice){
    case 1:
        // Вариант выбора 1
        break;
    case 2: 
      // Вариант выбора 2
      break;
    case 3:
      // Вариант выбора 3
      break;
    default:
      ;
  }
  // Вызвать принудительно визуализацию
  glutPostRedisplay();
}
  
//****************************************************
// Функция обратного вызова для рисования сцены
void RenderScene(void)
{
  // Окно очищается текущим цветом,
  // установленным функцией glClearColor()
  glClear(GL_COLOR_BUFFER_BIT);
  // В буфер вводятся команды рисования
  glFlush();
}
  
//****************************************************
// Устанавливается состояние инициализации
void SetupRC(void)
{
  glClearColor(0.0F, 0.0F, 1.0F, 1.0F);// RGB + alpha-канал
}
Листинг 21.3. Код создания контекстного меню

Результат работы кода будет таким


Библиотека GLUT поддерживает и возможность создания подменю для отдельных опций, но на данном этапе нам показанных возможностей достаточно. Теперь мы можем, не перекомпилируя приложение для каждого нового изучаемого фрагмента кода, вызывать нужную функциональность через контекстное меню.

Переходим к основной теме нашей работы - изучению примитивов OpenGL.