Я кодирую графическое приложение в Qt (4.8.2) (VS 2008), используя QGLWidget и, следовательно, OpenGL. Вот краткое описание приложения: Это симуляция физики. Он состоит из 2 нитей. Основной поток приложения обрабатывает отрисовку сцены (подкласс QGLWidget) и события. Вычислительный поток находится в цикле, вычисляющем следующие шаги моделирования. Теперь... Я хотел бы взаимодействовать с симуляцией с помощью курсора (перетаскивая объекты или подобные вещи). Поскольку я решил не делать интеллектуальную съемку лучей в сцене вместе с некоторой пространственной декомпозицией (возможно, мне все-таки придется это сделать), я бы хотел, чтобы вычислительный поток выполнял что-то вроде этого:
glGetDoublev(GL_MODELVIEW_MATRIX, modelviewMatrix);
glGetDoublev(GL_PROJECTION_MATRIX, projectionMatrix);
glGetIntegerv(GL_VIEWPORT, viewport);
gluProject(px, py, pz, modelviewMatrix, projectionMatrix, viewport, &x, &y, &z);
чтобы получить экранные координаты [x;y] точки [px;py;pz] и использовать их при вычислении следующего шага моделирования. Оказывается, основной поток всегда получает правильные массивы modelviewMatrix и projectMatrix, но когда это выполняется вычислительным потоком, он получает данные матрицы мусора. Я пробовал много вещей... запускал makeCurrent() перед запросом OpenGL, блокируя любые действия OpenGL, чтобы матрицы не трогались, но безуспешно. Интересно, это вообще возможно? Сохраняет ли OpenGL матрицы после отрисовки сцены? Есть ли способ сделать этот фрагмент кода потокобезопасным?