zoukankan      html  css  js  c++  java
  • 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
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

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

  • 相关阅读:
    Chrome cookies folder
    Fat URLs Client Identification
    User Login Client Identification
    Client IP Address Client Identification
    HTTP Headers Client Identification
    The Personal Touch Client Identification 个性化接触 客户识别
    购物车 cookie session
    购物车删除商品,总价变化 innerHTML = ''并没有删除节点,内容仍存在
    453
    购物车-删除单行商品-HTMLTableElement.deleteRow()
  • 原文地址:https://www.cnblogs.com/FKdelphi/p/15406627.html
Copyright © 2011-2022 走看看