查看: 2039|回复: 5

GUI类的成员函数里面读取的shapefile不能显示

[复制链接]

该用户从未签到

发表于 2009-4-1 00:37:13 | 显示全部楼层 |阅读模式
现有一代码 在主界面的某个菜单事件里面读取了一个shapefile 然后将节点放到场景中去 结果 什么也不显示。
如果是在非GUI类的代码中读取,例如直接在main函数中读取同一个文件然后设置给场景,显示正常.
代码如下:
QGIS02.rar (174.34 KB, 下载次数: 134)

该用户从未签到

发表于 2009-4-1 09:13:31 | 显示全部楼层
我没有看您的源代码,不过动态加载节点的话,有可能场景摄像机并没有对准此节点。一个建议是动态加载完节点之后改变一个标志量,然后在callback回调中读取这个标志量并执行getCameraManipulator()->home(0.0),注意不要直接调用home函数,不会有效果

该用户从未签到

 楼主| 发表于 2009-4-1 11:23:58 | 显示全部楼层
上面的代码是从项目里面抽取出来的。
在实际的代码里面 是有重新计算home位置的代码的。
  1. void QManipulatorBase::gotoHome()
  2. {
  3.         _rotation = Vec3(osg::PI_2, 0, 0);
  4.         _position = Vec3(-10, -10, 0);
  5.         if(_model.valid())
  6.         {
  7.           Vec3 center=_model->getBound().center();
  8.         _position=Vec3(center.x(),
  9.                         center.y()-2*_model->getBound().radius(),0);               
  10.         }
  11.         computeMatrix();       
  12. }
复制代码
我的Manipulator是自己写的 在事件中按下home就会调用gotoHome这个方法. 其中computeMatrix的代码如下:
  1. void QManipulatorBase::computeMatrix() {
  2.         _curMatrix.makeRotate(_rotation._v[0], Vec3(1, 0, 0), _rotation._v[1],
  3.                         Vec3(0, 1, 0), _rotation._v[2], Vec3(0, 0, 1));
  4.         _curMatrix = _curMatrix * Matrix::translate(_position);

  5.         _curInverseMatrix = Matrix::inverse(_curMatrix);
  6. }
复制代码
其实就是把计算结果保存起来 这样就不用每次getMatrix的时候都做矩阵计算了.

使用OSG的sample data都可以实现效果。在按下home后 相机都会朝向节点 虽然有时候节点不在屏幕中央 但是,节点肯定是在视野中的。只有用这个shapefile的时候就初相这个问题.

另外:我自己从MatrixManipulator派生的类 是不是要重写home函数?

该用户从未签到

发表于 2009-4-1 12:20:22 | 显示全部楼层
需要重写home函数

该用户从未签到

发表于 2009-4-1 13:00:24 | 显示全部楼层
楼主是如何把shapefile转换为osg可用的节点的?

该用户从未签到

发表于 2009-4-1 13:24:10 | 显示全部楼层
直接用readNodeFile就可以。osg插件中的shp和ogr都可以用于读取shp文件
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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