
osg
wb175208
这个作者很懒,什么都没留下…
展开
-
Qt调用OSGEarth出现的崩溃问题
在QT5.10中调用OSG,代码已经添加上去了,编译和链接都没有问题,但是运行的时候出现了崩溃。崩溃的位置和信息如下:调用堆栈信息如下:解决方案:生成可执行文件(*.exe)工程中修改工作目录,修改为exe生成的工作目录原来的:修改为:...原创 2021-06-25 08:45:49 · 909 阅读 · 0 评论 -
OsgEarth添加圆锥体
#pragma once#include <osg/Node>#include <osg/MatrixTransform>#include "Pendant.h"//三维实体的圆锥波束class WaveBeamCone :public Pendant {public: WaveBeamCone(); ~WaveBeamCone(); void clearSelf()override; //创建圆锥形波束 void createWaveBeamCone原创 2020-12-11 17:25:30 · 1642 阅读 · 3 评论 -
osgEarth添加模型及其标牌
osg::ref_ptr<osg::MatrixTransform> EarthMapManager::add3DModel(std::string nodePath, double lon, double lat, double alt) { //添加模型 osg::ref_ptr<osg::Node> nodeFile = osgDB::readNodeFile(nodePath); osg::ref_ptr<osg::MatrixTransform> node原创 2020-10-28 16:53:31 · 3317 阅读 · 0 评论 -
osgEarth添加线特征
部分关键代码: osgEarth::Annotation::FeatureNode* pathNode = 0; osgEarth::Symbology::Geometry* path = new osgEarth::Symbology::LineString(); Track*track = dynamic_cast<Track*>(entity->getProperty(PS_TRACK)); if (track == nullptr) { return; } st.原创 2020-10-23 10:59:46 · 2677 阅读 · 0 评论 -
OSGEarth显示经纬度标牌
如下图所示:MouseIntersection.h#ifndef MOUSEINTERSECTION_H#define MOUSEINTERSECTION_H#include <osgGA/GUIEventHandler>#include <osgEarthUtil/Controls>//经纬度标牌显示class MouseIntersection : public osgGA::GUIEventHandler {public: MouseIntersect原创 2020-10-23 10:56:06 · 2820 阅读 · 5 评论 -
OsgEarth显示地图
添加一个地球显示和管理类#pragma once#include <QObject.h>#include <osg/Node>#include <osgViewer/Viewer>#include <osgGA/TrackballManipulator>#include <osgDB/ReadFile>#include <osgDB/WriteFile>#include <osgViewer/ViewerEvent原创 2020-10-23 10:49:33 · 3483 阅读 · 1 评论 -
使用CMake编译OsgEarth
编译OsgEarth之前需要编译依赖的Lib:1.编译OSGVS2015+QT5.10+x64编译OSG2.编译Geos使用CMake编译Geos3.5.03.编译GDAL使用nmake编译gdal-已成功4.编译OsgEartha、新建文件夹F:\vs2015\osg_build\build_step\gwaldron-osgearth-1faf43a\build_vs2015_x64\installb.配置CMake点击【Configure】c.重新配置CMake选项d原创 2020-09-23 14:27:32 · 1382 阅读 · 0 评论 -
VS2015+QT5.10+x64编译OSG
一、准备1.源码库以上是编译OSG所需要的库源码,版本如下:osg-3rdparty-cmake-master:/curl/curl-7.60.0/freetype/freetype-2.9.1/giflib/giflib-5.1.4/glut/glut-3.7/jpeg/jpeg-9c/libpng/libpng-1.6.36/libtiff/libtiff-v4.0.10/minizip/minizip-1.2.0/zlib/zlib-1.2.11proj-4.9.原创 2020-09-22 19:28:59 · 1013 阅读 · 0 评论 -
osg缩放和平移模型
void OsgCanvas4::init() { int w = width(); int h = height(); _graphicsWindow = new osgViewer::GraphicsWindowEmbedded(0, 0, w, h); _viewer = new osgViewer::Viewer; osg::ref_ptr<osg::Camera> camera = new osg::Camera /*_viewer->getCamera()*/;原创 2020-06-30 23:35:10 · 1106 阅读 · 0 评论 -
利用Qt来显示OSG并且设置相机的位置
#pragma once#include <qopenglwidget>#include <osgViewer/Viewer>#include <osg/Node>class OsgCanvas2 :public QOpenGLWidget {public: OsgCanvas2(QWidget *parent); ~OsgCanvas2();private: void init(); virtual void initializeGL();原创 2020-06-23 22:42:21 · 1443 阅读 · 1 评论 -
OSG在QT的中显示之三
之前的时候写过关于OSG在QT中显示的文章。OSG在QT的中显示之一和OSG在QT的中显示之二就是运用了比较简单的方式实现了,OSG在QT中的显示,显示使用QOpenGLWidget来实现。#pragma once#include <QOpenGLWidget>#include <osgViewer/Viewer>class QMouseEvent;cla...原创 2019-10-06 21:52:37 · 863 阅读 · 0 评论 -
OSG场景数据的动态加载
OSG在实际使用过程中会加载大量的场景数据,然而大量数据的加载又对计算机的性能提出了更高的要求,会对计算系统造成极大的负担。虽然可以通过裁剪等方法可以保证每一帧只用有一部分数据显示或者使用LOD来牺牲一部分显示质量来换取效率的提升,但是这些都不能解决大量数据读入内存的问题。那么,OSG的数据分页技术就产生了。数据的分页也就是数据的动态调度机制:在显示当前场景的同时,预判断下一步可能载入的数据...原创 2019-04-04 08:34:20 · 3056 阅读 · 5 评论 -
OSG场景裁剪
裁剪:从场景中按照一定的规则选择一部分场景模型删除。常见的裁剪技术:背面裁剪:当我们观察一个不透明的物体时,通常大约有一半的物体表面是看不到的,因此完全可以省去这一半的绘制工作,场景的多边形复杂程度因此降低1/2左右。视锥体裁剪:将每个物体的包围球与当前的视锥体进行比较,如果包围球在视锥体之外,那么就不需要绘制包围球内的节点和所有的子节点;否则就要做进一步的比较运算;细节裁剪:场景中某些...原创 2019-04-03 13:32:28 · 2495 阅读 · 0 评论 -
OSG文件数据格式
OSG场景数据格式,可以记录场景书结构的所有节点及其属性信息。它属于文本文件类型,不需要专门的编辑器。使用OSG自带的osgViewer.exe可以快速的浏览osg文件的内容;使用osgconv可以使文件在osg和其他数据格式中进行装换。osg文件格式主要遵循以下几个准则:对象类型、属性类型、属性值之间使用空格键和回车键进行分割;父子节点,以及页节点与可绘制体之间的层次关系有大括号来区...原创 2019-04-02 10:35:02 · 5897 阅读 · 0 评论 -
osg漫游器
在三维中常见的就是漫游整个场景,所谓漫游就是:观察者的视线从一个位置移动到另外一个位置或者在希望的方向上移动。在OSG中漫游可以通过改变观察者(相机)的位置和姿态来实现。三维世界中的模型的相对位置和形态不会发生变化,只是观察者的角度和位置发生了变化。常见的漫游器设计是不会考虑观察者的物理变化的,只会观察视觉运动的正确性,使观察者平滑的移动到指定的位置和姿态。设计漫游器的过程就是设置合适的相机...原创 2019-03-24 13:07:10 · 1981 阅读 · 0 评论 -
OSG在QT的中显示之二
利用QT在界面显示OSG模型,之前写过一篇文章OSG在QT的中显示,现在更新一下。#include <QtWidgets/QMainWindow>#include "ui_QtGuiOSG.h"#include "osgInc.h"class QtGuiOSG : public QMainWindow { Q_OBJECTpublic: QtGuiOSG(QWid...原创 2019-03-23 16:09:14 · 2970 阅读 · 4 评论 -
osg键盘消息处理
osg中主要使用osgGA库来处理用户的交互动作的,通常使用GUIEventAdapter类作为系统交互事件和OSG交互事件的适配接口。通过一个示例,通过键盘来控制模型的显隐:#pragma once#include "osgInc.h"class KeyboardHandler : public osgGA::GUIEventHandler {public: KeyboardHan...原创 2019-03-23 09:09:50 · 682 阅读 · 0 评论 -
osg使用多视景展示多个视图
先看效果:代码就比较简单了:void createMulitViewer() { osg::ref_ptr<osgViewer::Viewer> viewer1 = new osgViewer::Viewer; viewer1->setUpViewInWindow(0, 50, 320, 240); viewer1->addEventHandler(new os...原创 2019-03-22 08:51:35 · 1495 阅读 · 0 评论 -
osg图形设备接口和视景器
在Camera的类成员函数中,setGraphicsContext()这个函数的主要工作就是设置相机对应图形设备对象。GraphicsContext就是图形设备设备对象的载体,是任意图形子系统的抽象层接口,它提供了统一的图形设备操作函数,用于实现渲染结果和底层设备的交互,具有平台无关性。图形设备对象的主要工作就是提供场景渲染结果的载体。这个载体可以显示缓存,进而绘制到一个图形窗口中。Grap...原创 2019-03-21 15:52:48 · 830 阅读 · 0 评论 -
osg场景坐标
osg三维世界中,会使用到几个不同的坐标系统,下面会讲解几个常用概念,通过使用照相机拍照的过程进行类比:一、模型视点变换这个过程就相当于我们拍照时调整被拍摄物体的位置和姿态以及调整相机的位置和姿态。物体的位置和姿态成为模型变换;相机的位置和姿态称为视点变换,这两种变换在一起统称为模型视点变换。相机的位置和姿态又三个参数来决定:视点位置eye、参考点位置center和视点向上位置up。在拍摄...原创 2019-03-20 20:35:59 · 1754 阅读 · 0 评论 -
osg 雾效果
osg具有雾效果,也是非常简单可以实现的。先看一下效果:设置回调函数:#pragma once#include <osg/StateSet>class FogCallBack : public osg::StateSet::Callback {public: FogCallBack(); ~FogCallBack(); virtual void operator(...原创 2019-03-20 16:33:35 · 1465 阅读 · 0 评论 -
osg字体显示-居中显示
先看示例图:void createText3() { osg::ref_ptr<osg::Group> root = new osg::Group; osg::ref_ptr<osg::Node> cowNode = osgDB::readNodeFile("cow.osgt"); //获取节点包围盒 osg::ComputeBoundsVisitor bou...原创 2019-03-20 12:45:43 · 640 阅读 · 0 评论 -
osg字体显示
osg中字体一般都是通过的Text来实现的,继承自TextBase设置字体并且和屏幕平行显示;void createText2() { osg::ref_ptr<osg::Group> root = new osg::Group; osg::ref_ptr<osg::Node> cowNode = osgDB::readNodeFile("cow.osgt")...原创 2019-03-20 11:15:04 · 1134 阅读 · 0 评论 -
osg显示图片
osg读取文件图片使用的类是:DrawPixels原始图片:裁剪之后运行效果:运行代码:void createImage() { osg::ref_ptr<osg::Group> root = new osg::Group; osg::ref_ptr<osg::Geode> geode = new osg::Geode; osg::ref_ptr<...原创 2019-03-14 14:03:53 · 2838 阅读 · 2 评论 -
osg绘制回调
上一篇文章讲解了如何绘制一个几何图形,那么在绘制的时候如何控制绘制的过程呢?还是使用到了回调osg::Drawable::UpdateCallback定义回调类:#pragma once#include <osg/Drawable>class GeoCallBack : public osg::Drawable::UpdateCallback {public: Geo...原创 2019-03-14 13:33:41 · 781 阅读 · 0 评论 -
osg基本绘制-线
osg绘制图形需要定义最基本的顶点坐标数组。绘制几何图形需要osg::Geometry这个类,他就是负责几何体的绘制。void create4Geo() { osg::ref_ptr<osg::Group> root = new osg::Group; osg::ref_ptr<osg::Geode> geode = new osg::Geode; root-&...原创 2019-03-14 11:36:42 · 8521 阅读 · 6 评论 -
osg细节层次节点
osg中LOD细节层次节点,在不影响场景渲染结果的情况下,更具场景和观察者的距离,从多个预置方案中选择一个更为加单的方式显示,从而减少场景绘制的负担。也就是说:可以设置不同的节点,在场景中距离远近的显示效果,在距离比较远的时候,就显示面数比较少的模型或者隐藏模型。在距离比较近的时候显示的比较全或者显示面数比较多的模型。先看显示效果:void createLOD() { osg::ref_...原创 2019-03-13 18:45:00 · 964 阅读 · 1 评论 -
osg开关节点
osg中控制节点显隐的节点Switch。利用上一篇文章中的回调过程,实现节点的动态显示与隐藏。先看效果:定义回调对象:#pragma once#include "osgInc.h"class SwitchCallBack :public osg::NodeCallback {public: SwitchCallBack(); ~SwitchCallBack(); virtu...原创 2019-03-13 16:47:47 · 531 阅读 · 0 评论 -
osg设置回调接口
osg的回调有两种回调方式:更新回调和人机交互事件回调。前者是在场景渲染每一帧的时候调用,后者是由用户交互事件触发。osg更新回调继承类osg::NodeCallback,是通过回调可以控制每帧运行过程中的行为。通过函数void addCullCallback (NodeCallback *nc)设置回调对象。通过回调实现一个动画效果:定义回调函数:#pragma once#i...原创 2019-03-13 15:36:40 · 780 阅读 · 0 评论 -
osg节点访问器
定义好三维的节点场景之后,有时会需要访问其中的节点,包括从头至尾的访问,或者从先向上的访问,这样就需要一个访问器。osg::NodeVisitor就是这样的一个访问器。它遍历场景节点有几种方式:TRAVERSE_NONE - 仅访问当前节点,不继续遍历TRAVERSE_PARENTS - 向父节点推进TRAVERSE_ALL_CHILDREN - 向子节点推进函数: void tra...原创 2019-03-12 23:35:06 · 934 阅读 · 0 评论 -
osg节点说明
osg中数据组织是以树形结构组成的,看一下下面类图:osg::Geode和osg::Group节点都是继承自osg::Node。Geode是叶节点,也就是不会再有子节点。叶节点的工作主要是保存可绘制物体。管理的节点都是继承自Drawable这个类,有一个或者多个Drawable对象。Group组节点最为根节点或者其他节点。管理者众多其他的节点。常用的节点总结:空间变换节点:它可以改变...原创 2019-03-12 19:11:00 · 2144 阅读 · 0 评论 -
osg节点的包围球
osg数据组织方式采用的是树形节点的组织方式,每个节点都由相应的包围球。void createBound() { osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer; viewer->addEventHandler(new osgViewer::WindowSizeHandler()); osg:...原创 2019-03-11 23:16:05 · 1859 阅读 · 0 评论 -
OSG 绘制一个圆
OSG绘制一个圆,采用的是多个线段收尾连接在一起的办法。查看源码:void createClock() { //设置线宽 osg::ref_ptr<osg::LineWidth> lineSize = new osg::LineWidth; lineSize->setWidth(4.0); //获取根节点 osg::ref_ptr<osg::Group&g...原创 2019-03-11 19:21:49 · 5826 阅读 · 0 评论 -
OSG粒子效果-雪
osg可以实现各种各样角复杂的粒子效果,下面实现一个比较简单的下雪的效果:void createSnow() { osg::ref_ptr<osg::Group> root = new osg::Group; root->addChild(osgDB::readNodeFile("cow.osg")); //设置雪花类 osg::ref_ptr<osgP...原创 2019-03-10 12:23:10 · 1580 阅读 · 1 评论 -
osgEarth显示地球影像
osgEarth是在OSG基础上的显示三维地球的,因为是基于OSGEarth的,所以在使用方式上和OSG是相似的,osgEarth显示的地球影像是通过earth文件来配置的,earth本质上是一个xml文件,配置了地球的投影方式和加载的数据。看一个最基本的earth配置文件。<map name="MyMap" type="geocentric" version="2"> <i...原创 2019-03-04 11:11:40 · 3929 阅读 · 2 评论 -
OSG鼠标点选模型二
上一篇文章中说了,如果使用鼠标点选隐藏模型。当时如果是同一个模型经过缩放或者平移后再次显示出来,也就是就在了一份模型但是通过平移显示出两个模型,点击其中一个模型时候回怎么样?是隐藏当前模型还是隐藏所有同类模型?创建一个这样的场景:void mousePick2() { osg::ref_ptr&lt;osgViewer::Viewer&gt; viewer = new osgViewer:...原创 2019-03-03 21:43:01 · 1236 阅读 · 0 评论 -
OSG鼠标点选模型
OSG鼠标点选模型,选中的模型消失:1.模型路径1.创建两个模型,并且把这两个模型放到Group中,并且注册鼠标点击事件处理void mousePick2() { osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer(); viewer->addEventHandler(new osgViewer...原创 2019-03-01 17:28:53 · 3542 阅读 · 0 评论 -
OSG节点位置变化
OSG中改变模型的位置、姿态或者比例,常用的类有两个:osg::PositionAttitudeTransformosg::MatrixTransform展示效果:代码示例:void mousePick() { osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer(); viewer->...原创 2019-03-01 11:04:47 · 1361 阅读 · 1 评论 -
OSG相机
OSG相机相当于视角,也就是观看模型的视角,每个在三维系统中都会有一个默认的相机也就是默认的视角:osg::Camare的默认朝姿态:位置在 0,0,0姿态是:向下看(Z轴负向 0,0,-1)头向前(Y轴正向 0,1,0,也就是说相机是正着的)void setCamera() { osg::ref_ptr<osgViewer::Viewer> viewer = new os...原创 2019-02-27 19:29:52 · 1962 阅读 · 0 评论 -
OSG 显示字体
OSG显示字体,并且可以设置字体的各种属性:void createText() { osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer(); viewer->addEventHandler(new osgViewer::WindowSizeHandler()); osg::ref_ptr<...原创 2019-02-27 15:15:27 · 1748 阅读 · 0 评论