在OpenGl中根据鼠标位置进行缩放

5
我希望为我所在的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);

我的问题是:在正交视图中,仅使用投影矩阵是否可以对任意点进行缩放?如果可以,如何将缩放目标位置纳入投影矩阵中? 更新: 我已更改代码为
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);

这是它所得到的结果:

缩放问题

我不想实现围绕光标位置进行缩放,而是希望将世界原点移动到任何屏幕位置。虽然这很好,但不是我想要的。

由于我已经被卡住了相当长的时间,我想知道:是否可以通过修改投影矩阵来生成相对于任意屏幕位置的缩放?还是说我必须修改我的模型视图矩阵?

1个回答

1

你考虑过根据鼠标位置改变left/right/top/bottom的值吗?

比如说:

 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 如何实现缩放操作?


谢谢你的想法。我一直在玩弄鼠标坐标和比例,但到目前为止我最好的做法是将我的场景原点(世界坐标中的0,0,0)移动到鼠标位置。我会尝试你的建议,因为我不确定是否尝试过那种变体。 - sum1stolemyname
我尝试过 - 这会导致类似的行为:场景原点会被移动到鼠标位置。 - sum1stolemyname
@sum1,我不确定那是什么意思。你能发一张截图吗? - LarsH
@LarsH 是的,我认为您的答案会导致鼠标突然跳到所在位置。我们需要一个类似 Google 地图的解决方案。 - user585968
@MickyDuncan:(1)你是sum1stolemyname吗? 你们正在做同一个项目吗?我想知道你是否代表与OP相同的要求,还是其他不同的要求。(2)我认为你是想要一个动画(逐渐)缩放。对吗? - LarsH
@LarsH 1) 一个不同的人有相同的问题 2) 是的,没错,谢谢Lars - user585968

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接