14577

Реализация выбора объектов в интерактивной графической программе

Лабораторная работа

Информатика, кибернетика и программирование

Лабораторная работа № 8 Реализация выбора объектов в интерактивной графической программе Цель работы Изучение механизма выбора OpenGL средства реализующего функции логического устройства типа селектор 1. Выбор и обратная связь Некоторые графические прикладн...

Русский

2013-06-08

52 KB

7 чел.

Лабораторная работа № 8

Реализация выбора объектов в интерактивной графической программе

Цель работы

Изучение механизма выбора OpenGL – средства, реализующего функции логического устройства типа «селектор»

1. Выбор и обратная связь

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

Обычно Open GL работает в режиме выбора. Другой режим, который может использоваться для выбора объектов – обратная связь. В режиме обратной связи вы используете ваши графические аппаратные средства и Open GL для выполнения обычных вычислений сцены, однако вместо использования вычисленных результатов для рисования изображения на экране Open GL возвращает вам информацию о рисунке.

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

  

2. Выбор.

Как правило, когда вы планируете использование механизма выбора Open GL, вы сначала рисуете вашу сцену в буфер кадра, а затем включаете режим выбора и перерисовываете сцену. Когда вы находитесь в режиме выбора, содержимое буфера кадра не изменяется, пока вы не выйдете из этого режима. Когда вы выходите из режима выбора Open GL, возвращает список примитивов, которые попадают в видимый объем. Каждый примитив, пересекающий (попадающий полностью или частично в видимый объем), вызывает ответ выбора (selection hit). Список примитивов возвращается в виде ответных записей (hit records), представляющих собой массив целочисленных имен и связанных данных, соответствующих текущему содержанию стека имен. Вы создаете стек имен (stack), загружая в него имена, когда вы используете команды рисования примитивов, находясь в режиме выбора. Таким образом, когда возвращен список имен, вы можете его использовать для определения примитивов, которые могли бы быть выбраны пользователем на экране.

В дополнение к этому механизму выбора Open GL представляет сервисную программу, предназначенную для упрощения выбора в некоторых случаях, ограничивая рисование маленькой областью окна просмотра. Как правило, эта подпрограмма используется, чтобы определить, какие объекты рисуются в близи курсора.

3. Использование механизма выбора в интерактивной графической программе.

Чтобы использовать механизм выбора, вы должны выполнить следующие шаги:

1. Определить с помощью команды glSelectBuffer массив, который будет использоваться для возвращаемых ответных записей.

  1.  Войти в режим выбора, задав константу GL_SELECT в команде glRenderMode.
  2.  Инициализировать стек имен, используя команды glInitNames( ) и glPushName().
  3.  Определить видимый объем, который вы хотите использовать для выбора. Обычно он отличается от видимого объема, в котором первоначально рисуется сцена. Поэтому, вы вероятно захотите сохранить, а затем восстановить текущее состояние преобразования с помощью команд glPushMatrix( ) и glPopMatrix( ).
  4.  Поочередно вызывать команды рисования примитивов и команды управления стеком имен, чтобы каждому примитиву, представляющему интерес, было назначено соответствующее имя.
  5.  Выйти из режима выбора и обработать возвращенные данные выбора (ответные записи).

Пример программы, использующей механизм выбора в интерактивной графической программе:

#include <GL/glut.h>

#include <stdlib.h>

#include <stdio.h>

void drawTriangle (GLfloat x1, GLfloat y1, GLfloat x2,

   GLfloat y2, GLfloat x3, GLfloat y3, GLfloat z)

{

  glBegin (GL_TRIANGLES);

  glVertex3f (x1, y1, z);

  glVertex3f (x2, y2, z);

  glVertex3f (x3, y3, z);

  glEnd ();

}

{

  glColor3f (1.0, 1.0, 1.0);

  glBegin (GL_LINE_LOOP);

  glVertex3f (x1, y1, -z1);

  glVertex3f (x2, y1, -z1);

  glVertex3f (x2, y2, -z1);

  glVertex3f (x1, y2, -z1);

  glEnd ();

  glBegin (GL_LINE_LOOP);

  glVertex3f (x1, y1, -z2);

  glVertex3f (x2, y1, -z2);

  glVertex3f (x2, y2, -z2);

  glVertex3f (x1, y2, -z2);

  glEnd ();

  glBegin (GL_LINES); /*  4 lines */

  glVertex3f (x1, y1, -z1);

  glVertex3f (x1, y1, -z2);

  glVertex3f (x1, y2, -z1);

  glVertex3f (x1, y2, -z2);

  glVertex3f (x2, y1, -z1);

  glVertex3f (x2, y1, -z2);

  glVertex3f (x2, y2, -z1);

  glVertex3f (x2, y2, -z2);

  glEnd ();

}

void drawScene (void)

