0

我的应用程序是矢量绘图应用程序。它适用于 OpenGL。我将对其进行修改以使用 Cairo 2D 图形库。问题在于缩放。使用 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。这使我可以平移和放大。鉴于 Cairo 只能基于坐标进行绘制,我如何才能在不使用变换的情况下正确缩放和平移顶点。基本上 GlOrtho 通常会设置视口,但我认为我不能在 Cairo 上做到这一点。

好吧,GlOrtho 能够更改视口矩阵而不是修改顶点,但是我怎样才能修改顶点以获得相同的结果呢?

谢谢

*给定从 ScreenToWorld 获得的顶点 P,我该如何修改它以便根据相机和比例因子对其进行缩放和平移?因为通常 OpenGL 基本上会这样做

4

1 回答 1

0

我认为开罗可以做你想做的……见http://cairographics.org/matrix_transform/。这是否解决了您的问题,如果没有,为什么?

于 2010-08-28T02:16:27.770 回答