
osg
wb175208
这个作者很懒,什么都没留下…
展开
-
Qt调用OSGEarth出现的崩溃问题
在QT5.10中调用OSG,代码已经添加上去了,编译和链接都没有问题,但是运行的时候出现了崩溃。崩溃的位置和信息如下:调用堆栈信息如下:解决方案:生成可执行文件(*.exe)工程中修改工作目录,修改为exe生成的工作目录原来的:修改为:...原创 2021-06-25 08:45:49 · 880 阅读 · 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 · 1610 阅读 · 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 · 3285 阅读 · 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 · 2631 阅读 · 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 · 2773 阅读 · 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 · 3442 阅读 · 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 · 1360 阅读 · 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 · 1003 阅读 · 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 · 1083 阅读 · 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 · 1425 阅读 · 1 评论 -
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 · 1482 阅读 · 0 评论 -
osg图形设备接口和视景器
在Camera的类成员函数中,setGraphicsContext()这个函数的主要工作就是设置相机对应图形设备对象。GraphicsContext就是图形设备设备对象的载体,是任意图形子系统的抽象层接口,它提供了统一的图形设备操作函数,用于实现渲染结果和底层设备的交互,具有平台无关性。图形设备对象的主要工作就是提供场景渲染结果的载体。这个载体可以显示缓存,进而绘制到一个图形窗口中。Grap...原创 2019-03-21 15:52:48 · 814 阅读 · 0 评论 -
osg节点访问器
定义好三维的节点场景之后,有时会需要访问其中的节点,包括从头至尾的访问,或者从先向上的访问,这样就需要一个访问器。osg::NodeVisitor就是这样的一个访问器。它遍历场景节点有几种方式:TRAVERSE_NONE - 仅访问当前节点,不继续遍历TRAVERSE_PARENTS - 向父节点推进TRAVERSE_ALL_CHILDREN - 向子节点推进函数: void tra...原创 2019-03-12 23:35:06 · 922 阅读 · 0 评论 -
osg节点说明
osg中数据组织是以树形结构组成的,看一下下面类图:osg::Geode和osg::Group节点都是继承自osg::Node。Geode是叶节点,也就是不会再有子节点。叶节点的工作主要是保存可绘制物体。管理的节点都是继承自Drawable这个类,有一个或者多个Drawable对象。Group组节点最为根节点或者其他节点。管理者众多其他的节点。常用的节点总结:空间变换节点:它可以改变...原创 2019-03-12 19:11:00 · 2116 阅读 · 0 评论 -
osg场景坐标
osg三维世界中,会使用到几个不同的坐标系统,下面会讲解几个常用概念,通过使用照相机拍照的过程进行类比:一、模型视点变换这个过程就相当于我们拍照时调整被拍摄物体的位置和姿态以及调整相机的位置和姿态。物体的位置和姿态成为模型变换;相机的位置和姿态称为视点变换,这两种变换在一起统称为模型视点变换。相机的位置和姿态又三个参数来决定:视点位置eye、参考点位置center和视点向上位置up。在拍摄...原创 2019-03-20 20:35:59 · 1736 阅读 · 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 · 1428 阅读 · 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 · 2949 阅读 · 4 评论 -
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 · 1841 阅读 · 0 评论 -
osg键盘消息处理
osg中主要使用osgGA库来处理用户的交互动作的,通常使用GUIEventAdapter类作为系统交互事件和OSG交互事件的适配接口。通过一个示例,通过键盘来控制模型的显隐:#pragma once#include "osgInc.h"class KeyboardHandler : public osgGA::GUIEventHandler {public: KeyboardHan...原创 2019-03-23 09:09:50 · 668 阅读 · 0 评论 -
osg设置回调接口
osg的回调有两种回调方式:更新回调和人机交互事件回调。前者是在场景渲染每一帧的时候调用,后者是由用户交互事件触发。osg更新回调继承类osg::NodeCallback,是通过回调可以控制每帧运行过程中的行为。通过函数void addCullCallback (NodeCallback *nc)设置回调对象。通过回调实现一个动画效果:定义回调函数:#pragma once#i...原创 2019-03-13 15:36:40 · 763 阅读 · 0 评论 -
osg开关节点
osg中控制节点显隐的节点Switch。利用上一篇文章中的回调过程,实现节点的动态显示与隐藏。先看效果:定义回调对象:#pragma once#include "osgInc.h"class SwitchCallBack :public osg::NodeCallback {public: SwitchCallBack(); ~SwitchCallBack(); virtu...原创 2019-03-13 16:47:47 · 516 阅读 · 0 评论 -
osg细节层次节点
osg中LOD细节层次节点,在不影响场景渲染结果的情况下,更具场景和观察者的距离,从多个预置方案中选择一个更为加单的方式显示,从而减少场景绘制的负担。也就是说:可以设置不同的节点,在场景中距离远近的显示效果,在距离比较远的时候,就显示面数比较少的模型或者隐藏模型。在距离比较近的时候显示的比较全或者显示面数比较多的模型。先看显示效果:void createLOD() { osg::ref_...原创 2019-03-13 18:45:00 · 946 阅读 · 1 评论 -
osg漫游器
在三维中常见的就是漫游整个场景,所谓漫游就是:观察者的视线从一个位置移动到另外一个位置或者在希望的方向上移动。在OSG中漫游可以通过改变观察者(相机)的位置和姿态来实现。三维世界中的模型的相对位置和形态不会发生变化,只是观察者的角度和位置发生了变化。常见的漫游器设计是不会考虑观察者的物理变化的,只会观察视觉运动的正确性,使观察者平滑的移动到指定的位置和姿态。设计漫游器的过程就是设置合适的相机...原创 2019-03-24 13:07:10 · 1961 阅读 · 0 评论 -
OSG文件数据格式
OSG场景数据格式,可以记录场景书结构的所有节点及其属性信息。它属于文本文件类型,不需要专门的编辑器。使用OSG自带的osgViewer.exe可以快速的浏览osg文件的内容;使用osgconv可以使文件在osg和其他数据格式中进行装换。osg文件格式主要遵循以下几个准则:对象类型、属性类型、属性值之间使用空格键和回车键进行分割;父子节点,以及页节点与可绘制体之间的层次关系有大括号来区...原创 2019-04-02 10:35:02 · 5877 阅读 · 0 评论 -
OSG场景裁剪
裁剪:从场景中按照一定的规则选择一部分场景模型删除。常见的裁剪技术:背面裁剪:当我们观察一个不透明的物体时,通常大约有一半的物体表面是看不到的,因此完全可以省去这一半的绘制工作,场景的多边形复杂程度因此降低1/2左右。视锥体裁剪:将每个物体的包围球与当前的视锥体进行比较,如果包围球在视锥体之外,那么就不需要绘制包围球内的节点和所有的子节点;否则就要做进一步的比较运算;细节裁剪:场景中某些...原创 2019-04-03 13:32:28 · 2478 阅读 · 0 评论 -
OSG场景数据的动态加载
OSG在实际使用过程中会加载大量的场景数据,然而大量数据的加载又对计算机的性能提出了更高的要求,会对计算系统造成极大的负担。虽然可以通过裁剪等方法可以保证每一帧只用有一部分数据显示或者使用LOD来牺牲一部分显示质量来换取效率的提升,但是这些都不能解决大量数据读入内存的问题。那么,OSG的数据分页技术就产生了。数据的分页也就是数据的动态调度机制:在显示当前场景的同时,预判断下一步可能载入的数据...原创 2019-04-04 08:34:20 · 3046 阅读 · 5 评论 -
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 · 849 阅读 · 0 评论 -
OSG新建图形并且添加上材质纹理和透明度
直接上代码:osg::ref_ptr<osg::Geode> createBox() { osg::ref_ptr<osg::Geode> geode = new osg::Geode; osg::ref_ptr<osg::TessellationHints> hits = new osg::TessellationHints; h...原创 2018-05-30 16:34:06 · 2399 阅读 · 1 评论 -
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 · 626 阅读 · 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 · 1124 阅读 · 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 · 5795 阅读 · 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 · 1718 阅读 · 0 评论 -
OSG在QT的中显示之一
之前写过关于OSG的一些文章,主要是以基础为主,但是结合QT来显示还没有写过。OSG和QT结合显示有单独的类:GraphicsWindowQt。如果编译过程中没有把这个类编译成库文件,可以直接在源码中拷贝出来,把头文件和cpp文件修改一下文件名就可以了,然后把修改好的.h和.cpp加入到工程中。环境:VS2015+QT5.10+64位+OSG3.5.1把环境设置好,头文件目录、链接文件目录...原创 2019-01-30 00:41:13 · 3454 阅读 · 9 评论 -
OSG碰撞检测
简单一个碰撞检测: 一条直线和一个正方体是否有交点:#include "../Common.h"osg::ref_ptr<osg::Geode> createGeode();int main() { osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer; viewer...原创 2018-06-08 15:23:22 · 2106 阅读 · 0 评论 -
OSG控制漫游二
添加鼠标控制场景: 按下鼠标左键左右拖动,场景左右移动; 按下鼠标左键上下拖动,场景上下移动。//记录坐标int mLeftX, mLeftY;bool mLeftDown;bool TravelManipulator::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& us) { ...原创 2018-06-06 17:03:33 · 462 阅读 · 1 评论 -
OSG控制漫游
编写一个类来做控制器:分别实现WSAD上下左右功能:#pragma once#include "../Common.h"class TravelManipulator :public osgGA::CameraManipulator {public: TravelManipulator(); ~TravelManipulator();public: //设置...原创 2018-06-06 15:17:32 · 1275 阅读 · 0 评论 -
OSG创建基本图形
直接上代码:osg::ref_ptr&lt;osg::Node&gt; createSimple() { osg::ref_ptr&lt;osg::Geode&gt; geode = new osg::Geode; osg::ref_ptr&lt;osg::Geometry&gt; geo = new osg::Geometry; //申请一些顶点 os原创 2018-05-30 17:58:33 · 1184 阅读 · 0 评论 -
osg定时器和记录路径
1.OSG本身自带的定时器可以很好的记录程序运行的时间:int main() { osg::ref_ptr&lt;osgViewer::Viewer&gt; viewer = new osgViewer::Viewer(); viewer-&gt;addEventHandler( new osgViewer::WindowSizeHandler ); osg::ref...原创 2018-05-29 23:42:32 · 1520 阅读 · 0 评论 -
OSG:一个简单的模型控制类
#pragma once#include "../Common.h"class NodeMatrix : public osg::MatrixTransform {public: NodeMatrix(); ~NodeMatrix();public: /** 第一个参数:坐标原点 第二个参数:坐标轴 第三个参数:旋转角度 */ ...原创 2018-06-05 17:20:34 · 450 阅读 · 0 评论 -
OSG使用矩阵实现简单动画
直接上代码:osg::ref_ptr&lt;osg::Group&gt; createMatrix() { osg::ref_ptr&lt;osg::Group&gt; root = new osg::Group; osg::ref_ptr&lt;osg::Node&gt; node1 = new osg::Node; node1 = osgDB::readNod...原创 2018-06-05 09:33:36 · 450 阅读 · 0 评论