{

  glMatrixMode (GL_PROJECTION);

  glLoadIdentity ();

  gluPerspective (40.0, 4.0/3.0, 1.0, 100.0);

  glMatrixMode (GL_MODELVIEW);

  glLoadIdentity ();

  gluLookAt (7.5, 7.5, 12.5, 2.5, 2.5, -5.0, 0.0, 1.0, 0.0);

  glColor3f (0.0, 1.0, 0.0); /*  green triangle */

  drawTriangle (2.0, 2.0, 3.0, 2.0, 2.5, 3.0, -5.0);

  glColor3f (1.0, 0.0, 0.0); /*  red triangle */

  drawTriangle (2.0, 7.0, 3.0, 7.0, 2.5, 8.0, -5.0);

  glColor3f (1.0, 1.0, 0.0); /*  yellow triangles */

  drawTriangle (2.0, 2.0, 3.0, 2.0, 2.5, 3.0, 0.0);

  drawTriangle (2.0, 2.0, 3.0, 2.0, 2.5, 3.0, -10.0);

  drawViewVolume (0.0, 5.0, 0.0, 5.0, 0.0, 10.0);

}

void processHits (GLint hits, GLuint buffer[])

{

  unsigned int i, j;

  GLuint names, *ptr;

  printf ("hits = %d\n", hits);

  ptr = (GLuint *) buffer;

  for (i = 0; i < hits; i++) { /*  for each hit  */

     names = *ptr;

     printf (" number of names for hit = %d\n", names); ptr++;

     printf("  z1 is %g;", (float) *ptr/0x7fffffff); ptr++;

     printf(" z2 is %g\n", (float) *ptr/0x7fffffff); ptr++;

     printf ("   the name is ");

     for (j = 0; j < names; j++) { /*  for each name */

        printf ("%d ", *ptr); ptr++;

     }

     printf ("\n");

  }

}

#define BUFSIZE 512

void selectObjects(void)

{

  GLuint selectBuf[BUFSIZE];

  GLint hits;

  glSelectBuffer (BUFSIZE, selectBuf);

  (void) glRenderMode (GL_SELECT);

  glInitNames();

  glPushName(0);

  glPushMatrix ();

  glMatrixMode (GL_PROJECTION);

  glLoadIdentity ();

  glOrtho (0.0, 5.0, 0.0, 5.0, 0.0, 10.0);

  glMatrixMode (GL_MODELVIEW);

  glLoadIdentity ();

  glLoadName(1);

  drawTriangle (2.0, 2.0, 3.0, 2.0, 2.5, 3.0, -5.0);

  glLoadName(2);

  drawTriangle (2.0, 7.0, 3.0, 7.0, 2.5, 8.0, -5.0);

  glLoadName(3);

  drawTriangle (2.0, 2.0, 3.0, 2.0, 2.5, 3.0, 0.0);

  drawTriangle (2.0, 2.0, 3.0, 2.0, 2.5, 3.0, -10.0);

  glPopMatrix ();

  glFlush ();

  hits = glRenderMode (GL_RENDER);

  processHits (hits, selectBuf);

}

void init (void)

{

  glEnable(GL_DEPTH_TEST);

  glShadeModel(GL_FLAT);

}

void display(void)

{

  glClearColor (0.0, 0.0, 0.0, 0.0);

  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  drawScene ();

  selectObjects ();

  glFlush();

}

void keyboard(unsigned char key, int x, int y)

{

  switch (key) {

     case 27:

        exit(0);

        break;

  }

}

/*  Main Loop  */

int main(int argc, char** argv)

{

  glutInit(&argc, argv);

  glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);

  glutInitWindowSize (200, 200);

  glutInitWindowPosition (100, 100);

  glutCreateWindow (argv[0]);

  init();

  glutDisplayFunc(display);

  glutKeyboardFunc(keyboard);

  glutMainLoop();

  return 0;

}

Порядок выполнения лабораторной работы

  1.  Отладить и запустить программу, приведенную в тексте лабораторной работы.
  2.  Составить интерактивную графическую программу, использующую механизм выбора по заданию преподавателя.

Контрольные вопросы

  1.  Программистская модель интерактивной машинной графики.
  2.  Классы логических устройств ввода. Селектор.
  3.  Реализация логического устройства ввода типа «селектор» средствами OpenGL.


 

А также другие работы, которые могут Вас заинтересовать

31621. Запалення. Етіологія запалення 99.5 KB
  Крім того запалення є важливою захиснопристосувальною реакцією яка сформувалася в процесі еволюції як засіб збереження цілого організму за рахунок втрати його якоїсь певної частини. Запалення ушкоджує цілу структурнофункціональну одиницю тканини або органа яка носить назву гістіон і включає в себе: 1 специфічні для даної тканини чи органа клітини паренхіматозні клітини; 2 елементи сполучної тканини: а клітини фіброцити фібробласти моноцити гранулоцити тканині базофіли б сполучнотканинні волокна колагенові еластичні...
