gpt4 book ai didi

c++ - 使用 OpenGL 固定函数旋转和平移二维图像

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:45:57 25 4
gpt4 key购买 nike

我的代码在 2D 四边形上绘制纹理,应该对其进行平移、旋转和缩放:

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 度(图像在平移时向相反方向移动),我会得到倒置的自上而下平移。

最佳答案

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

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

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

如果要围绕特定点旋转,则必须使用相对于该点的坐标。这很简单,只需减去实体坐标的中心点坐标,进行旋转并将中心坐标添加到新位置即可。这很重要,因为你是相对于另一个点而不是中心,这就是 vector 的工作原理。

关于c++ - 使用 OpenGL 固定函数旋转和平移二维图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38483167/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com