2013-09-09 1 views
0

Я пытаюсь повернуть 3D-объект, но он не обновляется при применении преобразований в цикле for.3d object wont update in for loop

Объект прыгает в последнюю позицию.

Как обновить позицию 3D-объекта в последовательности обновлений, если оно не будет обновляться в цикле for?

ответ

0

Просто вызов glTranslate, glRotate или подобное не изменит ситуацию на экране. Зачем? Поскольку OpenGL - это простой API рисования, а не граф сцены. Все, что он знает, это точки, линии и треугольники, которые обращаются к пиксельной фреймбуферу. Вот и все. Вы хотите что-то изменить на экране, вы должны изменить его, т. Е. Очистить изображение и нарисовать его снова, с изменениями.

BTW: Вы не должны использовать выделенный цикл для реализации анимаций (ни для, ни во время, ни для пока). Вместо этого выполните анимацию в обработчике простоя и выполните событие перерисовывания.

+0

Я использую параметры обновления GLKit.I и GLKQuaternion, я не получаю никаких видимых обновлений на экране, даже несмотря на то, что вызывается делегат обновления. Обновления происходят в touchsMoved, когда я использую один и тот же код и пытаюсь выполнить цикл, используя разницу между предыдущимTouch и lastTouch в touchesEnded, я не вижу вращения на изображении, даже если в журналах отображаются новые позиции и значения вращения. Может ли цикл блокировать метод обновления? Я хотел бы сделать последнее вращение в touchhesMoved и применить его к методу touchesEnded, чтобы заставить объект вращаться после того, как пользователь запустил. – jarryd

0

Я считаю, что вы неправильно понимаете, что делает OpenGL для вас. Попробую обрисовать:

- Send vertex data to the GPU (once) 
     (this does only specify the (standard) shape of the object) 

- Create matrices to rotate, translate or transform the object (per update) 
- Send the matrices to the shader (per update) 
     (The shader then calculates the screen position using the original 
     vertex position and the transformation matrix) 
- Tell OpenGL to draw the bound vertices (per update) 

Представьте программирование с OpenGL, как быть веб-клиент - только с указанием запроса (изменение матрицы и связывание материала) не достаточно, вы должны явно отправить запрос (отправить данные преобразования и указать OpenGL для рисования), чтобы получить ответ (с объектами на экране.)

0

Можно нарисовать анимацию из цикла.

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(); 
}