如何在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);,其中idlevoid idle() glutPostRedisplay(); 项目编译没有错误。这可能是解决方案吗? @lezan:你可以完美地做到这一点。【参考方案2】:

如果是一定的频率,那么你需要根据时间轻弹。

【讨论】:

@lezan:不是根据帧号增加i,而是根据时间测量增加它。 @datenwolf:okei,我正在努力修复它。我正在使用 QueryPerformanceFrequency 和 QueryPerformaneCounter 进行计时,因为我需要准确的计时。 @lezan:我所说的基于时间测量值递增的意思是,每次您的时间测量值累积到与单个i 对应的值时,您都应该递增i @datenwolf:对不起,但我不认为我完全理解你的意思。我想做的是这样的:pastebin.com/8BUGbtyK 但它不起作用。

以上是关于如何在opengl中以特定频率闪烁(轻弹)2d对象的主要内容,如果未能解决你的问题,请参考以下文章

css 闪烁板 - 附加动画。这是一个CSS,当图层变为活动状态时,轻弹标题淡入和下拉。你会需要

如何在我自己的自定义视图中重现 iPhone UIScrollView 的轻弹滚动行为?

Img“轻弹”列数

使用 OpenGL,如何正确使用 gluOrtho2D 和默认投影?

OpenGL 2D纹理单元&纹理翻转解决策略

如何让我的随机移动对象在pygame中以特定角度移动