(WINAPI OpenGL) Почему не удаётся использовать writeln?

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Re: (WINAPI OpenGL) Почему не удаётся использовать writeln?

Сообщение xterro » 22.12.2015 19:19:38

Не, я имел ввиду в плане вывода на экран. Т.е как нарисовать что-то, смасштабировать(в частности под курсором), сдвинуть(в определнныъ границах), это у меня вызывает определённые трудности, не понимаю и всё тут, хоть тресни. Редактировать, сохранять и т.д... о таком я пока и не мечтаю :D Вот как в этом примере: с помощью gluOrtho2D получил плоскость отсечения, теперь я представляю, что это и есть мой холст(размером 1200х800 с началом координат в нижнем левом углу), на котором я буду рисовать. Теперь вроде как стало понятно как масштабировать этот "холст", просто применяем glScalef к матрице проекции, тут вроде все просто, но опять же, масштабирование идёт относительно начала координат, т.е нижнего левого угла, а как например смаштабировать относительно центра экрана, или позиции под курсором? Потом, если посмотреть на любую программу для работы с графикой или ккой-нибудь редактор, то мы увидим, что если область просмотра-вьюха, меньше этого самого холста(сцены), то она может передвигаться по нему в определенных пределах(до краёв холста, не дальше), вот как вот это организовать? Спрашиваешь на форумах, ответ обычно стандартный - иди учи матрицы... так что разбираюсь и дозреваю до понимания.

Так что до редактирования и сохранения мне ещё далеко. Хотя с логической точки зрения, выделение не должно быть сложным, если есть холст на котором мы рисуем, то достаточно проверять, над каким элементом находится курсор(по какому элементу клацнули), перебирая все координаты элементов на схеме какие совпали с координатами курсора, тот элемент и перерисовываем с флагом selected или как там. Понятно, что чем больше элементов на экране, тем больше кординат надо проверить и тем медленнее будет работать, но тут уже можно будет подумать над оптимизицией :roll:
xterro
постоялец
 
Сообщения: 148
Зарегистрирован: 23.02.2014 13:49:33

Re: (WINAPI OpenGL) Почему не удаётся использовать writeln?

Сообщение zub » 22.12.2015 21:57:13

>>а как например смаштабировать относительно центра экрана, или позиции под курсором?
1)получить мировые координаты точки под мышкой (P)
2)применить требуемые масштабирование к P, пусть это получится P1
3)итоговое преобразование чтоб точка под мышкой не "улетала" будет сдвиг на P1-P а потом масштабирование
в общем случае - двигаем точку относительно которой преобразовываем в начало координат,преобразовываем,двигаем обратно

>>то она может передвигаться по нему в определенных пределах(до краёв холста, не дальше), вот как вот это организовать?
тут 2 подхода
1 - пользователь сам задает размер "холста", программа за него вылезти не дает
2 - холст "бесконечный" а там где требуется размер холста (например в расчете скролбаров) участвует габарит чертежа

>>иди учи матрицы... так что разбираюсь и дозреваю до понимания
это да))

>>то достаточно проверять, над каким элементом находится курсор(по какому элементу клацнули), перебирая все координаты элементов
тут нужно заметить что не курсор, а область выделения. и эта операция очень похожа на отбраковку невидимых элементов (те что за границами экрана), используемую для ускорения рендера. в случае выделения мы ищем примитивы которые гарантировано внутри области, в случае отбраковки мы ищем примитивы которые гарантировано снаружи области.

>>но тут уже можно будет подумать над оптимизицией :roll:
про некоторые оптимизации лучше подумать сразу. потом их будет гораздо труднее ввести, чем сделать сразу. В часности для ускорения операций из предидущего пункта примитивы лучше хранить не в линейном списке а в бинарном дереве, или какимнибудь другим способом иметь пространственное разбиение модели
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: (WINAPI OpenGL) Почему не удаётся использовать writeln?

Сообщение xterro » 23.12.2015 09:29:34

1)получить мировые координаты точки под мышкой (P)
2)применить требуемые масштабирование к P, пусть это получится P1
3)итоговое преобразование чтоб точка под мышкой не "улетала" будет сдвиг на P1-P а потом масштабирование
в общем случае - двигаем точку относительно которой преобразовываем в начало координат,преобразовываем,двигаем обратно

