2010-01-26 3 views
0

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

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

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

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

Спасибо, Dan

ответ

1

Я согласен с Vime: вы строите график сцены, и существует ряд классических подходов для проектирования своей иерархии объектов. Ознакомьтесь с «Проектом 3D-игр» Дэйвом Эберли, чтобы узнать подробности об одном таком движке, и посмотрите на 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

Спасибо ChrisV, ваш пример статического члена класса делает много смысла, и у меня это работает. У меня есть книга Эберли, но я ее не читал подробно, но теперь я начал смотреть на раздел «Графы сцены». Как насчет OpenSceneGraph? Я немного слышал об этом и загрузил его, чтобы посмотреть, есть ли у него опыт? – talldan

+0

Когда-то я использовал OSG, я был не слишком впечатлен, но это было а) несколько лет назад и б) как часть ужасно кодовой базы. Дизайн иерархии объектов просто не понравился мне. Поскольку, как я помню, он попытался отобразить множество концепций OpenGL непосредственно в классы, вы можете, конечно, взглянуть на него. Мой совет по выбору библиотеки графа сцены, правда? Посмотрите на экспортеров.Если вы не можете легко получить свою геометрию в библиотеке, не имеет значения, насколько хорошо разработана остальная библиотека. – ChrisV

0

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

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

+0

Спасибо за помощь. Этот пример очень удобен, и я раньше не сталкивался с этим. Я читал немного о графиках сцены раньше, но никогда не реализовал его полностью. Мне определенно нужно несколько простых отбросов, чтобы исследовать дальше, но, вероятно, не хотим вникать в что-то слишком продвинутое. Это для университетского проекта, поэтому нет конечных пользователей, кроме меня и преподавателей. Пока это относительно стабильно, и я могу доказать свои другие концепции, вот что важно. – talldan