OpenSceneGraph, HUD и & amp; Текстурированные проблемы с виджетами Qt

Итак, у меня есть программа, которая является приложением Qt. У меня есть некоторый базовый графический интерфейс Qt снаружи, но затем у меня есть виджет Qt, который использует OpenSceneGraph визуализировать 3D-сцену. Чтобы сделать вещи более сложными внутри этого экрана, у меня есть HUD, который включает и выключает. Этот HUD состоит из нескольких графических элементов, а затем виджета Qt, отображаемого в текстуре.

У меня в основном это работает, но у меня возникают некоторые проблемы с размером в виджете HUD / Qt. Когда я впервые переключаю HUD на отображение Qt Widget, он слишком большой. Я могу изменить размер, но независимо от того, когда я нажимаю клавишу в первый раз, виджет Qt автоматически изменяется в соответствии с заданной текстурой области (что я и ожидаю), но этот виджет автоматического изменения размера не подходит площадь правильно. Невозможно прочитать таблицу, содержащуюся в виджете.

Чтобы помочь, у меня есть два снимка экрана. Первый, прежде чем я наберу ключ:
http://cerrnim.com/wp-content/uploads/2012/12/before.png
И второе после того, как я наберу ключ:
http://cerrnim.com/wp-content/uploads/2012/12/after.png

Кроме того, вот несколько фрагментов кода, показывающих, как я создаю HUD. Это, конечно, часть гораздо большей программы, но, надеюсь, этого достаточно.

/* AUX function to create HUD geo. */
osg::Geode* HUDGeometry( int x1, int y1, int x2, int y2,
std::string model, HUDEvents event, NetworkViewer* viewer ) {
osg::Geometry* quad = osg::createTexturedQuadGeometry(osg::Vec3(x1,y1,0),
osg::Vec3(x2-x1,0,0), osg::Vec3(0,y2-y1,0), 1, 1);
osg::Geode* geode = new osg::Geode( ) ;

geode->setName( model ) ;
geode->setUserData( new HUDEvent( event, viewer ) ) ;

osg::Texture2D* HUDTexture = new osg::Texture2D();
HUDTexture->setDataVariance(osg::Object::DYNAMIC);
osg::Image* hudImage = osgDB::readImageFile(model);
HUDTexture->setImage(hudImage);
geode->getOrCreateStateSet()->setTextureAttributeAndModes(
0, HUDTexture, osg::StateAttribute::ON);

geode->addDrawable( quad ) ;

return geode ;
}

/* Creates the HUD but does not display it yet. */
void NetworkViewer::initHUD( ) {
osg::MatrixTransform* mt = new osg::MatrixTransform;

osg::Camera* hudCamera = new osg::Camera;
hudCamera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
hudCamera->setViewMatrix(osg::Matrix::identity());
//hudCamera->setProjectionResizePolicy(osg::Camera::FIXED);
hudCamera->setProjectionMatrixAsOrtho2D(0,100,0,100);
hudCamera->setClearMask(GL_DEPTH_BUFFER_BIT);
hudCamera->setRenderOrder(osg::Camera::POST_RENDER);
hudCamera->setAllowEventFocus(true);

QWidget* widget = new QWidget;
layout = new QVBoxLayout( ) ;
widget->setLayout(layout);
widget->layout()->addWidget(((GUI*)view)->getTabs( ));
//widget->setGeometry(0, 0, 500, 400);

osg::ref_ptr<osgQt::QWidgetImage> widgetImage = new osgQt::QWidgetImage(widget);

osg::Geometry* quad = osg::createTexturedQuadGeometry(osg::Vec3(30,32,0),
osg::Vec3(40,0,0), osg::Vec3(0,35,0), 1, 1);
osg::Geode* geode = new osg::Geode;
geode->addDrawable(quad);

osg::Texture2D* texture = new osg::Texture2D(widgetImage.get());
texture->setResizeNonPowerOfTwoHint(false);
texture->setFilter(osg::Texture::MIN_FILTER,osg::Texture::LINEAR);
texture->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP_TO_EDGE);
texture->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP_TO_EDGE);
mt->getOrCreateStateSet()->setTextureAttributeAndModes(0, texture, osg::StateAttribute::ON);

mt->addChild(hudCamera);
osgViewer::InteractiveImageHandler* handler =
new osgViewer::InteractiveImageHandler(widgetImage.get(), texture, hudCamera);

mt->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
mt->getOrCreateStateSet()->setMode(GL_BLEND, osg::StateAttribute::ON);
mt->getOrCreateStateSet()->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);
mt->getOrCreateStateSet()->setAttribute(new osg::Program);

quad->setEventCallback(handler);
quad->setCullCallback(handler);

hudCamera->addChild( geode ) ;
hudCamera->addChild( HUDGeometry(73,73,75,75,
"models/quit.png", EXIT_OBJ, this ));
hudCamera->addChild( HUDGeometry(25,25,75,75,
"models/hud.png", NO_EVENT, this ));

osg::Group* overlay = new osg::Group;
overlay->addChild(mt);

root->addChild(overlay);
HUD = hudCamera ;
disableHUD( ) ;
}

0

Решение

Я думаю, что основная проблема заключается в том, что вы не адаптируете размеры виджета к размерам квадрата, на котором вы его визуализируете.

Я не уверен что QWidgetImage делает это внутренне, но я думаю, что это просто рендеринг виджета на холст соответствующего размера и преобразование результата в изображение. В вашем коде вы отображаете полное изображение (независимо от его размера или соотношения сторон) на этот квад. Если вы хотите, чтобы виджет соответствовал квадру, вам нужно изменить его размер перед созданием изображения.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]