Я хочу реализовать алгоритм zoom-to-mouse-position-with-scrollwheel для приложения CAD, над которым я работаю.
Аналогичный вопрос был задан ( Этот дляпример), но во всех найденных мною решениях использовался
- Перевести на оригинал
- Масштаб для увеличения
- Перевести обратно
,Хотя это работает в принципе, это приводит к отсечению объектов при высоком уровне масштабирования, поскольку они становятся больше, чем объем просмотра.Более элегантным решением было бы изменить матрицу проекции для масштабирования.
Я пытался реализовать это, но получил только увеличение до центра окна.
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](https://i.stack.imgur.com/Y29F3.png)
Вместо масштабированиявокруг позиции курсора, я могу знать, сместить происхождение мира в любом месте экрана, я хочу.Приятно иметь, но не то, что я хочу.
Поскольку я застрял в этом довольно давно, я задаюсь вопросом: можно ли создать масштаб относительно произвольной позиции экрана, просто изменив матрицу проекции?Или мне все-таки придется изменить свою матрицу Modelview?