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
  • 相关阅读:
    EXTJS 4.2 资料 控件之checkboxgroup的用法(静态数据)
    EXTJS 4.2 资料 控件之Window窗体相关属性的用法
    EXTJS 4.2 资料 控件之textfield文本框加事件的用法
    Entity Framework 学习笔记(一)之数据模型 数据库
    EXTJS 4.2 资料 控件之checkboxgroup的用法(动态数据)
    EXTJS 4.2 资料 控件之Grid 列鼠标悬停提示
    Entity Framework 学习笔记(二)之数据模型 Model 使用过程
    EXTJS 4.2 资料 控件之radiogroup 的用法
    EXTJS API
    vue移动端弹框组件,vue-layer-mobile
  • 原文地址:https://www.cnblogs.com/herd/p/15330949.html
Copyright © 2011-2022 走看看