Преобразование вершин с центральной точкой и масштабным коэффициентом? - PullRequest
0 голосов
/ 28 августа 2010

Мое приложение - приложение для векторного рисования.Работает с OpenGL.Я буду изменять его, чтобы вместо этого использовать 2D-графическую библиотеку Cairo.Проблема с масштабированием.С камерой openGL и коэффициентом масштабирования работа выглядит следующим образом:

 float scalediv = Current_Scene().camera.ScaleFactor / 2.0f;
 float cameraX = GetCameraX();
 float cameraY = GetCameraY();
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();

 float left = cameraX - ((float)controls.MainGlFrame.Dimensions.x) * scalediv;
 float right = cameraX + ((float)controls.MainGlFrame.Dimensions.x) * scalediv;
 float bottom = cameraY - ((float)controls.MainGlFrame.Dimensions.y) * scalediv;
 float top = cameraY + ((float)controls.MainGlFrame.Dimensions.y) * scalediv;

 glOrtho(left,
  right,
  bottom, 
  top,
  -0.01f,0.01f);

 // Set the model matrix as the current matrix
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();

 hdc = BeginPaint(controls.MainGlContext.mhWnd,&ps);

Положение мыши получается следующим образом:

 POINT _mouse = controls.MainGlFrame.GetMousePos();
vector2f mouse = functions.ScreenToWorld(_mouse.x,_mouse.y,GetCameraX(),GetCameraY(),
             Current_Scene().camera.ScaleFactor,
            controls.MainGlFrame.Dimensions.x,
            controls.MainGlFrame.Dimensions.y );

vector2f CGlEngineFunctions::ScreenToWorld(int x, int y, float camx, float camy, float scale, int width, int height)
{
 // Move the given point to the origin, multiply by the zoom factor and
 // add the model coordinates of the center point (camera position)
 vector2f p;


 p.x =  (float)(x - width / 2.0f) * scale +
  camx;

 p.y = -(float)(y - height / 2.0f) * scale +
  camy;

 return p;
}

Оттуда я рисую VBO треугольников.Это позволяет мне панорамировать и увеличивать масштаб. Учитывая, что Каир может рисовать только на основе координат, как я могу сделать так, чтобы вершина правильно масштабировалась и панорамировалась без использования преобразований.В основном GlOrtho обычно устанавливает область просмотра, но я не думаю, что смогу сделать это с Cairo.

Ну, GlOrtho может изменять матрицу области просмотра вместо изменения вершин, но как я могу вместо этого изменить вершины, чтобы получить тот же результат??

Спасибо

* С учетом вершины P, полученной из ScreenToWorld, как я могу изменить ее так, чтобы она масштабировалась и панорамировалась в соответствии с камерой и масштабным коэффициентом?Потому что обычно OpenGL по существу делает это

1 Ответ

0 голосов
/ 28 августа 2010

Я думаю, что Каир может делать то, что вы хотите ... см. http://cairographics.org/matrix_transform/. Решает ли это вашу проблему, и если нет, то почему?

...