• Osg-地图界面显示指北针(指南针)


     

    相关资料:

    https://blog.csdn.net/zbf00138/article/details/52288598

    实例:

    Compass.h

     1 #ifndef COMPASS_H
     2 #define COMPASS_H
     3 
     4 #include <osgEarth/MapNode>
     5 
     6 #include <osgEarthUtil/EarthManipulator>
     7 #include <osgEarthUtil/ExampleResources>
     8 
     9 #include <osgEarthAnnotation/ImageOverlay>
    10 #include <osgEarthAnnotation/CircleNode>
    11 #include <osgEarthAnnotation/RectangleNode>
    12 #include <osgEarthAnnotation/EllipseNode>
    13 #include <osgEarthAnnotation/PlaceNode>
    14 #include <osgEarthAnnotation/LabelNode>
    15 #include <osgEarthAnnotation/LocalGeometryNode>
    16 #include <osgEarthAnnotation/FeatureNode>
    17 #include <osgEarthAnnotation/ModelNode>
    18 
    19 #include <osgEarthAnnotation/AnnotationEditing>
    20 #include <osgEarthAnnotation/ImageOverlayEditor>
    21 
    22 #include <osgEarthSymbology/GeometryFactory>
    23 #include <osgEarthUtil/RTTPicker>
    24 
    25 #include <osgViewer/Viewer>
    26 #include <osgQOpenGL/osgQOpenGLWidget>
    27 #include <osg/DrawPixels>
    28 
    29 class Compass : public osg::Camera
    30 {
    31 public:
    32     Compass();
    33     Compass( const Compass& copy, osg::CopyOp copyop=osg::CopyOp::SHALLOW_COPY );
    34     META_Node( osg, Compass );
    35 
    36 
    37     void setPlate( osg::MatrixTransform* plate ) { _plateTransform = plate; }
    38     osg::MatrixTransform* getPlate() { return _plateTransform.get(); }
    39     const osg::MatrixTransform* getPlate() const { return _plateTransform.get(); }
    40 
    41 
    42     void setNeedle( osg::MatrixTransform* needle ) { _needleTransform = needle; }
    43     osg::MatrixTransform* getNeedle() { return _needleTransform.get(); }
    44     const osg::MatrixTransform* getNeedle() const { return _needleTransform.get(); }
    45 
    46 
    47     void setMainCamera( osg::Camera* camera ) { _mainCamera = camera; }
    48     osg::Camera* getMainCamera() { return _mainCamera.get(); }
    49     const osg::Camera* getMainCamera() const { return _mainCamera.get(); }
    50     void setWidthHeight(int x, int y, int width, int height){ m_xx = x; m_yy = y; m_width = width; m_height = height; };
    51     virtual void traverse( osg::NodeVisitor& nv );
    52 
    53 protected:
    54     virtual ~Compass();
    55     int m_width, m_height;
    56     int m_x, m_y, m_xx, m_yy;
    57     osg::ref_ptr<osg::MatrixTransform> _plateTransform;
    58     osg::ref_ptr<osg::MatrixTransform> _needleTransform;
    59     osg::observer_ptr<osg::Camera> _mainCamera;
    60 };
    61 
    62 #endif // COMPASS_H
    View Code

    Compass.cpp

     1 #include "Compass.h"
     2 
     3 
     4 Compass::Compass()
     5 {
     6 }
     7 
     8 Compass::Compass( const Compass& copy, osg::CopyOp copyop )
     9 :   osg::Camera(copy, copyop),
    10     _plateTransform(copy._plateTransform),
    11     _needleTransform(copy._needleTransform),
    12     _mainCamera(copy._mainCamera)
    13 {
    14 }
    15 
    16 Compass::~Compass()
    17 {
    18 }
    19 
    20 void Compass::traverse( osg::NodeVisitor& nv )
    21 {
    22     if ( _mainCamera.valid() && nv.getVisitorType()==osg::NodeVisitor::CULL_VISITOR )
    23     {
    24         osg::Matrix matrix = _mainCamera->getViewMatrix();
    25         matrix.setTrans( osg::Vec3() );
    26 
    27         osg::Vec3 northVec = osg::Z_AXIS * matrix;
    28         northVec.z() = 0.0f;
    29         northVec.normalize();
    30 
    31         osg::Vec3 axis = osg::Y_AXIS ^ northVec;
    32         float angle = atan2(axis.length(), osg::Y_AXIS*northVec);
    33         axis.normalize();
    34 
    35         if ( _plateTransform.valid() )
    36             _plateTransform->setMatrix( osg::Matrix::rotate(angle, axis) );
    37 
    38         if (m_x != _mainCamera->getViewport()->width() || _mainCamera->getViewport()->height() != m_y)
    39         {
    40             m_x = _mainCamera->getViewport()->width();
    41             m_y = _mainCamera->getViewport()->height();
    42             this->setViewport(_mainCamera->getViewport()->width()-m_width-m_xx, _mainCamera->getViewport()->height()-m_height-m_yy, m_width, m_height);
    43         }
    44     }
    45 
    46 
    47     _plateTransform->accept( nv );
    48     _needleTransform->accept( nv );
    49     osg::Camera::traverse( nv );
    50 }
    View Code

    调用

     1     osg::ref_ptr<Compass> compass = new Compass;
     2     compass->setProjectionMatrix(osg::Matrixd::ortho(-1.5, 1.5, -1.5, 1.5, -10.0, 10.0));
     3     compass->setPlate(createCompassPart("d:\a.png", 1.5f, -1.0f)); //圆盘图片
     4     compass->setNeedle(createCompassPart("d:\b.png", 1.5f, 0.0f));//指针图片
     5     compass->setWidthHeight(100,100,100,100); //起始点、宽高
     6     compass->setMainCamera(m_pViewer->getCamera());
     7 
     8     compass->setRenderOrder(osg::Camera::POST_RENDER);
     9     compass->setClearMask(GL_DEPTH_BUFFER_BIT);
    10     compass->setAllowEventFocus(false);
    11     compass->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
    12     compass->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
    13     compass->getOrCreateStateSet()->setMode(GL_BLEND, osg::StateAttribute::ON);
    14 
    15     m_pRoot->addChild(compass); //加入跟节点
    View Code
    createCompassPart函数
     1 osg::MatrixTransform *Widget::createCompassPart(const std::string &image, float radius, float height)
     2 {
     3     osg::Vec3 center(-radius, -radius, height);
     4     osg::ref_ptr<osg::Geode> geode = new osg::Geode;
     5     geode->addDrawable(
     6         createTexturedQuadGeometry(center, osg::Vec3(radius*2.0f, 0.0f, 0.0f), osg::Vec3(0.0f, radius*2.0f, 0.0f)));
     7 
     8     osg::ref_ptr<osg::Texture2D> texture = new osg::Texture2D;
     9     texture->setImage(osgDB::readImageFile(image));
    10 
    11     osg::ref_ptr<osg::MatrixTransform> part = new osg::MatrixTransform;
    12     part->getOrCreateStateSet()->setTextureAttributeAndModes(0, texture.get());
    13     part->getOrCreateStateSet()->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);
    14     part->addChild(geode.get());
    15     return part.release();
    16 }
    View Code
    作者:疯狂Delphi
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

    欢迎关注我,一起进步!扫描下方二维码即可加我

  • 相关阅读:
    1015
    1016
    1014
    1002
    1010
    1006
    动态规划1001
    动态规划1002
    使用EF框架调用带有输出参数(output)的存储过程
    工程地质相关知识
  • 原文地址:https://www.cnblogs.com/FKdelphi/p/15406627.html
Copyright © 2020-2023  润新知