放大鼠标,考虑相机翻译? (OpenGL的)

时间:2010-07-20 02:51:36

标签: c++ c opengl

这是我的问题,我有一个刻度点,即未投影的鼠标位置。我还有一个“相机,它基本上可以通过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);

1 个答案:

答案 0 :(得分:3)

您应该尝试glOrtho,而不是使用glTranslate移动所有对象。它需要所需的左坐标,右坐标,底部坐标,顶部坐标和最小/最大深度作为参数。

例如,如果你调用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;