You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 06:06:02