Увеличиваете масштаб мыши, учитывает перевод камеры?(OpenGL) - PullRequest
4 голосов
/ 20 июля 2010

Вот моя проблема, у меня есть точка шкалы, которая является непроецированной позицией мыши.У меня также есть «камера, которая в основном переводит все объекты по 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 Ответ

3 голосов
/ 20 июля 2010

Вместо того, чтобы использовать 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...