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.


 

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

34796. Гиппократ и зарождение научной медицины. Гиппократова модель врачебной этики и принцип не навреди 42.5 KB
  Наследие Имя Гиппократа сделалось собирательным и многие сочинения из семидесяти приписываемых ему принадлежат другим авторам преимущественно его сыновьям. Существует несколько сочинений Гиппократа этического направления: Клятва Закон О враче О благоприличном поведении Наставления которые в конце V и начале IV века до н. превратят научную медицину Гиппократа в медицинский гуманизм. За труды Гиппократа выдавались многие более поздние псевдогиппократовские произведения.
34797. Истоки средневековой философии. Библейские идеи философского значения 30.5 KB
  Формирование средневековой европейской философии Средневековая философия отдельный отрезок в истории европейской философии который непосредственно связан с христианской религией. Средневековая стадия философии имеет самостоятельное значение для развития философского мышления. Вовторых христианские взгляды заключают в себе оригинальные основания для дальнейшей разработки заимствованных из греческой философии понятий а равно для образования новых понятий которые оказали существенное влияние на последующую философию.
34798. Становление религиозной философии: патристика( тертулиан, Августин). Средневековая схоластика (Абеляр, росцеллин) 36.5 KB
  Центральное направление в развитии патристики этого периода борьба с ересями что связано с обретением христианством статуса государственной религии и официальной формулировкой христианского Никейского символа веры. Заложил основы традиции которая провозгласила несовместимость христианской веры с языческой мудростью. Включает философские системы ряда христианских мыслителей которые основываясь в своих посылках на религиозной догматике пытались посредством применения диалектического метода решить универсальные философские...
34799. Фома Аквинский – систематизатор средневековой схоластики. Соотношение веры и разума. Номиналистическая критика томизма: приоритет воли над разумом 29 KB
  Любая истина происходит от Бога. Дуализм Бога и мира. Только у Бога сущность совпадает с существованием у сотворенных вещей они не совпадают. Бытие Бога.
34800. Возрождение как синтез античности и средневековья. Антропоцентризм и проблема свободы личности 36 KB
  Первым литературным трудом Монтеня был предпринятый по просьбе отца перевод латинского трактата автор которого испанский теолог Раймунд Сабундский искал доказательства истинности католической веры в доводах человеческого естественного разума. Анализу воззрений испанского богослова и изложению собственных важнейших мыслей о религии посвящена Апология Раймунда Сабундского – самое обширное эссе Монтеня; работа над ним началась через семь лет после публикации перевода. Самые ранние из эссе Монтеня относятся к 1572 – году Варфоломеевской ночи и...
34801. Реализация и защита свободы совести и вероисповедания в РФ 432 KB
  Необходимость формирования правового механизма реализации права на свободу совести и вероисповедания связана с реальностью, когда соприкосновение со сферой религии отнюдь не исцеляет души, а ломает судьбы. И государство обязано проследить, чтобы свобода одних не оборачивалась болью для других///
34802. Пантеизм как специфическая черта натурфилософии возрождения. Диалектика ренессанса (Кузанский Бруно) социально-политическая модель Макиавелли 36.5 KB
  прямо не отрицая существования Бога она отождествляла его с природой. Теософия мудрость от Бога. Если учесть что познание от Бога а Бог непознаваем значит Бог предел познания. Бог это предел за которым нет знания но есть вера есть осознание Бога.
34803. Научная революция нового времени. Бэкон о естественной философии. Индуктивный метод. Источники заблуждений. Критика «идолов» 47 KB
  Бэкон о естественной философии. Бэкон Англия; С. В философии этого периода появляются два подхода к понятию субстанция: онтологическое понимание субстанции как предельного основания бытия основоположник Френсис Бэкон 1561 1626; гносеологическое осмысление понятия субстанция его необходимость для научного знания основоположник Джон Локк 16321704. Бэкон; рационализм Р.
34804. Рационализм декарта. Очевидность как критерий истины. Учение о врожденных истинах 44 KB
  С точки зрения Декарта непосредственные чувственные восприятия не подвергнутые анализу и проверке в свете разума могут вводить в заблуждение и не являться сами по себе гарантами достоверного познания. Скепсис Декарта скепсис методологический который должен привести к первичной достоверности. Философия Декарта является защитой не Божественного разума а нашего собственного земного человеческого.