Мое приложение - приложение для векторного рисования.Работает с 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 по существу делает это