查看: 3058|回复: 6

osgViewer::CompositeViewer 中大小视口遮挡问题

[复制链接]

该用户从未签到

发表于 2009-4-14 20:09:31 | 显示全部楼层 |阅读模式
camera1->setGraphicsContext(gc);       
camera2->setGraphicsContext(gc);
////相机视口设置
camera1->setViewport(new osg::Viewport(traits->x, traits->y,traits->width  ,traits->height  ));
camera2->setViewport(new osg::Viewport(traits->width/3*2, traits->height/3*2, traits->width/3, traits->height/3));
上面的代码,小视口(camera2)出现在上面大视口(camera1)上。
交换setGraphicsContext这两句,情况就相反。
请问这是什么原理?

该用户从未签到

发表于 2009-4-14 20:39:00 | 显示全部楼层
要精确控制两个摄像机视窗的渲染顺序,可以用setRenderOrder

该用户从未签到

 楼主| 发表于 2009-4-14 20:55:11 | 显示全部楼层
恩 通过setRenderOrder 确实可以将后面被遮挡的视口显示出来。可是添加的trackballs失效了。why?how?

该用户从未签到

发表于 2009-4-14 22:15:08 | 显示全部楼层
not sure about your 'why'~~some code first, plz

该用户从未签到

 楼主| 发表于 2009-4-15 09:12:23 | 显示全部楼层
void CCoreOSG::InitManipulators(void)
{
        //创建trackball操作器
        trackballs = new osgGA::TrackballManipulator();

        trackballb = new osgGA::TrackballManipulator();
}


void CCoreOSG::InitSceneGraph(void)
{
        mRoot=new osg::Group;
        mModel = osgDB::readNodeFile("cow.osg");
        mRoot->addChild(mModel.get());

}

void CCoreOSG::InitCameraConfig(void)
{
        // 局部变量存放窗口矩形
        RECT rect;

        // 创建一个viewer
        // mViewer = new osgViewer::Viewer();
        mViewer=new osgViewer::CompositeViewer();
        Viewers=new  osgViewer::Viewer() ;
        Viewerb=new osgViewer::Viewer();

        // 得到当前窗口矩形
        ::GetWindowRect(m_hWnd, &rect);

        // 初始化图形描述什么东西,反正就是那么回事
        osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;

        // 初始化窗口变量,为OSG所用
        osg::ref_ptr<osg::Referenced> windata = new osgViewer::GraphicsWindowWin32::WindowData(m_hWnd);

        // 设置一些个参数
        traits->x = 0;
        traits->y = 0;
        traits->width = rect.right - rect.left;
        traits->height = rect.bottom - rect.top;
        traits->windowDecoration = false;
        traits->doubleBuffer = true;
        traits->sharedContext = 0;
        traits->setInheritedWindowPixelFormat = true;
        traits->inheritedWindowData = windata;
        // 创建图形上下文
        osg::GraphicsContext* gc = osg::GraphicsContext::createGraphicsContext(traits.get());
        // 初始化一个相机
        osg::ref_ptr<osg::Camera> cameras = new osg::Camera;
        osg::ref_ptr<osg::Camera> camerab = new osg::Camera;
        // 绑
        cameras->setGraphicsContext(gc);
        camerab->setGraphicsContext(gc);       

        cameras->setRenderOrder((osg::Camera::RenderOrder)2);
        camerab->setRenderOrder((osg::Camera::RenderOrder)1);
        ////相机视口设置
        camerab->setViewport(new osg::Viewport(traits->x, traits->y,traits->width  ,traits->height  ));
        cameras->setViewport(new osg::Viewport(traits->width/3*2, traits->height/3*2, traits->width/3, traits->height/3));

        // 添加相机到VIEWER
        Viewers->addSlave(cameras.get());
        Viewerb->addSlave(camerab.get());
        Viewers->setCameraManipulator(trackballs.get());
        Viewerb->setCameraManipulator(trackballb.get());

        Viewers->setSceneData(mRoot.get());
        Viewerb->setSceneData(mRoot.get());
        mViewer->addView(Viewerb);
        mViewer->addView(Viewers) ;


        // 实现VIEWER
        mViewer->realize();
}
现在右上角的小视口对鼠标是无视的。

[ 本帖最后由 slwebwildwolf 于 2009-4-15 09:22 编辑 ]

该用户从未签到

发表于 2009-4-15 10:17:17 | 显示全部楼层
此处不要用addSlave,这个函数通常是设置PowerWall显示时的从摄像机用的,建议直接用setCamera

该用户从未签到

发表于 2017-10-29 11:54:21 | 显示全部楼层
我的代码和你一样,但是每个view的操作不能用了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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