Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.11.2015, 20:12   #1
bosyak
Пользователь
 
Регистрация: 12.11.2013
Сообщений: 29
По умолчанию Перемещение объекта OpenGl

Здравствуйте, у меня есть программа что то типо рисовалки, однако у меня возникла необходимость переместить нарисованный объект(массив объектов типа TPoints), так вооот, как мне сделать нарисованный объект выделяемым?
bosyak вне форума Ответить с цитированием
Старый 04.11.2015, 20:29   #2
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

если средствами OpenGL, то обычно каждому объекту отрисовки присваивается уникальный индекс, и в фрагментом шейдере в один буфер записываешь цвет объекта, а в другой его индекс. потом, при необходимости, читаешь содержание индексного буфера по координатам курсора при помощи glReadPixels. тема называется color picking.

Последний раз редактировалось f.hump; 04.11.2015 в 20:33.
f.hump вне форума Ответить с цитированием
Старый 04.11.2015, 20:31   #3
bosyak
Пользователь
 
Регистрация: 12.11.2013
Сообщений: 29
По умолчанию

Цитата:
Сообщение от f.hump Посмотреть сообщение
если средствами OpenGL, то обычно каждому объекту отрисовки присваивается уникальный индекс, и в фрагментом шейдере в один буфер записываешь цвет объекта, а в другой его индекс. потом, при необходимости, читаешь содержание индексного буфера по координатам курсора при помощи glReadPixels.
а если без присваивания уникального цвета?
bosyak вне форума Ответить с цитированием
Старый 04.11.2015, 20:38   #4
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

хотел бы и сам знать.
f.hump вне форума Ответить с цитированием
Старый 05.11.2015, 04:34   #5
bosyak
Пользователь
 
Регистрация: 12.11.2013
Сообщений: 29
По умолчанию

Здесь у меня происходит перевод x,y координат в формат координат OGL
Задание начальных точек(это для рисования) в зависимости от выбранного режима
Изображения
Тип файла: jpg Безымянный.jpg (37.4 Кб, 125 просмотров)
Тип файла: jpg 1.jpg (44.0 Кб, 124 просмотров)
Тип файла: png 2.png (9.7 Кб, 98 просмотров)
bosyak вне форума Ответить с цитированием
Старый 05.11.2015, 04:39   #6
bosyak
Пользователь
 
Регистрация: 12.11.2013
Сообщений: 29
По умолчанию

Здесь рисую сцену
Код:
{║}procedure TfrmMain.glDraw();                                             {║}
{║}var i,                                                                 {║}
{║}    j:LongInt;                                                         {║}
       Rectangle:TRect;
       a,
       b,
       c,
       d:integer;
  Count,mode: GLuint;
  vp : Array [0..3] of GLint;
  rec_count: integer;
  obj, obj_count, el: integer;
  s: string;
{║}begin                                                                  {║}

  glGetIntegerv(GL_RENDER_MODE, @Mode);
    if Mode=GL_SELECT then begin
    glMatrixMode(GL_PROJECTION);
    // сохранение матрицы проекций для формирования изображения
    // в стеке матриц и в переменной M
    glPushMatrix;
    glGetDoublev(GL_PROJECTION_MATRIX, @planes);
    // формирование матрицы проекций для режима выбора
    glLoadIdentity;
    glGetIntegerv(GL_VIEWPORT, @vp);
    gluPickMatrix(p.x, vp[3]-p.y, 5, 5, @vp);
    glMultMatrixd(@planes);
    glMatrixMode(GL_MODELVIEW);
    // инициализация стека имен
    glInitNames;
    glPushName(0);
  end;
  // очистка

     glClear(gl_color_buffer_bit or gl_depth_buffer_bit);
     glLoadIdentity();
 //    glTranslatef(0.0,0.0,-1.0);
{║}                                                                       {║}
{║}                                                                       {║}
{║}{Out cubes}                                                            {║}
{║}  glBegin(GL_quads);                                                   {║}
{║}                                                                       {║}
{║}    for i:=Low(Planes)                                                 {║}
{║}       to High(Planes) do                                              {║}
{║}                                                                       {║}
{║}      begin                                                            {║}
      if mode=GL_SELECT then GlLoadName(i+1);
{║}                                                                       {║}
{║}       glColor3f(                                                      {║}
{║}                  Planes[i][0].Color.Red,                              {║}
{║}                  Planes[i][0].Color.Green,                            {║}
{║}                  Planes[i][0].Color.Blue);                            {║}
{║}       {Up -}                                                          {║}
{║}       glVertex2f(                                                     {║}
{║}                  Planes[i][0].X,                                      {║}
{║}                  Planes[i][0].Y);                                     {║}
{║}                                                                       {║}
{║}       glVertex2f(                                                     {║}
{║}                  Planes[i][1].X,                                      {║}
{║}                  Planes[i][0].Y);                                     {║}
{║}       {Left |}                                                        {║}
{║}                                                                       {║}
{║}       glVertex2f(                                                     {║}
{║}                  Planes[i][1].X,                                      {║}
{║}                  Planes[i][1].Y);                                     {║}
{║}       {Down -}                                                        {║}
{║}       glVertex2f(                                                     {║}
{║}                  Planes[i][0].X,                                      {║}
{║}                  Planes[i][1].Y);                                     {║}
{║}      end;                                                             {║}
{║}  glEnd;                                                               {║}
{║}                                                                       {║}
         if mode=GL_SELECT then begin
          glMatrixMode(GL_PROJECTION);
          glPopMatrix;
          glMatrixMode(GL_MODELVIEW);
         end;
                                                           
                                                                  
end;
Когда включен режим рисования все фигуры нормально рисует
А вот когда переключаю в режим мыши и нажимаю на фигуру или пустое место то окно виснет, и приходится закрывать через диспетчер, в чем моя ошибка?

Последний раз редактировалось bosyak; 05.11.2015 в 04:43.
bosyak вне форума Ответить с цитированием
Старый 05.11.2015, 07:50   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

не перекладывайте работу на gl, gl это вывод.
храните сами инфу об объектах и по ней ищите всех кто входит в нужную точку, а зачем и по z-порядку(он у вас в теории должен быть) ищите нужный.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.11.2015, 05:38   #8
bosyak
Пользователь
 
Регистрация: 12.11.2013
Сообщений: 29
По умолчанию

Кароче сделал через glReadPixels
однако возникла вторая проблема, 3 неодинаковых по цвету фигуры
но перемещать я могу только ту что нарисовал последней в чем прикол не пойму
на картинках пример, сначала нарисовал красный, его двигать можно было, потом нарисовал зеленый, зеленый квадрат теперь зеленый квадрат двигать можно а красный нет, хотя и красный квадрат выделяется, специально для этого статус бар сделал
Изображения
Тип файла: jpg 1.jpg (9.3 Кб, 122 просмотров)
Тип файла: jpg 2.jpg (9.4 Кб, 119 просмотров)
Тип файла: jpg 3.jpg (10.4 Кб, 118 просмотров)
Тип файла: jpg 4.jpg (10.4 Кб, 124 просмотров)

Последний раз редактировалось bosyak; 06.11.2015 в 05:43.
bosyak вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перемещение нарисованного объекта Mr.Dmitry Общие вопросы Delphi 22 09.10.2015 16:59
Перемещение графического объекта woorribin Помощь студентам 0 10.05.2015 15:21
Перемещение объекта мыщью palyach Паскаль, Turbo Pascal, PascalABC.NET 20 03.05.2013 14:58
перемещение объекта за курсором мышки eu8cc Общие вопросы Delphi 2 28.09.2009 22:48