Day01

1.打开VS,选择【新建】-【visual C++】-【win32】-【win32控制台应用程序】。

2.在解决资源方案管理器中, 右击【源文件】-【添加】-【新建项】 -【C++文件.cpp】

3右键项目,选择“属性”,选择“VC++目录”,

在包含目录添加:C:\OSG\include

在库目录添加:C:\OSG\lib.

(以上两个目录所在文件均为此前配置环境时设置的路径)

4.打开项目【属性】-【链接器】-【输入】-【附加依赖项】加上:

OpenThreadsd.lib

osgd.lib

osgDBd.lib

osgUtild.lib

osgGAd.lib

osgViewerd.lib

osgTextd.lib

osgFXd.lib

osgManipulatord.lib

osgParticled.lib

osgShadowd.lib

osgSimd.lib

osgTerraind.lib

5. 在 main.cpp 中输入以下代码:

#include <osgDB/ReadFile>

#include <osgViewer/Viewer>

void main()

{

osgViewer::Viewer viewer;

viewer.setSceneData(osgDB::readNodeFile("glider.osg"));

viewer.realize();

viewer.run();

}

运行后显示为一架滑翔机:

6.代码解释:

#include <osgDB/ReadFile>

#include <osgViewer/Viewer>

这里是包含头文件,可以打开 OSG 的安装目录,发现应该存在 osgViewer 和 osgDB 的文件夹, 而 ReadFile 和 Viewer 都是其中的头文件。

osgViewer::Viewer viewer;

这里申请了一个 viewer,这里要解释一下,为什么要 osgViewer::Viewer, osgViewer 是名字空间, 与 std::的地位是一样的,关于名字间是 C++防止重名的很重要的一个机制,从而使程序看起来井井有条。 这里你可以理解为申请一个观察器,该观察可以查看模型就可以了,在现实中我们也是叫 Viewer 的。 比如,你的 Viewer 写的有问题,用 Viewer 等等打招乎语。注意这里申请的并非一个指针,而实是一个 对象实体。

viewer.setSceneData(osgDB::readNodeFile("glider.osg"));

这里是设置观察器Viewer中的数据,"glider.osg"即为所要观察的数据,观察的数据要有路径,比如:viewer.setSceneData(osgDB::readNodeFile("C://glider.osg")); 其中//为转义字符,编译器会识别为/。不要设置中文路径及空格。

viewer.realize();

这个语句表达的意思非常多,事实上可以定位到 Viewer.cpp 的第 377 行,会发现里面的操作非常 多,可以理解为这是在渲染前的最后一步,会检查和设置图形上下文,屏幕啊什么的,会让你以前的 设置,对 Viewer 的设置都生效。

viewer.run();

开始渲染。

7.改进刚才的HelloWorld项目的代码,增加以下功能需求,点击 S 键会显示帧速,点击 W 键会显示网格,点击 L 键灯光会开启等功能。

8.代码添加及修改

#include <osgDB/ReadFile>

#include <osgViewer/Viewer>

#include <osgViewer/ViewerEventHandlers>

#include <osgGA/StateSetManipulator>

void main()

{

osgViewer::Viewer viewer;

viewer.setSceneData(osgDB::readNodeFile("glider.osg"));

//添加状态事件

viewer.addEventHandler( new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()) );

//窗口大小变化事件

viewer.addEventHandler(new osgViewer::WindowSizeHandler);

//添加一些常用状态设置

viewer.addEventHandler(new osgViewer::StatsHandler);

viewer.realize();

viewer.run();

}

运行后会按相应按键会有相应效果出现。

9.代码解释:

//添加状态事件

viewer.addEventHandler( new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()) );

从函数的意思上来看是添加一个事件句柄,可以理解为添加一个响应,鼠标或是键盘的,这个响 应可以看做响应键盘或是鼠标事件,故函数名字叫:addEventHandler[添加事件句柄]。这个事件是库 中自己写好的,叫做状态设置

(new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet())),其中我们点击 L 键时有操作器 的味道,所以叫状态设置操作器。众所周知,灯光是状态控制的,所以这句话可以控制 L 键开启与关 闭灯光,至于为什么定位在 L 键上,怎么搞的,可以查看 StateSetManipulator 源码,我们以后也会写自 己的操作器。发现默认的灯光比加强的 L 灯光好看一些,这是这个模型,大多数情况下都不是这样的。

