查看: 1831|回复: 11

视口切换

[复制链接]

该用户从未签到

发表于 2011-1-8 14:46:23 | 显示全部楼层 |阅读模式
做了两个视口,小视口在大视口之上,怎样动态切换着两个视口啊,请高手帮忙,感谢

该用户从未签到

发表于 2011-1-10 08:46:31 | 显示全部楼层

该用户从未签到

 楼主| 发表于 2011-1-18 10:36:21 | 显示全部楼层
就像这样的窗口,点击按钮,两个窗口的内容互换 Sunset.JPG

该用户从未签到

 楼主| 发表于 2011-1-18 10:37:53 | 显示全部楼层
#include <osgViewer/Viewer>
#include <osgViewer/ViewerEventHandlers>
#include <osgViewer/CompositeViewer>
#include <osg/Node>
#include <osg/Geode>
#include <osg/Group>
#include <osg/Geometry>
#include <osg/MatrixTransform>
#include <osg/PositionAttitudeTransform>
#include <osg/Camera>

#include <osgDB/ReadFile>
#include <osgDB/WriteFile>

#include <osgUtil/Optimizer>
#include <osgGA/TrackballManipulator>
#include <iostream>
int main()
{
        osg::ref_ptr<osgViewer::CompositeViewer> viewer=new osgViewer::CompositeViewer();
    //osg::ref_ptr<osgViewer::Viewer> viewer=new osgViewer::Viewer();
        osg::ref_ptr<osg::Node> cow=osgDB::readNodeFile("cow.osg");
        osg::ref_ptr<osg::Node> cessna=osgDB::readNodeFile("di_1.flt");
        osgUtil::Optimizer optimizer;
        optimizer.optimize(cow.get());
        optimizer.optimize(cessna.get());
        //设置图形环境特性
        osg::ref_ptr<osg::GraphicsContext::Traits> traits=new osg::GraphicsContext::Traits();
        traits->x=0;
        traits->y=0;
        traits->width=1280;
        traits->height=768;
        traits->windowDecoration=true;
        traits->doubleBuffer=true;
        traits->sharedContext=0;
       
        //创建图形环境特性
        osg::ref_ptr<osg::GraphicsContext>gc=osg::GraphicsContext::createGraphicsContext(traits.get());
        if(gc->valid())
        {
                osg::notify(osg::INFO)<<"wewrererwrw"<<std::endl;
                gc->setClearColor(osg::Vec4f(0.2f,0.2f,0.6f,1.0f));
                gc->setClearMask(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
        }
        else
        {
                osg::notify(osg::NOTICE)<<"hjhbhjsbjdf"<<std::endl;
        }
        //////////////////////
        //////////////////////省略
//视图1
        {

                osg::ref_ptr<osgViewer::View> view=new osgViewer::View;
                viewer->addView(view.get());
                view->setSceneData(cessna.get());
                //根据分辨率确定合适的投影来保证显示的图形不变形
                double fovy,aspectRatio,zNear,zFar;
                view->getCamera()->getProjectionMatrixAsPerspective(fovy,aspectRatio,zNear,zFar);

                double newAspectRatio=double(traits->width)/double(traits->height/4);
                double aspectRatioChange=newAspectRatio/aspectRatio;
                if (aspectRatioChange!=1.0)
                {
                        view->getCamera()->getProjectionMatrix()*=osg::Matrixd::scale(1.0/aspectRatioChange,1.0,1.0);
                }
            view->getCamera()->setViewMatrixAsLookAt(osg::Vec3f(0.0,70000.0,60000.0),osg::Vec3f(50000,80000,0),osg::Vec3f(0.0,1.0,0.0));
                view->getCamera()->setViewport(new osg::Viewport(0,0,1280,768));
                view->getCamera()->setGraphicsContext(gc.get());
                        //view->setCameraManipulator(new osgGA::TrackballManipulator);//
                ///添加事件处理
                view->addEventHandler(new osgViewer::StatsHandler);
                view->addEventHandler(new osgViewer::WindowSizeHandler);
                view->addEventHandler(new osgViewer::ThreadingHandler);
                view->addEventHandler(new osgViewer::RecordCameraPathHandler);
                 
        }
        //视图二
        {
                osg::ref_ptr<osgViewer::View> view=new osgViewer::View;
                viewer->addView(view.get());
                view->setSceneData(cessna.get());
            view->getCamera()->setViewMatrixAsLookAt(osg::Vec3f(0.0,60000.0,60000.0),osg::Vec3f(50000,50000,0),osg::Vec3f(0.0,1.0,0.0));
                view->getCamera()->setViewport(new osg::Viewport(980,0,300,300));
                view->getCamera()->setGraphicsContext(gc.get());
                //view->setCameraManipulator(new osgGA::TrackballManipulator);
        }


        viewer->realize();
        viewer.addEventHandler(new UseEventHandler) ;
        while( !viewer->done() )  
        {
                viewer->frame();
        }
        //viewer->frame();
//viewer->run();
   
        return 0;
   
}

该用户从未签到

 楼主| 发表于 2011-1-18 10:38:16 | 显示全部楼层
不知怎样实现切换啊

该用户从未签到

发表于 2011-1-18 12:21:04 | 显示全部楼层
您所说的切换是什么意思?隐藏小窗口?让大窗口覆盖小窗口?还是别的什么操作。此外结合GUI来处理这种窗口切换的问题会更为得当

该用户从未签到

 楼主| 发表于 2011-1-18 15:35:31 | 显示全部楼层
我的意思是两个视口的大小不变,里面的内容相互交换

该用户从未签到

发表于 2011-1-19 08:20:56 | 显示全部楼层
那么方法就多了,直接setSceneData可能有些危险性(因为sceneData的指针还被其他一些Viewer组件使用),不过将两个场景的Group节点设置给两个窗口各自的根节点,然后用root->setChild()交换这两个Group,这样是安全的

此外我个人比较喜欢的一种方法是使用Camera的setCullMask与Node的setNodeMask,这两者的与操作不为零时,Node子场景的内容才会显示在当前相机中——因此您可以很简单地通过改变节点的NodeMask来实现内容在不同相机中的切换

该用户从未签到

 楼主| 发表于 2011-1-20 11:02:33 | 显示全部楼层
好的,我依照您的方法试一下,非常感谢

该用户从未签到

 楼主| 发表于 2011-3-1 11:53:32 | 显示全部楼层
osg::Group * root1 = new osg::Group() ;
osg::Group * root2 = new osg::Group() ;
osg::Group * root3 = new osg::Group() ;
我申请了三个根节点,场景1放到root1 里,场景2放到root2,我打算用root3作为中间变量进行交换用的,
root3=root1;
root1->setChild(1,root2);
root2->setChild(1,root1);
结果两个场景都是原来root2的场景了,不知这是什么原因啊,应该怎么改啊,小弟愚钝,请多多指点
谢谢

该用户从未签到

发表于 2011-3-2 08:28:47 | 显示全部楼层
如果您的意思是:
root1的所有子节点表达了场景1的所有内容;而root2的所有子节点表达了场景2的所有内容

那么您完全可以:
  1. for( every node in root1 ) root3->addChild(node);
  2. root1->removeChildren(0, root1->getNumChildren());
  3. for( every node in root2 ) root1->addChild(node);
  4. root2->removeChildren(0, root2->getNumChildren());
  5. for( every node in root3 ) root2->addChild(node);
复制代码
而您现在的做法似乎完全不是这个意思

该用户从未签到

 楼主| 发表于 2011-3-2 22:01:00 | 显示全部楼层
哦,我的意思正是root1的所有子节点表达了场景1的所有内容;而root2的所有子节点表达了场景2的所有内容
,可能我的代码表达有误,不好意思啊,谢谢锐哥您的建议!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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