Можно нарисовать анимацию из цикла.
for (...) {
edit_transformation();
draw();
glFlush(); // maybe glutSwapBuffers() if you use GLUT
usleep(100); // not standard C, bad
}
Вы рисуете, вы вровень/подкачки, чтобы убедиться, что вы только что нарисовали отправляется на экран, и вы спите.
Однако не рекомендуется для этого в интерактивном приложении. Основная причина заключается в том, что пока вы находитесь в этом цикле, больше ничего не может запустить. Ваша заявка будет неактуальной.
Именно поэтому оконные системы основаны на событиях. Каждые несколько миллисекунд оконная система использует ваше приложение, чтобы вы могли обновить свое состояние, например, сделать анимацию. Это в режиме ожидания. Когда состояние вашей программы изменилось, вы сообщите системе окон, что вы хотите снова рисовать. Затем в оконную систему вызывается функция отображения . Вы выполняете вызовы OpenGL, когда система сообщает об этом.
Если вы используете GLUT для связи с оконной системой, это выглядит как код ниже. Другие библиотеки like GLFW имеют эквивалентные функции.
int main() {
... // Create window, set everything up.
glutIdleFunc(update); // Register idle function
glutDisplayFunc(display); // Register display function
glutMainLoop(); // The window system is in charge from here on.
}
void update() {
edit_transformation(); // Update your models
glutPostRedisplay(); // Tell the window system that something changed.
}
void display() {
draw(); // Your OpenGL code here.
glFlush(); // or glutSwapBuffers();
}
Я использую параметры обновления GLKit.I и GLKQuaternion, я не получаю никаких видимых обновлений на экране, даже несмотря на то, что вызывается делегат обновления. Обновления происходят в touchsMoved, когда я использую один и тот же код и пытаюсь выполнить цикл, используя разницу между предыдущимTouch и lastTouch в touchesEnded, я не вижу вращения на изображении, даже если в журналах отображаются новые позиции и значения вращения. Может ли цикл блокировать метод обновления? Я хотел бы сделать последнее вращение в touchhesMoved и применить его к методу touchesEnded, чтобы заставить объект вращаться после того, как пользователь запустил. – jarryd