//窗口大小变化事件

viewer.addEventHandler(new osgViewer::WindowSizeHandler);

添加的是窗口大小改变的句柄,这里响应的是 F 键,与上面的原理是差不多。

//添加一些常用状态设置

viewer.addEventHandler(new osgViewer::StatsHandler);

添加常用的状态操作,这里会响应 S 键,W 键等等,原理与上述两个是一样的。

10.设置操作器,代码如下:

#include <osgDB/ReadFile>

#include <osgViewer/Viewer>

#include <osgViewer/ViewerEventHandlers>

#include <osgGA/TrackballManipulator>

#include <osgGA/FlightManipulator>

#include <osgGA/DriveManipulator>

#include <osgGA/KeySwitchMatrixManipulator>

#include <osgGA/StateSetManipulator>

#include <osgGA/AnimationPathManipulator>

#include <osgGA/TerrainManipulator>

void main()

{

osgViewer::Viewer viewer;

viewer.setSceneData(osgDB::readNodeFile("glider.osg"));

//添加状态事件

viewer.addEventHandler( new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()) );

//窗口大小变化事件

viewer.addEventHandler(new osgViewer::WindowSizeHandler);

//添加一些常用状态设置

viewer.addEventHandler(new osgViewer::StatsHandler);

{

osg::ref_ptr<osgGA::KeySwitchMatrixManipulator> keyswitchManipulator = new osgGA::KeySwitchMatrixManipulator;

keyswitchManipulator->addMatrixManipulator( '1', "Trackball", new osgGA::TrackballManipulator() );

keyswitchManipulator->addMatrixManipulator( '2', "Flight", new osgGA::FlightManipulator() );

keyswitchManipulator->addMatrixManipulator( '3', "Drive", new osgGA::DriveManipulator() );

keyswitchManipulator->addMatrixManipulator( '4', "Terrain", new osgGA::TerrainManipulator() );

viewer.setCameraManipulator( keyswitchManipulator.get() );

}

//添加路径记录

viewer.addEventHandler(new osgViewer::RecordCameraPathHandler);

viewer.realize();

viewer.run();

}

按下按键1、2、3、4后,模型会根据鼠标操作产生不同的动作,按下大写Z,然后鼠标拖动模型,再按下小写鼠标z,就会记录你刚才的模型运动轨迹。

如:"Trackball" "Flight" "Drive" "Terrain"均为不同的运动轨迹模式。

11.代码解释:

osg::ref_ptr<osgGA::KeySwitchMatrixManipulator> keyswitchManipulator = new osgGA::KeySwitchMatrixManipulator;

申请一个使用按键来换操作器的类,即:osgGA::KeySwitchMatrixManipulator,意思是往这个类中添操作器,添的时候带标识符和快捷键,然后再把这个类添加到 viewer 当中,这样 viewer 运行的时候就可以通过按键来换操作器了。

keyswitchManipulator->addMatrixManipulator( '1', "Trackball", new osgGA::TrackballManipulator() );

keyswitchManipulator->addMatrixManipulator( '2', "Flight", new osgGA::FlightManipulator() );

keyswitchManipulator->addMatrixManipulator( '3', "Drive", new osgGA::DriveManipulator() );

keyswitchManipulator->addMatrixManipulator( '4', "Terrain", new osgGA::TerrainManipulator() );

申请一些操作器,把这些操作器加入到“用按键来换操作器的类”中。

在osg的帮助文档中可以查看到关于addMatrixManipulator方法的相关信息:

方法的第三个参数类型为 CameraManipulator,为一个抽象类,与代码中的 TrackballManipulator FlightManipulator DriveManipulator TerrainManipulator方法关系如下:

viewer.setCameraManipulator( keyswitchManipulator.get() );

把这个“用按键来换操作器的类”添加到 viewer 当中去,这样就可以用键来激活这些操作器。

viewer.addEventHandler(new osgViewer::RecordCameraPathHandler);

把路径记录的功能添加到 viewer 当中,和添加状态是一样的。

