zoukankan      html  css  js  c++  java
  • osg实现三视图

    osg实现三视图

    #include <osg/Geode>
    #include <osg/Geometry>
    #include <osg/LineWidth>
    #include <osgViewer/Viewer>
    #include <osgViewer/CompositeViewer>
    #include <osgDB/ReadFile>
    #include <osgDB/WriteFile>
    #include <osgViewer/ViewerEventHandlers>  
    #include <osg/Geode>
    #include <osg/Geometry>
    #include <osg/LineWidth>
    #include <osgViewer/Viewer>
    #include <osg/Node>
    #include <osgDB/ReadFile>
    #include <osgViewer/Viewer>
    #include <osgDB/ReadFile>
    #include <osgDB/WriteFile>
    #include <osgViewer/ViewerEventHandlers> 
    #include <osgViewer/CompositeViewer> 
    #include <osg/PositionAttitudeTransform> 
    #include <osg/MatrixTransform> 
    #include <osgFX/Scribe> 
    #include <osgParticle/PrecipitationEffect> 
    #include <osg/NodeCallback> 
    #include <osg/DrawPixels> 
    #include <osg/ShapeDrawable>
    #include <osg/ComputeBoundsVisitor>
    #include <osgGA/TrackballManipulator>
    #include <osgGA/StateSetManipulator>
    #include <osg/GraphicsContext>
    #include <osgViewer/GraphicsWindow>
    
    #include <iostream>
    
    #define M_PI 3.1415926
    
    
    
    //绘制几何体
    osg::Geode* createShpe()
    {
        //
        osg::Geode *geode = new osg::Geode();
        //半径
        float radius = 0.8f;
        //高度
        float height = 1.6f;
    
        //精细度
        osg::TessellationHints* hints1 = new osg::TessellationHints();
        //设置精细度
        hints1->setDetailRatio(0.9f);
    
        //创建正方体
        //osg::Box *box = new osg::Box(osg::Vec3(0.0f, 0.0f, 0.0f), 1 * radius);
    
        osg::Box *box = new osg::Box(osg::Vec3(0.0f, 0.0f, 0.0f), 1.0f, 2.0f, 0.6f);
    
        osg::ShapeDrawable *draw1 = new osg::ShapeDrawable(box, hints1);
    
        geode->addDrawable(draw1);
    
        return geode;
    }
    
    
    
    
    int main(int argc, char **argv)
    {
    
        osg::ref_ptr<osg::Geode> m_Root = createShpe();
    
        //osg::ref_ptr<osg::Referenced> windata = new osgViewer::GraphicsWindowWin32::WindowData();
        osg::ref_ptr<osg::Referenced> windata = new osgViewer::GraphicsWindow();
    
        // Create the viewer for this window
        //创建复合视图compositeViewer对象,及4个视图
        osgViewer::CompositeViewer* m_ViewerSet = new osgViewer::CompositeViewer();
        osg::ref_ptr<osgViewer::View> Viewer1 = new osgViewer::View();
        osg::ref_ptr<osgViewer::View> Viewer2 = new osgViewer::View();
        osg::ref_ptr<osgViewer::View> Viewer3 = new osgViewer::View();
        osg::ref_ptr<osgViewer::View> Viewer4 = new osgViewer::View();
        //为四个视图创建四个独立的轨迹球
        osgGA::TrackballManipulator* m_traceball1 = new osgGA::TrackballManipulator();
        osgGA::TrackballManipulator* m_traceball2 = new osgGA::TrackballManipulator();
        osgGA::TrackballManipulator* m_traceball3 = new osgGA::TrackballManipulator();
        osgGA::TrackballManipulator* m_traceball4 = new osgGA::TrackballManipulator();
        
    
    
        osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
        traits->x = 0;
        traits->y = 0;
        traits->width = 1200;
        traits->height = 560;
        traits->windowDecoration = false;
        traits->doubleBuffer = true;
        traits->sharedContext = 0;
        traits->setInheritedWindowPixelFormat = true;
        traits->inheritedWindowData = windata;
        //设置透视的相关参数
        const double fov = 3;
        const double aspect = (double)traits->width / (double)traits->height;
        osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
    
        //视图1窗口
        Viewer1->addEventHandler(new osgViewer::StatsHandler);
        Viewer1->setName(("Viewer1"));
        osg::ref_ptr<osg::Camera> camera1 = new osg::Camera;
        camera1->setClearColor(osg::Vec4(255.0, 255.0, 255.0, 1.0));
        camera1->setGraphicsContext(gc);
        camera1->setViewport(new osg::Viewport(traits->x, traits->y, (traits->width) / 2, (traits->height) / 2));
        camera1->setProjectionMatrixAsPerspective(fov, aspect, 1, 10);
        Viewer1->setCamera(camera1.get());
        osg::Light* defaultLight1 = Viewer1->getLight();
        defaultLight1->setAmbient(osg::Vec4(0.2f, 0.2f, 0.2f, 1.0f));
        Viewer1->setSceneData(m_Root.get());
        Viewer1->setCameraManipulator(m_traceball1);
        Viewer1->getCamera()->setCullingMode(Viewer1->getCamera()->getCullingMode() & ~osg::CullStack::SMALL_FEATURE_CULLING);
        
        
        //视图2窗口
        Viewer2->addEventHandler(new osgViewer::StatsHandler);
        Viewer2->setName(("Viewer2"));
        osg::ref_ptr<osg::Camera> camera2 = new osg::Camera;
        camera2->setClearColor(osg::Vec4(255.0, 255.0, 255.0, 1.0));
        camera2->setGraphicsContext(gc);
        camera2->setViewport(new osg::Viewport(traits->x + (traits->width) / 2, traits->y, (traits->width) / 2, (traits->height) / 2));
        camera2->setProjectionMatrixAsPerspective(fov, aspect, 1, 10);
        Viewer2->setCamera(camera2.get());
        osg::Light* defaultLight2 = Viewer2->getLight();
        defaultLight2->setAmbient(osg::Vec4(0.2f, 0.2f, 0.2f, 1.0f));
        Viewer2->setSceneData(m_Root.get());
        Viewer2->setCameraManipulator(m_traceball2);
        Viewer2->getCamera()->setCullingMode(Viewer2->getCamera()->getCullingMode() & ~osg::CullStack::SMALL_FEATURE_CULLING);
        
        
        //视图3窗口
        Viewer3->addEventHandler(new osgViewer::StatsHandler);
        Viewer3->setName(("Viewer3"));
        osg::ref_ptr<osg::Camera> camera3 = new osg::Camera;
        camera3->setClearColor(osg::Vec4(255.0, 255.0, 255.0, 1.0));
        camera3->setGraphicsContext(gc);
        camera3->setViewport(new osg::Viewport(traits->x, traits->y + (traits->height) / 2, (traits->width) / 2, (traits->height) / 2));
        camera3->setProjectionMatrixAsPerspective(fov, aspect, 1, 10);
        Viewer3->setCamera(camera3.get());
        osg::Light* defaultLight3 = Viewer3->getLight();
        defaultLight3->setAmbient(osg::Vec4(0.2f, 0.2f, 0.2f, 1.0f));
        Viewer3->setSceneData(m_Root.get());
        Viewer3->setCameraManipulator(m_traceball3);
        Viewer3->getCamera()->setCullingMode(Viewer3->getCamera()->getCullingMode() & ~osg::CullStack::SMALL_FEATURE_CULLING);
        
        
        //视图4窗口
        Viewer4->addEventHandler(new osgViewer::StatsHandler);
        Viewer4->setName(("Viewer4"));
        osg::ref_ptr<osg::Camera> camera4 = new osg::Camera;
        camera4->setClearColor(osg::Vec4(255.0, 255.0, 255.0, 1.0));
        camera4->setGraphicsContext(gc);
        camera4->setViewport(new osg::Viewport(traits->x + (traits->width) / 2, traits->y + (traits->height) / 2, (traits->width) / 2, (traits->height) / 2));
        camera4->setProjectionMatrixAsPerspective(fov, aspect, 1, 10);
        Viewer4->setCamera(camera4.get());
        osg::Light* defaultLight4 = Viewer4->getLight();
        defaultLight4->setAmbient(osg::Vec4(0.2f, 0.2f, 0.2f, 1.0f));
        Viewer4->setSceneData(m_Root.get());
        Viewer4->setCameraManipulator(m_traceball4);
        Viewer4->getCamera()->setCullingMode(Viewer4->getCamera()->getCullingMode() & ~osg::CullStack::SMALL_FEATURE_CULLING);
    
    
        //设置视图初始状态
        //TOP_VIEW
        m_traceball1->setRotation(osg::Quat(1.0f, 0.0, 0.0, 0.0));
        m_traceball2->setRotation(osg::Quat(0.0f, 0.0f, 0.0f, 1.0f));
        //WEST_VIEW
        m_traceball3->setRotation(osg::Quat(1.0f, -1.0, -1.0, 1.0f));
        //NORTH_VIEW
        m_traceball4->setRotation(osg::Quat(0.0f, 1.0f, 1.0f, 0.0f));
    
        //添加视图
        m_ViewerSet->addView(Viewer1);
        m_ViewerSet->addView(Viewer2);
        m_ViewerSet->addView(Viewer3);
        m_ViewerSet->addView(Viewer4);
    
    
        // Realize the Viewer
        m_ViewerSet->realize();
        m_ViewerSet->setKeyEventSetsDone(0);
    
        m_ViewerSet->run();
    
        return 0;
    }

     

    参考:https://blog.csdn.net/pengjiaqi1028/article/details/78582366

    QQ 3087438119
  • 相关阅读:
    ① ts基础
    ⑦ 原型和原型链 作用域链
    ④ 小程序使用分包
    功能⑦ 小程序整合高德地图定位
    effective OC2.0 52阅读笔记(三 接口与API设计)
    effective OC2.0 52阅读笔记(二 对象、消息、运行期)
    effective OC2.0 52阅读笔记(一 熟悉Objective-C)
    perl的Getopt::Long和pod::usage ?
    安装你自己的perl modules
    Perl 之 use(), require(), do(), %INC and @INC
  • 原文地址:https://www.cnblogs.com/herd/p/15330949.html
Copyright © 2011-2022 走看看