查看: 2170|回复: 10

关于osgViewerSDL的问题

[复制链接]

该用户从未签到

发表于 2009-8-10 15:50:32 | 显示全部楼层 |阅读模式
不知道有没有人遇到这个情况?
我将osgViewerSDL 中SDL的SDL_FullScreen 去掉了.
然后设置成窗口形式的.结果窗口resized后,就会看不到模型了..我怀疑是不是gw->resized()和 gw->geteventQueue().->windowresized() 这两个消息是不是不起作用了? 以下是原先的窗口建完之后的模型看的见得图片和 窗口resize 后模型看不到的图片
one.jpg
one2.jpg

该用户从未签到

 楼主| 发表于 2009-8-10 19:51:57 | 显示全部楼层
没人解决这个问题么?

该用户从未签到

发表于 2009-8-10 22:33:43 | 显示全部楼层
没有用过SDL来做界面框架~~~

该用户从未签到

发表于 2009-8-11 11:49:18 | 显示全部楼层
也许需要您提供更多的信息,比如您的代码是如何实现的?

该用户从未签到

 楼主| 发表于 2009-8-11 14:09:36 | 显示全部楼层
没有用过SDL来做界面框架~~~
FlySky 发表于 2009-8-10 22:33


就是osg的源码中的例子 osgviewerSDL 我只是去掉那句SDL_FULL改了下窗口的设置等.
  1. #include <osgViewer/Viewer>
  2. #include <osgViewer/ViewerEventHandlers>
  3. #include <osgGA/TrackballManipulator>
  4. #include <osgDB/ReadFile>

  5. #include "SDL.h"

  6. #include <iostream>

  7. bool convertEvent(SDL_Event& event, osgGA::EventQueue& eventQueue)
  8. {
  9.     switch (event.type) {

  10.         case SDL_MOUSEMOTION:
  11.             eventQueue.mouseMotion(event.motion.x, event.motion.y);
  12.             return true;

  13.         case SDL_MOUSEBUTTONDOWN:
  14.             eventQueue.mouseButtonPress(event.button.x, event.button.y, event.button.button);
  15.             return true;

  16.         case SDL_MOUSEBUTTONUP:
  17.             eventQueue.mouseButtonRelease(event.button.x, event.button.y, event.button.button);
  18.             return true;

  19.         case SDL_KEYUP:
  20.             eventQueue.keyRelease( (osgGA::GUIEventAdapter::KeySymbol) event.key.keysym.unicode);
  21.             return true;

  22.         case SDL_KEYDOWN:
  23.             eventQueue.keyPress( (osgGA::GUIEventAdapter::KeySymbol) event.key.keysym.unicode);
  24.             return true;

  25.         case SDL_VIDEORESIZE:
  26.             eventQueue.windowResize(0, 0, event.resize.w, event.resize.h );
  27.             return true;

  28.         default:
  29.             break;
  30.     }
  31.     return false;
  32. }

  33. int main( int argc, char **argv )
  34. {
  35.     // init SDL
  36.     if ( SDL_Init(SDL_INIT_VIDEO) < 0 )
  37.     {
  38.         fprintf(stderr, "Unable to init SDL: %s\n", SDL_GetError());
  39.         exit(1);
  40.     }
  41.     atexit(SDL_Quit);
  42.    

  43.     // load the scene.
  44.     osg::ref_ptr<osg::Node> loadedModel = osgDB::readNodeFile("cow.osg");
  45.     if (!loadedModel)
  46.     {
  47.         std::cout << argv[0] <<": No data loaded." << std::endl;
  48.         return 1;
  49.     }

  50.     unsigned int windowWidth = 0;
  51.     unsigned int windowHeight = 0;

  52.     unsigned int bitDepth = 16;

  53.     windowWidth = 600;
  54.     windowHeight = 480;


  55.     SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 5 );
  56.     SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 5 );
  57.     SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 5 );
  58.     SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 16 );
  59.     SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
  60.    
  61.     // set up the surface to render to
  62.     SDL_Surface* screen = SDL_SetVideoMode(windowWidth, windowHeight, bitDepth, SDL_OPENGL | SDL_RESIZABLE);
  63.     if ( screen == NULL )
  64.     {
  65.         std::cerr<<"Unable to set "<<windowWidth<<"x"<<windowHeight<<" video: %s\n"<< SDL_GetError()<<std::endl;
  66.         exit(1);
  67.     }

  68.     SDL_EnableUNICODE(1);
  69.    
  70.     // If we used 0 to set the fields, query the values so we can pass it to osgViewer
  71.     windowWidth = screen->w;
  72.     windowHeight = screen->h;
  73.    
  74.     osgViewer::Viewer viewer;
  75.     osg::ref_ptr<osgViewer::GraphicsWindowEmbedded> gw = viewer.setUpViewerAsEmbeddedInWindow(0,0,windowWidth,windowHeight);
  76.     viewer.setSceneData(loadedModel.get());
  77.     viewer.setCameraManipulator(new osgGA::TrackballManipulator);
  78.     viewer.addEventHandler(new osgViewer::StatsHandler);
  79.     viewer.realize();

  80.     bool done = false;
  81.     while( !done )
  82.     {
  83.         SDL_Event event;

  84.         while ( SDL_PollEvent(&event) )
  85.         {
  86.             // pass the SDL event into the viewers event queue
  87.             convertEvent(event, *(gw->getEventQueue()));

  88.             switch (event.type) {

  89.                 case SDL_VIDEORESIZE:
  90.                     SDL_SetVideoMode(event.resize.w, event.resize.h, bitDepth, SDL_OPENGL | SDL_RESIZABLE);
  91.                     gw->resized(0, 0, event.resize.w, event.resize.h );
  92.                                         std::cout<<event.resize.w<<" "<<event.resize.h<<std::endl;
  93.                     break;

  94.                 case SDL_KEYUP:

  95.                     if (event.key.keysym.sym==SDLK_ESCAPE) done = true;
  96.                     if (event.key.keysym.sym=='f')
  97.                     {
  98.                         SDL_WM_ToggleFullScreen(screen);
  99.                         gw->resized(0, 0, screen->w, screen->h );
  100.                     }

  101.                     break;

  102.                 case SDL_QUIT:
  103.                     done = true;
  104.             }
  105.         }

  106.         if (done) continue;


  107.         // draw the new frame
  108.         viewer.frame();

  109.         // Swap Buffers
  110.         SDL_GL_SwapBuffers();
  111.     }
  112.    
  113.     return 0;
  114. }
