0

だから私はQtアプリであるプログラムを持っています。OpenSceneGraph外側にいくつかの基本的なQtGUIがありますが、3Dシーンのレンダリングに使用するQtウィジェットがあります。その画面内で物事をより複雑にするために、オンとオフを切り替えるHUDがあります。このHUDは、いくつかのグラフィック要素と、テクスチャにレンダリングされたQtウィジェットで構成されています。

私は基本的にそれを機能させていますが、HUD/Qtウィジェット内でいくつかのサイズの問題があります。最初にHUDを切り替えて、Qtウィジェットが表示されるようにしたとき、そこには大きすぎます。サイズを変更することはできますが、最初にキーを押すと、Qtウィジェットは、指定したテクスチャ領域に合わせて自動サイズ変更されます(これは私が期待していることです)が、この自動サイズ変更ウィジェットは適合しませんエリアを正しく。ウィジェットに含まれているテーブルを読み取ることは不可能です。

2つのスクリーンショットを用意するために。1つ目はキーを入力する前です:http:
//cerrnim.com/wp-content/uploads/2012/12/before.png
そして2つ目はキーを入力した後です: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( ) ;                                                               
}
4

1 に答える 1

0

主な問題は、ウィジェットのサイズを、それをレンダリングするクワッドのサイズに適合させないことだと思います。

内部で何が行われているのかはわかりませんQWidgetImageが、ウィジェットを適切なサイズのキャンバスにレンダリングし、結果を画像に変換しているだけだと思います。コードでは、(寸法やアスペクト比に関係なく)完全な画像をそのクワッドにマッピングします。ウィジェットをクワッドに合わせたい場合は、画像を作成する前にウィジェットのサイズを変更する必要があります。

于 2012-12-12T22:11:51.950 に答える