如何在opengl中以特定频率闪烁(轻弹)2d对象
Posted
技术标签:
【中文标题】如何在opengl中以特定频率闪烁(轻弹)2d对象【英文标题】:How to flash (flick) a 2d object at a certain frequency in opengl 【发布时间】:2013-04-24 11:54:57 【问题描述】:我需要以特定频率闪烁两个 2d 对象。我在 Visual C++ Express Edition 中使用这个 OpenGL (glut) 和 C++。操作系统是 Windows XP Sp3,32 位。
我认为我已经成功实现了基本应用程序,但是我无法弄清楚如何以一定的频率制作 flash 对象。你对我有什么建议吗?我做的代码是这样的。
void display(void)
glClear( GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);
glColor3f(0.0, 0.0, 0.0);
glVertex3f(140.0, 250.0+300.0, 0.0); //bottom left corner
glVertex3f(140.0+300.0, 250.0+300.0, 0.0); //bottom right corner
glVertex3f(140.0+300.0, 250.0, 0.0); //top right corner
glVertex3f(140.0, 250.0, 0.0);
glEnd();
glBegin(GL_POLYGON);
glColor3f(1.0, 1.0, 1.0);
glVertex3f(640.0+200.0, 250.0+300.0, 0.0); //bottom left corner
glVertex3f(640.0+200.0+300.0, 250.0+300.0, 0.0); //bottom right corner
glVertex3f(640.0+200.0+300.0, 250.0, 0.0); //top right corner
glVertex3f(640.0+200.0, 250.0, 0.0);
glEnd();
glFlush();
int main(int argc, char **argv)
glutInit(&argc, argv);
glutInitDisplayMode ( GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowPosition(0,0);
glutInitWindowSize(1280,800);
glutGameModeString("1280x800:32@60");
glutEnterGameMode();
glutSetWindowTitle("OpenGL SSVEP stimulator");
glDisable(GL_DEPTH_TEST);
glClearColor(0.0, 0.0, 0.0, 0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0,1280,800,0.0,0.0,1.0);
glutDisplayFunc(display);
glutMainLoop();
return 0;
为了闪现,我想到了这样的东西(伪代码):
int leftFrequency=12;
int rightFrequency=20;
int i=0;
while(running)
if(i%leftFrequency)
blackSquare;
else
whiteSquare;
if(i%rightFrequency)
blackSquare;
else
whiteSquare;
但我不知道把这段代码放在哪里。在 display() 函数中可能吗?我在哪里可以增加 i 变量?我试图将所有内容都放在 display() 函数中,但是两个方块不闪烁。 i 变量增加到 3。我没有错误类型。
也许是闪烁的逻辑不对?
【问题讨论】:
whiteSquare;
那是什么?
类似:画一个白色方块。
【参考方案1】:
将i
设为全局变量(或设为静态局部变量)并将您的闪烁代码(最后一个代码sn-p)放入显示函数中。
启用双缓冲glutInitDisplayMode(… | GLUT_DOUBLE)
并将显示中的glFlush()
替换为glutSwapBuffers()
。
在显示末尾添加i
的增量。
将glutPostRedisplay
注册为GLUT空闲函数,即在调用glutMainLoop()
之前在你的main
函数中
glutIdleFunc(glutPostRedisplay);
【讨论】:
在主函数中这样?glutDisplayFunc(display);
glutIdleFunction(glutPostRedisplay);
glutMainLoop();
Visual C++ Express 返回错误:error C3861: 'glutIdleFunction'
@lezan:对不起,我在glutIdleFunc
中写出了(肌肉记忆)“功能”这个词,它截断了“功能”这个词。请参阅我的答案编辑。
当我没有找到函数glutIdleFunction
时,我曾尝试使用glutIdleFunc
,但也使用glutIdleFunc
我得到一个错误:error C2664
。我正在尝试从谷歌搜索一些输入,但直到现在什么都没有。一些提示?
使用glutIdleFunct(idle);
,其中idle
是void idle() glutPostRedisplay();
项目编译没有错误。这可能是解决方案吗?
@lezan:你可以完美地做到这一点。【参考方案2】:
如果是一定的频率,那么你需要根据时间轻弹。
【讨论】:
@lezan:不是根据帧号增加i
,而是根据时间测量增加它。
@datenwolf:okei,我正在努力修复它。我正在使用 QueryPerformanceFrequency 和 QueryPerformaneCounter 进行计时,因为我需要准确的计时。
@lezan:我所说的基于时间测量值递增的意思是,每次您的时间测量值累积到与单个i
对应的值时,您都应该递增i
。
@datenwolf:对不起,但我不认为我完全理解你的意思。我想做的是这样的:pastebin.com/8BUGbtyK 但它不起作用。以上是关于如何在opengl中以特定频率闪烁(轻弹)2d对象的主要内容,如果未能解决你的问题,请参考以下文章
css 闪烁板 - 附加动画。这是一个CSS,当图层变为活动状态时,轻弹标题淡入和下拉。你会需要
如何在我自己的自定义视图中重现 iPhone UIScrollView 的轻弹滚动行为?