1. с этим пунктом вроде как всё понятно
2. тут уже сложнее, преобразование(glscalf) разве не применяется ко всей матрице, или нужно конкретно точку умножать на матрицу?
3. получается, что мы как бы два раза масштабируем? т.е сначала к точку P1, а потом и ко всей матрице(матрице проекции, т.е холсту)
[/quote]

Попробовал в вышеприведенном примере добавить в Opengl_render() так:
Код: Выделить всё
function OpenGL_Render() : boolean;
var
   i, j : real;
begin
    glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
   
    { draw here }
   
    glClear( GL_COLOR_BUFFER_BIT );
   glLoadIdentity();
   
//////////////////////////////////////////////////
   // Масштабируем относительно "центра" экрана, условно точка (600, 400) 
   glTranslatef(600, 400, 0.0);
   glScalef(zoom, zoom, 0.0);
   glTranslatef(wx, wy, 0.0);  // wx, wy = 0
////////////////////////////////////   

   glColor3f(1.0, 1.0, 1.0);
   glBegin(GL_LINE_LOOP);
      glVertex2f(1.0, 1.0);
      glVertex2f(1.0, h-1);
      glVertex2f(w-1, h-1);
      glVertex2f(w-1, 1.0);
   glEnd();
   
   i := 0;
   j := 0;
   glColor3f(0.5, 0.5, 0.5);
   glBegin(GL_POINTS);
      while i < 1200 do begin
         while j < 800 do begin
            glVertex2f(i, j);
            j := j + 20;
         end;
         j := 0;
         i := i + 20;
      end;
   glEnd();

    swapBuffers( dcWindow );   // put opengl stuff to screen
    result := true;
end;

Т.е я сдвигаю начало координат в точку, относительно которо хочу смашстабировать, масштабрую и затем двигаю систему координат назад, но получается какая-то лажа, начало координат холста переносится в центр экрана, в как раз ту самую точку 600, 400 хотя вроде как должно вернуться назад, в точку 0,0 после масштабирования (


P.S. Уж извините за кучу вопросов, просто хочу понять :?
xterro
постоялец
 
Сообщения: 148
Зарегистрирован: 23.02.2014 13:49:33

Re: (WINAPI OpenGL) Почему не удаётся использовать writeln?

Сообщение zub » 23.12.2015 10:21:47

Код: Выделить всё
   //////////////////////////////////////////////////
      // Масштабируем относительно "центра" экрана, условно точка (600, 400)
      glTranslatef(600, 400, 0.0);
      glScalef(zoom, zoom, 0.0);
      glTranslatef(-600, -400, 0.0);  // wx, wy = 0
   ////////////////////////////////////

разве не то что вы хотите?

Но гораздо лучше разделить модель и камеру и данные преобразования выполнять с камерой, а не моделью
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: (WINAPI OpenGL) Почему не удаётся использовать writeln?

Сообщение xterro » 23.12.2015 11:56:41

Сейчас работает, только почему -600, -400, ведь начало координат, условно в точке 0,0? или кажется понял, glTranslatef() сдвигает не в точку с координатами, а на определенную величину(по x, y и z), почему то считал, что переносит именно в определенную точку. Так вроде и так по сути с камерой работаю, т.е масштабирую сам холст, применяю к матрице проекции преобразование, разве не то?
xterro
постоялец
 
Сообщения: 148
Зарегистрирован: 23.02.2014 13:49:33

Re: (WINAPI OpenGL) Почему не удаётся использовать writeln?

Сообщение zub » 23.12.2015 12:29:15

>>почему то считал, что переносит именно в определенную точку
переносит точку в начало координат или начало координат в точку - это всё слова про одно и тоже, факт в том что мы двигаем систему координат.

>>Так вроде и так по сути с камерой работаю, т.е масштабирую сам холст, применяю к матрице проекции преобразование, разве не то?
разделение рамера\модель довольно условно. можно двигать одно а считать что двигается другое))
Но это разделение удобно. Все операции по настройке вида - с сатрицей проекции. операции с моделью с матрицей модели (например при отрисовке букв или блоков какихнибудь).
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Пред.

Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 18

Рейтинг@Mail.ru