(一)OSG初学者入门基础教程相关推荐

  1. (二)OSG初学者入门基础教程

    Day02 13.模型的简单控制:在场景中添加多个模型 #include<osgViewer/Viewer> #include<osgDB/ReadFile> #include ...

  2. java入门基础教程(纯干货知识点+视频资源)

    本套Java视频教程是黑马程序员冯老师精心录制的Java基础班视频,该视频专门针对零基础的学员录制,授课讲究通俗易懂.干货.通过该套Java视频教程的学习,相信你能够轻轻松松地入门java语言. 完整 ...

  3. Hadoop新手篇:hadoop入门基础教程

    Hadoop新手篇:hadoop入门基础教程 关于hadoop的分享此前一直都是零零散散的想到什么就写什么,整体写的比较乱吧.最近可能还算好的吧,毕竟花了两周的时间详细的写完的了hadoop从规划到环 ...

  4. c++语言while循环,c++ c语言while 循环语句入门基础教程

    c++ c语言while 循环语句入门基础教程 我们来看While 循环语句,它跟 For 循环区别在于,For 循环一般知道循环次数,在第一行里头就指明了,而while循环一般不知道循环次数,下面我 ...

  5. python基础教程运行程序_Python入门基础教程:WSGI

    原标题:Python入门基础教程:WSGI WSGI 简介 WSGI 是什么 WSGI 是 Python Web Server Gateway Interface 的缩写,是描述 Web 服务器与 P ...

  6. Hadoop入门基础教程 Hadoop之单词计数

    单词计数是最简单也是最能体现MapReduce思想的程序之一,可以称为MapReduce版"Hello World",该程序的完整代码可以在Hadoop安装包的src/exampl ...

  7. Hadoop入门基础教程 Hadoop之完全分布式环境搭建

    上一篇我们完成了Hadoop伪分布式环境的搭建,伪分布式模式也叫单节点集群模式, NameNode.SecondaryNameNode.DataNode.JobTracker.TaskTracker所 ...

  8. Python学习入门基础教程(learning Python)--5.6 Python读文件操作高级

    前文5.2节和5.4节分别就Python下读文件操作做了基础性讲述和提升性介绍,但是仍有些问题,比如在5.4节里涉及到一个多次读文件的问题,实际上我们还没有完全阐述完毕,下面这个图片的问题在哪呢? 问 ...

  9. python入门基础教程-Python入门基础教程:WSGI

    原标题:Python入门基础教程:WSGI WSGI 简介 WSGI 是什么 WSGI 是 Python Web Server Gateway Interface 的缩写,是描述 Web 服务器与 P ...

最新文章

  1. 干货丨从基础知识到实际应用,一文了解「机器学习非凸优化技术」
  2. VC 下 64bit 整数的显示和读取格式化字串
  3. 数论 - 简单数位推理 --- NYIST 514
  4. JVM发生频繁 CMS GC,罪魁祸首是这个参数!
  5. 蓄电池的容量及内阻测试
  6. 【学习笔记】FI-AR模块概述
  7. 如何实现Spark on Kubernetes?
  8. 作为前阿里人,来扒一扒中台皇帝的外衣!
  9. 电源模块怎么选?以下6点你都知道吗?
  10. mysql 永真_sql注入
  11. 详细记录丨Realtek RTL8188FU WiFi 驱动移植
  12. 只需2步,教你在Vue中设置登录验证拦截
  13. Assets.car 解压工具 cartool 使用报错 segmentation fault cartool 解决方案
  14. 慕课网仿去哪儿项目笔记--(五)-详情页面的开发
  15. Android常见面试题字节跳动、阿里、腾讯2019实习生Android岗部分面试题
  16. mysql relay_log删除_mysql 删除 relay log 方法
  17. 三种古典密码的认识(置换密码,代换密码和轮换密码)
  18. 布同:基于JQuery的五子棋人机对战游戏设计与制作
  19. SHELL编程基础 By jackie
  20. 线程池函数1 - 异步调用函数

热门文章

  1. 雨课堂刷视频Python脚本
  2. ios 真机运行:The app ID cannot be registered to your development team
  3. matlab的模型文件扩展名,[转载]matlab simulink基础知识
  4. CUDA 学习——线程协助(CUDA实战 第五章)
  5. Vrpn源码浅析(三)-添加optitrack追踪设备
  6. PrimoCache2.2.0汉化程序与2.0.0的交叉使用
  7. 【FFMpeg 命令行】基本应用
  8. Nvjdc(诺兰)再续经典——诺兰方舟ARK
  9. 广度优先搜索BFS-P3456 [POI2007]GRZ-Ridges and Valleys
  10. 计算机水平二级指什么,全国计算机二级是什么