31622. ЗАХВОРЮВАННЯ НИРОК 85.5 KB
  Гломерулонефрит двохстороннє дифузне захворювання нирок алергійної природи. Гострий гломерулонефрит ГГН найбільш розповсюджене захворювання нирок особливо у молодому віці 2040 років має тривалий сезонний перебіг загострюється з жовтня по березень і є причиною розвитку ХНН. гіпертензивний синдром виникає у звязку із гіпоксією юкстагломерулярного апарату нирок що веде до активації ренінангіотензинальдостеронвазопресинної системи і супроводжується виникненням реноваскулярної гіпертензії.
31623. ІНФЕКЦІЙНИЙ ПРОЦЕС 81.5 KB
  Розвиток і перебіг інфекційного процесу викликаного різними патогенними мікроорганізмами характеризуються в цілому однотипністю але разом з тим існують визначені відмінні риси цього процесу обумовлені насамперед характером інфекційного фактора а також реактивністю макроорганізму і впливом на нього умов навколишнього середовища. Усі збудники інфекційних хвороб відбулися від вільно живучих мікроорганізмів сапрофітів що набули в ході еволюції здатність до паразитизму існуванню за рахунок живильних речовин організму хазяїна. Надходження...
31624. ПАТОГЕННА ДІЯ ФАКТОРІВ ЗОВНІШНЬОГО СЕРЕДОВИЩА 77.5 KB
  Крашсиндром це патологічний процес який розвивається в потерпілих у результаті тривалого 48 г і більше роздавлювання мяких тканин кінцівок уламками зруйнованих будинків споруджень брилами ґрунту при обвалах у шахтах і ін. Головною ознакою стадії декомпенсації є зниження температури ядра тіла що закономірно приводить: а до зменшення швидкості всіх біохімічних реакцій в організмі у тому числі і процесів біологічного окислювання; б при цьому різко зменшується споживання кисню й утворення АТФ у клітинах; в дефіцит...
31625. ПАТОЛОГІЧНА ФІЗІОЛОГІЯ НИРОК 85 KB
  Ниркову недостатність класифікують наступним чином: 1 У залежності від причин розвитку недостатність нирок може бути: а преренальною порушення кровопостачання нирок б ренальною порушення функції клубочків клубочкової фільтрації і ниркових канальців канальцевої реабсорбції і секреції в постренальною порушення що виникають на шляху відтоку сечі і г аренальною порушення обумовлені відсутністю нирок. Причиною цього є перешкоди відтоку фільтрату чи сечі при ушкодженні канальців закупорка канальців некротчними...
31626. ПАТОЛОГІЯ ВІНЦЕВОГО КРОВООБІГУ 77 KB
  Перш ніж розглянути коронарну недостатність слід зупинитися на особливостях вінцевого кровообігу який характеризується: 1 Високим рівнем екстракції кисню в капілярах серця 7075 у головному мозку 25 у скелетних мязах і печінці 20 що пояснюється значною довжиною капілярного русла серця і у звязку з цим тривалим часом контакту крові із стінкою капілярів. Тому при збільшенні потреби серця в О2 вона не може бути забезпечена шляхом збільшення екстракції О2 як у скелетних мязах оскільки остання і так є максимально можливою в...
31627. ПАТОЛОГІЯ ВОДНО-ЕЛЕКТРОЛІТНОГО ОБМІНУ 86.5 KB
  Внутрішній обмін води залежить від збалансованості між поступленням рідини в організм і її виділенням за один і той же час. N K C Mg ВКС 100 1600 10 130 МКС 1480 45 20 10 ВСС 1420 40 25 15 Із таблиці бачимо що основним електролітом плазми і міжклітинної рідини є N а внутрішньоклітинної рідини K і Mg2 що забезпечує осмотичний тиск всередині клітин. Дегідратація зменшення обєму позаклітинної рідини в організмі коли втрата води переважає над поступленням і виникає негативний водний баланс. Ізоосмолярна дегідратація ...
31628. ПАТОЛОГІЯ ГІПОТАЛАМО-ГІПОФІЗАРНОЇ СИСТЕМИ, ГОНАД і ЕПІФІЗА 89 KB
  Порушення функції гіпоталамоаденогіпофізарної системи. Патогенна дія факторів зовнішнього і внутрішнього середовища негативні емоції біль психічні порушення і т. Механізми виникнення дисфункції гіпоталамоаденогіпофізарної системи: 1 Порушення центральної регуляції нейроендокринних зон гіпоталамуса. 2 Порушення утворення і виділення релізінггормонів клітинами гіпоталамусу.
31629. ПАТОЛОГІЯ ЕНДОКРИННОЇ СИСТЕМИ 80.5 KB
  За функціональних ефектами гормони поділяють на: а ефекторні діють безпосередньо на органимішені; б тропні регулюють синтез ефекторних гормонів; в релізінггормони регулюють синтез і секрецію тропних гормонів. Основні властивості гормонів: 1 утворюються спеціалізованими клітинами ендокринних залоз; 2 секретуються в кров або інші циркулюючі рідини; 3 характеризуються специфічністю впливу який повязаний із існуванням “клітинмішеней†які мають особливі рецептори до конкретного гормону; 4 володіють високою біологічною...