Увеличение положения мыши в OpenGl - PullRequest
4 голосов
/ 02 ноября 2010

Я хочу реализовать алгоритм zoom-to-mouse-position-with-scrollwheel для приложения CAD, над которым я работаю.

Аналогичный вопрос был задан ( Этот дляпример), но во всех найденных мною решениях использовался

  1. Перевести на оригинал
  2. Масштаб для увеличения
  3. Перевести обратно

,Хотя это работает в принципе, это приводит к отсечению объектов при высоком уровне масштабирования, поскольку они становятся больше, чем объем просмотра.Более элегантным решением было бы изменить матрицу проекции для масштабирования.

Я пытался реализовать это, но получил только увеличение до центра окна.

 glGetIntegerv(GL_VIEWPORT, @fViewport);
 //convert window coordinates of the mouse to gl's coordinates
 zoomtoxgl := mouse.zoomtox;
 zoomtoygl := (fviewport[3] - (mouse.zoomtoy));
//set up projection matrix
 glMatrixMode(GL_PROJECTION);
 glLoadidentiy;
 left   := -width  / 2 * scale;
 right  :=  width  / 2 * scale;
 top    :=  height / 2 * scale;
 bottom := -height / 2 * scale;
 glOrtho(left, right, bottom, top, near, far);

Myвопросы: возможно ли выполнить масштабирование произвольной точки, используя только матрицу проекции в ортографическом виде, и если да, то как можно увеличить положение цели масштабирования в матрице проекции?

Обновление Я изменил свой код на

zoomtoxgl := camera.zoomtox;
zoomtoygl := (fviewport[3] - camera.zoomtoy);
dx := zoomtoxgl-width/2;
dy := zoomtoygl-height/2;
a := width  * 0.5 * scale;
b := width  * 0.5 * scale;
c := height * 0.5 * scale;
d := height * 0.5 * scale;

left   := - a - dx * scale;
right  := +b - dx * scale;
bottom := -c - dy * scale;
top    :=  d - dy * scale;
glOrtho(left, right, bottom, top, -10000.5, Camera.viewdepth);

, который дал такой результат:

Zooming issues

Вместо масштабированиявокруг позиции курсора, я могу знать, сместить происхождение мира в любом месте экрана, я хочу.Приятно иметь, но не то, что я хочу.

Поскольку я застрял в этом довольно давно, я задаюсь вопросом: можно ли создать масштаб относительно произвольной позиции экрана, просто изменив матрицу проекции?Или мне все-таки придется изменить свою матрицу Modelview?

1 Ответ

1 голос
/ 03 ноября 2010

Как насчет изменения ваших значений для левого / правого / верхнего / нижнего, чтобы отразить, где находится мышь?

Что-то вроде:

 left   := zoomtoxgl - width  / 2 * scale;
 right  := zoomtoxgl + width  / 2 * scale;
 top    := zoomtoygl + height / 2 * scale;
 bottom := zoomtoygl - height / 2 * scale;
 glOrtho(left, right, bottom, top, near, far);

Возможно, вам придется настроить масштабдля этого использования.

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

...