使用 OpenGL 固定功能旋转和平移 2D 图像

Posted

技术标签:

【中文标题】使用 OpenGL 固定功能旋转和平移 2D 图像【英文标题】:Rotating and translating a 2D image with OpenGL fixed function 【发布时间】:2016-07-20 13:48:47 【问题描述】:

我的代码在二维四边形上绘制了一个纹理,该纹理应该被平移、旋转和缩放:

double width = ... //window width
double height = ... //window height
double imagewidth = ... 
double imageheight = ...
vec2 usertranslation = ... //additional translation in x,y direction from user input
double rot_angle = ... //rotation angle from user input

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, width, 0.0, height, 0.0, -1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

// translate to the top center of the image and add user input translation
double transx = (width - imagewidth) / 2 + usertranslation.x;
double transy = height - imageheight + usertranslation.y;
glTranslatef(transx, transy, 0);

//this currently rotates around the center of the image, but what I need
//is to rotate the image around the center of the window. 
glTranslatef(imagewidth / 2, imageheight / 2, 0);
glRotatef(rot_angle, 0, 0, 1.0);
glTranslatef(-imagewidth / 2, -imageheight / 2, 0);

//bind the texture and draw the quad
drawTexturedQuad(); 

现在我的问题是,我需要更改什么才能让图像始终围绕窗口的中心点旋转。我已经尝试过这样的旋转:

glTranslatef(imagewidth / 2, imageheight - usertranslation.y - height, 0);
glRotatef(rot_angle, 0, 0, 1.0);
glTranslatef(-imagewidth  / 2, -(imageheight - usertranslation.y - height), 0);

但是,如果图像旋转 180 度(图像在平移时沿相反方向移动),我会得到一个倒置的自上而下的平移。

【问题讨论】:

【参考方案1】:

要围绕屏幕中心 (0,0) 旋转,您可以根据以下等式更改实体的位置:

x = x * cos(角度) - y * sin(角度) y = x * sin(角度) - y * cos(角度)

其中 x 和 y 是实体的位置,angle 是旋转角度。如果您想在旋转后面对同一个点,例如旋转的中心,您还必须将实体围绕其中心旋转负角。这与旋转矩阵使用的相同,但是

如果要围绕特定点旋转,则必须使用相对于该点的坐标。这很容易,只需减去实体坐标的中心点坐标,进行旋转并将中心坐标添加到新位置。 这很重要,因为您相对于另一个点而不是中心,这就是向量的工作方式。

【讨论】:

以上是关于使用 OpenGL 固定功能旋转和平移 2D 图像的主要内容,如果未能解决你的问题,请参考以下文章

应用OpenCV进行图像旋转和平移

图片处理-opencv-3.图像缩放、旋转、翻转、平移

OpenGL 对象不转换为旋转轴

2D 中的 OpenGL 旋转

OpenGL 旋转 2D 纹理

OpenGL矩阵乘法C++