查看: 1015|回复: 3

困惑:关于osg例子程序的bug问题(GLWidget与QT结合)

[复制链接]

该用户从未签到

发表于 2013-1-4 14:35:22 | 显示全部楼层 |阅读模式
执行例子程序osgviewerQt,以鼠标拖拽窗口方式,客户区高度一旦将调整成0后,再恢复客户区尺寸场景不再显示。如果使用的是MFC,无此问题。

该用户从未签到

发表于 2013-1-5 12:54:43 | 显示全部楼层
viewPort的height变为0值时,会让投影矩阵的缩放出现问题(除数为0),代码说明了问题:
  1. void GraphicsContext::resizedImplementation(int x, int y, int width, int height)
  2. {
  3.     std::set<osg::Viewport*> processedViewports;

  4.     if (!_traits) return;
  5.    
  6.     double widthChangeRatio = double(width) / double(_traits->width);
  7.     double heigtChangeRatio = double(height) / double(_traits->height);
  8.     double aspectRatioChange = widthChangeRatio / heigtChangeRatio;
  9.    
复制代码
MFC中正常是因为GraphicsWindowWin32在 resized之前,有这两句判断
  1. int windowWidth = (clientRect.right == 0) ? 1 : clientRect.right ;
  2. nt windowHeight = (clientRect.bottom == 0) ? 1 : clientRect.bottom;
复制代码
确保了缩放后为有效矩阵。

QT中没有判断视窗的长宽是否为0,如下:
  1. void GLWidget::resizeEvent( QResizeEvent* event )
  2. {
  3.     const QSize& size = event->size();
  4.     _gw->resized( x(), y(), size.width(), size.height() );
  5.     _gw->getEventQueue()->windowResize( x(), y(), size.width(), size.height() );
  6.     _gw->requestRedraw();
  7. }
复制代码
之前也遇到了这个问题,在QT中通过widget->setMinimumSize(QSize(10, 10));来防止缩放为0

该用户从未签到

 楼主| 发表于 2013-1-5 13:55:39 | 显示全部楼层
感谢woshijiameizhou对问题的分析和解答,非常到位,让我少走了很多弯路。

该用户从未签到

发表于 2013-1-6 09:06:06 | 显示全部楼层
我以前也在Qt+OSG中遇到过相同的问题,原来是这么回事,学习了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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