复制代码

该用户从未签到

发表于 2009-8-11 15:23:03 | 显示全部楼层
您可以简单地调试一下,比如如果仅仅把SDL_FULLSCREEN再加上,您的代码可以正常运行吗

该用户从未签到

 楼主| 发表于 2009-8-11 16:34:27 | 显示全部楼层
6# array

运行起来是没问题的,没加SDL_FULLSCREEN 也可以运行了 运行截图在上面,我已经发出来过了
我的问题是我前面所说的.就是窗口大小改变的时候就看不到那个模型了.

该用户从未签到

发表于 2009-8-11 17:03:02 | 显示全部楼层
窗口大小改变时触发了SDL_VIDEORESIZE事件,此时的resized()用于修改实际窗口大小,Windows下这个函数实际上没有作用;windowResize()则向GUIEventHandler传入一个窗口尺寸事件。您可以检查一下windowResize()的传入参数是否正确

该用户从未签到

 楼主| 发表于 2009-8-11 18:18:31 | 显示全部楼层
8# array

在源代码中得知.
gw->resized() 会调用GraphicsContext::resizedImplementation(int x, int y, int width, int height)来改变此GraphicsContext中的camara的ViewPort 所以这句才是最终改变_camara的viewport() 我调试后得知,确定其_camara的viewport已经改变
而event.windowResized函数并没有影响那个viewport的值.

然在窗口大小改变后,却依然看不到模型....

该用户从未签到

 楼主| 发表于 2009-8-11 22:13:53 | 显示全部楼层
9# acmiyou

我发现 原来是SDL在win32下的问题.它设置SDL_SetVideoMode()之后会改变Context...如果我把
SDL_SetVideoMode() 注释掉就会没问题..那现在可想而知..win32下的SDL 好像不能实现全屏了.因为SDL在win32下的SDL_WM_ToggleFullScreen也不能在win32或者mac下工作..

该用户从未签到

发表于 2009-8-11 22:41:49 | 显示全部楼层
这个我确实不是很清楚,也许您可以帮助完善osgviewerSDL这个例子
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表