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;
}


 

osg实现三视图_.net