放大鼠标,考虑相机移动?(OpenGL)

4
这里是我的问题,我有一个刻度点,它是未投影的鼠标位置。我还有一个“相机”,基本上通过X和Y平移所有对象。我想做的是实现缩放到鼠标位置。
我尝试了以下方法:
   1. Find the mouse's x and y coordinates 
   2. Translate by (x,y,0) to put the origin at those coordinates
   3. Scale by your desired vector (i,j,k)
   4. Translate by (-x,-y,0) to put the origin back at the top left

但这并没有考虑相机的翻译问题。请问我该如何正确处理?谢谢。
glTranslatef(controls.MainGlFrame.GetCameraX(),
    controls.MainGlFrame.GetCameraY(),0);
glTranslatef(current.ScalePoint.x,current.ScalePoint.y,0);

glScalef(current.ScaleFactor,current.ScaleFactor,0);
glTranslatef(-current.ScalePoint.x,-current.ScalePoint.y,0);

我可能理解/理解错了,但是你是否尝试将z轴平移以放大所需的向量,而不是按(i,j,k)对其进行缩放? - thyrgle
需要更多信息和清晰度。也许需要源代码?“2. Translate by...”是指投影视图矩阵变换吗?这种方式不考虑相机的平移是什么意思?我猜这是一个二维正交视图,对吗? - Detmar
@thyrgle:"将Z轴转换为缩放?"在透视投影中,通过改变相机的视场来实现缩放。而不是通过沿Z轴移动。 - SigTerm
1个回答

4

不要使用glTranslate来移动所有对象,你应该尝试使用glOrtho。它的参数是想要的左侧坐标、右侧坐标、底部坐标、顶部坐标和最小/最大深度。

例如,如果你调用glOrtho(-5, 5, -2, 2, ...);你的屏幕将显示所有坐标在从(-5,2)到(5,-2)的矩形内的点。优点是可以轻松调整缩放级别。

如果你没有乘以任何视图/投影矩阵(我假设是这种情况),默认的屏幕坐标范围从(-1,1)到(1,-1)。

但在你的项目中,控制相机可能非常有用。在绘制任何对象之前调用这个函数而不是你的glTranslate:

float left = cameraX - zoomLevel * 2;
float right = cameraX + zoomLevel * 2;
float top = cameraY + zoomLevel * 2;
float bottom = cameraY - zoomLevel * 2;
glOrtho(left, right, bottom, top, -1.f, 1.f);

请注意,cameraX和cameraY现在代表屏幕的中心。
现在当您在一个点上缩放时,您只需要像这样做:
cameraX += (cameraX - screenX) * 0.5f;
cameraY += (cameraY - screenY) * 0.5f;
zoomLevel += 0.5f;

1
glOrtho创建正交投影而不是透视投影。这在某些情况下是可取的(例如2D平铺游戏),而在其他情况下则不可取(例如FPS)。无论如何,移动相机而不是所有对象是正确的方法。 - Tobias Langner

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