查看: 1587|回复: 6

折线对象在场景视口里居中显示?

[复制链接]

该用户从未签到

发表于 2012-5-7 12:33:54 | 显示全部楼层 |阅读模式
折线对象在视口里面居中显示,但是不知道用什么坐标来设定视口才能控制视口对准这个折线对象。。也就是居中显示
我在程序中尝试使用线对象的包围球中心点来作为居中点,但是折线对象的包围球的中心点并不能代表对象的位置。。
那该用什么点比较好呢??我用面对像是比较好的完成这个工作。

该用户从未签到

发表于 2012-5-7 13:55:44 | 显示全部楼层
如果折线对象的包围球不能很好地用于居中,您可以考虑设置一个自己的包围体setInitialBound(),或者在回调中用漫游器的setByMatrix()来指定一个您认为合适的观察位置

该用户从未签到

 楼主| 发表于 2012-5-8 12:22:45 | 显示全部楼层
void HeightLightHandler::setViewPointToFeature(osg::Node *pnode)
{
        osg::NodePathList nodePaths = pnode->getParentalNodePaths();
        //若节点路径不为空
        if (!nodePaths.empty())
        {
                osg::NodePath path = nodePaths[0];

                osg::Matrixd localToWorld = osg::computeLocalToWorld( path );
                osg::Vec3d center = osg::Vec3d(0,0,0) * localToWorld;
                osg::ref_ptr<osg::Geode> pgeode = dynamic_cast<osg::Geode *>(pnode);
                osg::ref_ptr<osg:rawable> drawable = pgeode->getDrawable(0);
                osg::ref_ptr<osg::Geometry> geomtry = drawable->asGeometry();
                osg::ref_ptr<osg::Vec3Array> arry = dynamic_cast<osg::Vec3Array *>(geomtry->getVertexArray());

                double x(0);
                double y(0);
                double z(0);
                int s(0);
                for (osg::Vec3Array::iterator itor = arry->begin();itor != arry->end();itor++,s++)
                {
                        x += itor->x();
                        y += itor->y();
                        z += itor->z();
                }

                x = x/s;
                y = y/s;
                z = z/s;

                osg::Vec3d myvalue(x,y,z);

                //if (drawable)
                //{
                //        const osg::BoundingSphere& bs = drawable->getBound();
                //       
                        if ( !dynamic_cast<osg::MatrixTransform*>(pnode) )
                                center += myvalue;
                //}
                //else
                //{
                //        qDebug()<<"no drawable in node..";
                //        return;
                //}

                osgEarth::GeoPoint output;
                _pMap->worldPointToMapPoint(myvalue, output);

                osgEarth::Viewpoint viewpoint(output.vec3d(), 0.0, -90.0, drawable->getBound().radius() * 4.0);
                osgEarth::Util::EarthManipulator *mapOpeator = dynamic_cast<osgEarth::Util::EarthManipulator*>(_pViewer->getCameraManipulator());
                if (mapOpeator)
                {
                        mapOpeator->setViewpoint(viewpoint,0.5f);
                        _pViewer->requestRedraw();
                }
        }

该用户从未签到

 楼主| 发表于 2012-5-8 12:26:12 | 显示全部楼层
怎么这样取出来的顶点坐标多达上万个。。这样求几何中心点也太浮云了吧

该用户从未签到

 楼主| 发表于 2012-5-9 17:13:43 | 显示全部楼层
结贴。。解决了。osgEarth中的Feature对象已经有这样的函数getGeocentricBound()能够找到中心点,但是为什么节点的包围球不能很正确的使用,里面有什么文章还得看看。。

该用户从未签到

发表于 2015-7-21 14:14:08 | 显示全部楼层
找到中线点之后 怎么居中呢 。。。移动相机还是 什么??
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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