使用opengl和c ++使用动画(在一定间隔后一个接一个)翻译三角形
Posted
技术标签:
【中文标题】使用opengl和c ++使用动画(在一定间隔后一个接一个)翻译三角形【英文标题】:Translate a triangle using animation(one by one after some interval) with opengl and c++ 【发布时间】:2014-08-28 16:22:32 【问题描述】:我想用opengl制作一个太空入侵者游戏。所以我想用三角形来创造敌人。在制作游戏之前,我想尝试一下我的动画制作。我有三角。我想用动画把它翻译到左边的某个点(即,三角形在一段时间后被翻译。它应该看起来好像在移动)。到达左边的某个点后,我想把它翻译回原来的样子正确的位置或一些距离。该过程应该一直持续到屏幕打开。我使用了睡眠功能。但它不起作用。没有显示动画。只有平移的三角形被绘制在不同的平移位置。帮帮我。
这是我的代码-
#include "windows.h"
#include <gl/glut.h>
#include<stdio.h>
void init( void )
printf( "OpenGL version: %s\n", (char*)glGetString(GL_VERSION));
printf( "OpenGL renderer: %s\n", (char*)glGetString(GL_RENDERER));
//Configure basic OpenGL settings
glClearColor(1.0, 1.0, 0.0, 0.0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0,640.0,0.0,480.0);
glColor3f(1.0,0.0,0.0);
glPointSize(3);
void house(int x, int y,int z)
glPushMatrix();
glTranslatef(x, y,z);
glBegin (GL_LINES);
glVertex2i (0,30);
glVertex2i (15,60);
glVertex2i (15,60);
glVertex2i (30,30);
glVertex2i (30,30);
glVertex2i (0,30);
glEnd();
//Sleep(200);
glPopMatrix();
//glutSwapBuffers();
// Main drawing routine. Called repeatedly by GLUT's main loop
void display( void )
//Clear the screen and set our initial view matrix
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
int i;
for(i = 10; i < 350; i = i + 50)
house(i,20,0);
Sleep(200);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glFlush();
// Entry point - GLUT setup and initialization
int main( int argc, char** argv )
glutInit( &argc, argv );
glutInitDisplayMode (GLUT_DEPTH | GLUT_SINGLE| GLUT_RGB);
glutInitWindowSize (800, 600);
glutInitWindowPosition (100, 100);
glutCreateWindow( "OpenGL Test" );
glutDisplayFunc( display );
init();
glutMainLoop();
return 0;
【问题讨论】:
【参考方案1】:在main()
中,您已将display()
声明为display callback function。 GLUT 将在确定窗口需要重绘或被告知要重绘时调用此函数,例如通过函数glutPostRedisplay()
。
显示函数预计会在特定时间点调用重绘窗口。 glFlush()
将强制执行 GL 命令。
问题是您的动画循环在重绘函数内,最后调用glFlush()
,立即显示结果。而且您不会告诉 GLUT 重新绘制窗口。这就是你看不到动画的原因。
出于本教程的目的,我建议您为房屋图的初始位置定义一个全局变量。当然,一旦您了解了这一切是如何工作的,您就必须尽快改进它。
static int pos = 10; // temporary work around, just for the demo
然后定义一个定时器函数,在一个时间间隔后被调用。这将是您动画的核心,通过调用glutPostRedisplay()
来组织窗口的移动和重绘:
void timerfunc(int value) // handle animation
pos += 50; // update the postion
if (pos<350) // as in your originial loop
glutTimerFunc(200, timerfunc, 0); // plan next occurence
glutPostRedisplay(); // redraw the window
Activate your timer function,在启动 glutMainLoop()
之前在 main()
:
glutTimerFunc(200, timerfunc, 0); // call a timer function
glutMainLoop(); // this call is already in your code
然后你的显示函数可以改成:
void display(void)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
house(pos, 20, 0); // draw the house at its last calculated position
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glFlush();
然后它以动画方式工作!
【讨论】:
你能给我一些算法或代码吗?这也是针对一个三角形的。我将如何翻译三角形数组? 谢谢....我会看到的。如果我有一个三角形瓷砖,即三角形排列为瓷砖(使用视口和世界窗口),那么我将如何移动这些瓷砖向左移动就像太空入侵者中的敌人一样写作。你能给我一些提示吗?以上是关于使用opengl和c ++使用动画(在一定间隔后一个接一个)翻译三角形的主要内容,如果未能解决你的问题,请参考以下文章
在 3D 中查找 X、Y 和 Z 轴的角度 - OpenGL/C++
在带有openGL和SDL的Linux上使用c ++时出现SIGSEGV错误
无法使用 GLEW (mac,c++) 在 openGL 中绘制任何内容