2013-04-24 2 views
0

Мне нужно, чтобы вспыхнуть два объекта 2d на определенной частоте. Я использую для этого OpenGL (glut) и C++ в Visual C++ Express Edition. ОС - Windows XP Sp3, 32 бит.Как мигать (щелкнуть) 2-й объект с определенной частотой в opengl

Я думаю, что я успешно реализовал основное приложение, но не могу понять, как создавать флэш-объекты на определенной частоте. У вас есть предложения для меня? Код, который я сделал, это.

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:[email protected]"); 
    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. У меня нет типа ошибки.

Возможно, это неверно, мерцающая логика?

+0

'whiteSquare,' Что это? –

+0

Что-то вроде: нарисуйте белый квадрат. – lezan

ответ

0

Сделайте i глобальную переменную (или сделайте ее статической локальной) и поместите ваш мигающий код (последний фрагмент кода) в функцию отображения.

Включить двойную буферизацию glutInitDisplayMode(… | GLUT_DOUBLE) и заменить glFlush() на дисплей с glutSwapBuffers().

Присмерьте i в конце дисплея.

glutPostRedisplay Регистрация в GLUT ожидания функции, то есть в вашей main функции перед вызовом glutMainLoop()

glutIdleFunc(glutPostRedisplay); 
+0

Нравится это в главной функции? 'glutDisplayFunc (дисплей),' ' glutIdleFunction (glutPostRedisplay),' ' glutMainLoop();' Visual C++ Экспресс возвращает ошибку: 'ошибка C3861:«glutIdleFunction'' – lezan

+0

@lezan: К сожалению, я написал (мышцы память) слово «Функция» в «glutIdleFunc», которое усекает слово «Функция». См. Редактирование ответа. – datenwolf

+0

Я пробовал с 'glutIdleFunc', когда я не нашел функцию' glutIdleFunction', но также с 'glutIdleFunc', я получаю ошибку:' error C2664'. Я пытаюсь найти какой-либо ввод из Google, но ничего до сих пор. Некоторые советы? – lezan

0

Если это будет определенная частота, вам необходимо щелкнуть по времени.

+0

Итак, мой фрагмент кода не работает? – lezan

+0

@lezan: вместо увеличения 'i' на основе номера кадра вы увеличиваете его на основе измерения времени. – datenwolf

+0

@ datenwolf: okei, я работаю, чтобы исправить это. Я использую QueryPerformanceFrequency и QueryPerformaneCounter для синхронизации, потому что мне нужно точное время. – lezan