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