Ищу советы по использованию QGLWidget в Qt4 - PullRequest
0 голосов
/ 26 января 2010

Я новичок здесь, и у меня есть вопрос об opengl в Qt4, который я изучал за последние несколько месяцев.

В частности, я ищу совет о том, как лучше составитьСцена в хорошем объектно-ориентированном виде с использованием QGLWidget.В идеале я хотел бы, чтобы каждый элемент в моей сцене был подклассом суперкласса Entity.Затем в моем основном QGLWidget я могу отсортировать сущности и отобразить их соответствующим образом.

Я заметил, что некоторые функции openGL (например, bindTexture) необходимо вызывать из QGLWidget (или QGLContext виджета).В данный момент я передаю указатель на QGLWidget, который управляет моим основным окном просмотра, каждой сущности и сохраняю его, чтобы я мог получить доступ к этим функциям.Это хорошая идея?

Будут с благодарностью приняты любые советы или даже указания относительно хороших веб-сайтов / книг, которые могут оказаться полезными.У меня есть книга Бланшетт / Саммерфилд, но раздел OpenGL довольно короткий, и большинство примеров на веб-сайте Qt довольно упрощенные.

Спасибо, Дэн

Ответы [ 2 ]

1 голос
/ 26 января 2010

Я согласен с Vime: вы строите граф сцены, и существует несколько классических подходов к проектированию его иерархии объектов.Посмотрите "3D Game Engine Design" Дейва Эберли (Dave Eberly), чтобы узнать подробности об одном таком движке, и посмотрите на OGRE для другого примера.

Так как только один контекст GL может быть активен навремя в определенном потоке, рассмотрите возможность сохранения указателя QGLWidget в качестве статического члена класса для экономии усилий:

class MyGLWidget : public QGLWidget {
    // ...
public:
    static inline MyGLWidget *GetActiveWidget() {
        return ms_activeWidget;
    }
protected:
    static __declspec(thread) MyGLWidget *ms_activeWidget = 0; // uses MSVC extension
    inline void SetActiveWidget() {
        ms_activeWidget = this;
    }
};

void MyGLWidget::paintGL() {
    SetActiveWidget();
    // ...
}

Тогда в ваших классах сущностей вы можете просто вызывать MyGLWidget::GetActiveWidget() в тех случаях, когда вам нужно вызватьФункции-члены QGLWidget, и не нужно копировать (вероятно, инвариантный) указатель повсюду.

0 голосов
/ 26 января 2010

Вы создаете что-то, что обычно называют «графом сцены». В нашем движке объекты графа сцены не нуждаются в доступе к QGLWidget. Достаточно, если вы создаете свои объекты OpenGL внутри void initializeGL() и визуализируете все внутри void paintGL().

Существует пример более высокого уровня Qt / OpenGL под названием Boxes. Его можно найти из папки qt/demos/boxes в установке Qt 4.6.

...