【发布时间】:2021-08-16 12:13:34
【问题描述】:
我想知道如何在 OpenGL 中制作一个表示高度增加/减少的矩形的动画。我知道我应该使用 glScale 和 glTranslate 函数。
下面,我将附上到目前为止我使用过的代码,其中我设法应用了一个非常基本的矩形过渡。
#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <stdlib.h>
static GLfloat trans = 0.0;
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);
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 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(transLeft);
break;
case GLUT_RIGHT_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;
}
【问题讨论】:
-
要么将
glRect中的硬编码坐标更改为变量,要么将glScalef(zoom,zoom,1.0)放在您的显示函数中glTranslate之后或之前(取决于您想要实现的目标),请注意可能需要更改转换值(乘以或除以zoom),其中zoom=1.0是可变的以更改大小...通过zoom*=1.025或zoom/=1.025更新它以获取inc/dec 大小...在某些键盘上点击或鼠标滚轮或其他... -
一段代码或类似的东西不会伤害我或任何东西,但如果你没有时间或者只是不想这样做,那也没关系。我仍然无法让它工作,我想如果你能发布一个实际的代码行,我会更好地理解。
-
@EmanuelComan 其实评论
glScalef(zoom,zoom,1.0)中有一行代码。您可以为 x 和 y 使用单独的比例:glScalef(zoom_x, zoom_x,1.0)。按时间更改zoom_x和zoom_y。尝试 [0.5, 1.5] 范围内的值。 -
是的,我知道,但我试过了,但还是不行,我想知道除了这个命令之外我是否应该添加其他任何东西。此外,我不确定我应该将该命令放在我的代码中的什么位置。
-
@EmanuelComan 你必须在
glTranslatef之后添加glScale
标签: c animation opengl glut opengl-compat