查看: 1589|回复: 5

[两个]关于对象选取和缩略图

[复制链接]

该用户从未签到

发表于 2012-1-29 11:38:35 | 显示全部楼层 |阅读模式
本帖最后由 galuodo 于 2012-1-29 12:01 编辑

[1]我在一个Geode 下面画了几个box ,现在我想选中其中一个,但是用书上的方法:
  1. void pick(osgViewer::View* view, float x, float y)
  2.           {
  3.                   osg::Node* node = new osg::Node();
  4.                   osg::Group* parent = new osg::Group();
  5.                   osgUtil::LineSegmentIntersector::Intersections intersections;
  6.                   if (view->computeIntersections(x, y, intersections))
  7.                   {
  8.                           osgUtil::LineSegmentIntersector::Intersection intersection = *intersections.begin();
  9.                           osg::NodePath& nodePath = intersection.nodePath;
  10.                           node = (nodePath.size()>=1)?nodePath[nodePath.size()-1]:0;
  11.                           parent = (nodePath.size()>=2)?dynamic_cast<osg::Group*>(nodePath[nodePath.size()-2]):0;
  12.                   }        
  13.                   if (parent && node)
  14.                   {
  15.                           osgFX::Scribe* parentAsScribe = dynamic_cast<osgFX::Scribe*>(parent);
  16.                        
  17.                           {
  18.                                   std::cout<<parent->getName()<<"\n";
  19.                                   //如果对象选择到,高亮显示
  20.                                   osgFX::Scribe* scribe = new osgFX::Scribe();
  21.                                   scribe->addChild(node);

  22.                                   parent->replaceChild(node,scribe);
  23.                           }

  24.                   }

  25.           }
复制代码
把所有的图形都给标记了  有没有什么办法可以选中其中一个 而不是节点下面的所有drawable?


[2]我有一个很大的地形,想做一个缩略图,不知道应该怎么做?因为从最中间截图的话太小,而且有变形



两个问题可能十分简单,谢谢了.

该用户从未签到

发表于 2012-1-30 09:24:19 | 显示全部楼层
[1] 如果您坚持使用osgFX::Scribe,那么它只能作用于节点,请把多个drawable拆分到多个geode中;否则您也可以考虑自己写一个callback的方案
[2] 我不明白您的意思

该用户从未签到

 楼主| 发表于 2012-1-30 13:11:47 | 显示全部楼层
不一定用刻线的,我就想得到选中的drawable的类...
是不是把drawable的位置存下来,然后遍历一下?

该用户从未签到

发表于 2012-2-3 09:42:15 | 显示全部楼层
直接遍历就可以了,从Intersector中取得交集信息

该用户从未签到

 楼主| 发表于 2012-2-3 21:47:29 | 显示全部楼层
这个是我从网上找到的俯瞰的代码,想做这个场景的缩略图
长宽高是我通过包围盒计算的
  1. osg::Camera* createBirdsEye( int blenth,int bwidth, int bheight)
  2. {
  3.         osg::ref_ptr<osg::Camera> camera = new osg::Camera;
  4.         camera->setClearMask( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
  5.         camera->setReferenceFrame( osg::Transform::ABSOLUTE_RF );
  6.         double viewDistance = 2.0 * bheight;
  7.         float top = blenth;
  8.         float right = bwidth;

  9.         camera->setProjectionMatrixAsOrtho2D(-right, right, -top, top);

  10.         osg::Vec3d upDirection( 0.0,1.0,0.0 );

  11.         osg::Vec3d viewDirection( 0.0,0.0,1.0 );


  12.         osg::Vec3d center(0,0,0);

  13.         osg::Vec3d eyePoint = center + viewDirection * viewDistance;

  14.         camera->setViewMatrixAsLookAt( eyePoint, center, upDirection );

  15.         return camera.release();
  16. }
复制代码
但是发现出来的图像不是正的 而是扁的矩形

然后我试了一下 花了一个box 结果显示如下 QQ截图20120203214419.png

不知到为啥不是正方形 求解答  谢谢了

该用户从未签到

发表于 2012-2-8 09:11:02 | 显示全部楼层
没有更多的信息我判断不了什么,比如您如何添加这个bird-eye,等等
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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