查看: 1099|回复: 3

osg中动态添加从属相机

[复制链接]

该用户从未签到

发表于 2015-4-3 16:11:45 | 显示全部楼层 |阅读模式
1、动态添加从属相机的函数如下(参数是viewer):
void addCameras(osg::ref_ptr<osgViewer::Viewer> viewer)
{
        static int numofwin = 0;

        //控制添加的从属相机,上限为10个
        if((numofwin+1) > 10)
        {
                printf("No more windows will be created!!!!\n");
                return ;
        }
       
        //创建窗口系统接口
        osg::ref_ptr<osg::GraphicsContext::WindowingSystemInterface> wsi =
                                  osg::GraphicsContext::getWindowingSystemInterface();
       
        //得到窗口分辨率
        unsigned int width, height;
        wsi->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(0), width, height);

        //计算一行能放多少窗口
        int row_num = width / (320 + 20);
        int col_num = height / 256;

        //设置图形环境特性
        osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
        traits->windowDecoration = true;
        traits->doubleBuffer = true;
        traits->sharedContext = false;
        traits->windowName = "飞行器窗口";
        traits->supportsResize = 0;
       
        //计算所要添加的从属相机所在的图形窗口的位置
        traits->x = ((numofwin) % row_num) * (320 + 10) + 10;
        traits->y = (numofwin) / row_num * (256 + 30) + 30;
        traits->width = 320;
        traits->height = 256;
        //创建图形环境
        osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());

        //创建从属相机
        osg::ref_ptr<osg::Camera> cameraClient = new osg::Camera();
        cameraClient->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
        cameraClient->setGraphicsContext(gc.get());
        cameraClient->setViewport(new osg::Viewport(0, 0, traits->width, traits->height));
        cameraClient->setProjectionMatrixAsPerspective(30,(double)traits->width/(double)traits->height,0.000001,1000000);
        cameraClient->setViewMatrixAsLookAt(eye,center,up);
        GLenum bufferClient = traits->doubleBuffer ? GL_BACK : GL_FRONT;
        cameraClient->setDrawBuffer(bufferClient);
        cameraClient->setReadBuffer(bufferClient);

        //添加从属相机
        viewer->addSlave(cameraClient);
        numofwin++;
}

2、按下a键将调用上述函数来添加从属相机
class myHandler: public osgGA::GUIEventHandler
{
public:
        ImageHandler(){}
        ~ImageHandler(){}
        //重载handle()函数
        bool ImageHandler::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa)
        {
                osg::ref_ptr<osgViewer::Viewer> viewer = dynamic_cast<osgViewer::Viewer*>(&aa);

                if(viewer == NULL)
                {
                        return false;
                }
                //定义一个静态变量
                static int _screenCaptureSequence = 0;

                switch(ea.getEventType())
                {
                case osgGA::GUIEventAdapter::KEYDOWN:
                        {
                                if(ea.getKey() == 'a' || ea.getKey() == 'A')
                                {
                                        viewer->stopThreading();
                                        addCameras(viewer.get());
                                        viewer->startThreading();
                                        viewer->realize();
                                }
                        }
                        break;

                default:
                        return false;
                }
                return true;
        }
};

3、从属相机是为了观察场景中右边的cow,但是实际运行出现了显示的问题,如截图所示,小窗口中的牛变成白色了。截图右下角为主相机的图形窗口,上面10个小窗口为按下a键添加的窗口。

4、有哪位大神能帮忙解决一下,谢谢了。

实际运行截图

实际运行截图

该用户从未签到

 楼主| 发表于 2015-4-7 09:09:29 | 显示全部楼层
如果大家有类似的情况,可以和我分享一下,现在真的是一头雾水。

该用户从未签到

 楼主| 发表于 2015-4-7 15:32:23 | 显示全部楼层
是不是我动态添加从属相机的方法本来就有问题?麻烦有经验的朋友能提示一下。

该用户从未签到

 楼主| 发表于 2015-4-7 19:43:40 | 显示全部楼层
问题还是没有解决。不过用多视图就没有这种情况。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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