我希望为我所在的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);
我的问题是:在正交视图中,仅使用投影矩阵是否可以对任意点进行缩放?如果可以,如何将缩放目标位置纳入投影矩阵中? 更新: 我已更改代码为
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);
这是它所得到的结果:
我不想实现围绕光标位置进行缩放,而是希望将世界原点移动到任何屏幕位置。虽然这很好,但不是我想要的。
由于我已经被卡住了相当长的时间,我想知道:是否可以通过修改投影矩阵来生成相对于任意屏幕位置的缩放?还是说我必须修改我的模型视图矩阵?