如何在OpenGL中使用glScale、glTranslate实现矩形高度增减动画
OpenGL矩形高度增减动画实现方案
要实现矩形高度单向增减效果(默认glScalef会沿矩形中心向上下双向拉伸,不符合底部固定、仅顶部伸缩的需求),需要配合位移调整变换锚点,具体修改如下:
核心修改步骤
- 新增全局变量
scaleY存储Y轴缩放系数,初始值为1对应原始高度 - 调整
display函数中的矩阵变换顺序,先将矩形底部对齐到变换原点再执行缩放,保证缩放过程中底部位置固定 - 新增高度调整回调函数,绑定到对应输入事件即可
完整可运行代码
#include <windows.h> #include <GL/gl.h> #include <GL/glu.h> #include <GL/glut.h> #include <stdlib.h> static GLfloat trans = 0.0; // 新增Y轴缩放系数变量 static GLfloat scaleY = 1.0f; void init(void) { glClearColor(0.2, 0.2, 0.2, 0.2); glShadeModel(GL_FLAT); } void display(void) { glClear(GL_COLOR_BUFFER_BIT); glPushMatrix(); // 先执行整体位移 glTranslatef(0.0 , trans, 1.0); // 缩放后将矩形移回原位 glTranslatef(0.0, 25.0, 0.0); // 仅Y轴缩放 glScalef(1.0, scaleY, 1.0); // 先将矩形下移25单位,让底部对齐变换原点 glTranslatef(0.0, -25.0, 0.0); glColor3f(1.0, 1.0, 1.0); glRectf(-25.0, -25.0, 25.0, 25.0); glPopMatrix(); glColor3f(0.0, 0.0, 1.0); glRectf(-15.0, -15.0, 15.0, 15.0); glutSwapBuffers(); } // 高度降低回调 void scaleDown(void) { scaleY -= 0.01f; if (scaleY < 0.1f) scaleY = 0.1f; glutPostRedisplay(); } // 高度升高回调 void scaleUp(void) { scaleY += 0.01f; if (scaleY > 3.0f) scaleY = 3.0f; glutPostRedisplay(); } void transLeft(void) { trans = trans - 0.05; if (trans < -75) trans = -75; glutPostRedisplay(); } void transRight(void) { trans = trans + 0.05; if (trans > 75) trans = 75; glutPostRedisplay(); } void reshape(int w, int h) { glViewport(0, 0, (GLsizei)w, (GLsizei)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-100.0, 100.0, -100.0, 100.0, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void mouse(int button, int state, int x, int y) { switch (button) { // 鼠标左键控制高度降低 case GLUT_LEFT_BUTTON: if (state == GLUT_DOWN) glutIdleFunc(scaleDown); break; // 鼠标右键控制高度升高 case GLUT_RIGHT_BUTTON: if (state == GLUT_DOWN) glutIdleFunc(scaleUp); break; // 鼠标中键控制向上位移 case GLUT_MIDDLE_BUTTON: if (state == GLUT_DOWN) glutIdleFunc(transRight); break; default: break; } } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize(500, 500); glutInitWindowPosition(100, 100); glutCreateWindow(argv[0]); init(); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMouseFunc(mouse); glutMainLoop(); return 0; }
关键说明
- 变换顺序逻辑:OpenGL矩阵变换为逆序执行,上述代码的变换实际执行顺序为:矩形下移对齐原点→Y轴缩放→矩形复位→整体位移,保证缩放时仅矩形顶部上下移动,底部位置固定,符合高度增减的视觉效果。
- 输入绑定可自定义:当前代码绑定左键降高度、右键升高度、中键控制上移,你可以根据自己的需求调整输入事件和回调函数的绑定关系,也可以调整缩放速度、上下限参数。
内容的提问来源于stack exchange,提问作者Emanuel Coman
相关产品推荐
相关产品推荐

