# （三）OSG初学者入门基础教程

20.超级指针（难点

21.超级指针详解 （难点

Leandro Motta Barros

Start: August 17th 02005

22.超级指针代码解释

SmartPointers.cpp

1 #include <cstdlib>

2 #include <iostream>

3 #include <osg/Geode>

4 #include <osg/Group>

5

6 void MayThrow()

7 {

8 if (rand() % 2)

9 throw "Aaaargh!";

10 }

11

12 int main()

13 {

14 try

15 {

16 srand(time(0));

17 osg::ref_ptr<osg::Group> group (new osg::Group());

18

19 // This is OK, albeit a little verbose.

20 osg::ref_ptr<osg::Geode> aGeode (new osg::Geode());

21 MayThrow();

23

24 // This is quite safe, too.

26

27 // This is dangerous! Don’t do this!

28 osg::Geode* anotherGeode = new osg::Geode();

29 MayThrow();

31

32 // Say goodbye

33 std::cout << "Oh, fortunate one. No exceptions, no leaks.\n";

34 }

35 catch (...)

36 {

37 std::cerr << "’anotherGeode’ possibly leaked!\n";

38 }

39 }

23.代码解释：

srand(time(0));

srand(time(0)) 就是给这个算法一个启动种子，也就是算法的随机种子数，有这个数以后才可以产生随机数,用1970.1.1至今的秒数，初始化随机数种子。
Srand是种下随机种子数，你每回种下的种子不一样，用Rand得到的随机数就不一样。为了每回种下一个不一样的种子，所以就选用Time(0)，Time(0)是得到当前时时间值（因为每时每刻时间是不一样的了）。

20 osg::ref_ptr<osg::Geode> aGeode (new osg::Geode());

21 MayThrow();

28 osg::Geode* anotherGeode = new osg::Geode();

29 MayThrow();

24.移动/旋转/缩放模型

25.代码及解释如下：这部分代码就用到了超级指针

#include<osgViewer/Viewer>

#include <osg/MatrixTransform>

#include <osg/Switch>

#include <osg/Node>

#include <osgViewer/ViewerEventHandlers>

#include <osgGA/StateSetManipulator>

int main(int argc, char **argv)

{

osgViewer::Viewer viewer;

osg::ref_ptr < osg::Group> root = new osg::Group() ;

osg::ref_ptr < osg::Node> glider = osgDB::readNodeFile("glider.osg") ;

osg::ref_ptr < osg::MatrixTransform> trans = new osg::MatrixTransform ;

trans ->setMatrix(osg::Matrix::translate(0, 0, 2)) ;

osg::ref_ptr < osg::MatrixTransform> scale = new osg::MatrixTransform ;

scale ->setMatrix(osg::Matrix::scale(0.5, 0.5, 0.5)*osg::Matrix::translate(0, 0, -2)) ;

osg::ref_ptr < osg::MatrixTransform > rot = new osg::MatrixTransform ;

rot ->setMatrix(osg::Matrix::rotate(osg::DegreesToRadians(45.0), 1, 0, 0)*osg::Matrix::scale(0.5, 0.5, 0.5)*osg::Matrix::translate(4, 0, -2)) ;

//添加状态事件

//窗口大小变化事件

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

viewer.setSceneData(root.get());

viewer.realize();

return viewer.run();

}

osg::ref_ptr < osg::Node> glider = osgDB::readNodeFile("glider.osg") ;

trans ->setMatrix(osg::Matrix::translate(0, 0, 2)) ;

scale ->setMatrix(osg::Matrix::scale(0.5, 0.5, 0.5)*osg::Matrix::translate(0, 0, -2)) ;

rot ->setMatrix(osg::Matrix::rotate(osg::DegreesToRadians(45.0), 1, 0, 0)*osg::Matrix::scale(0.5, 0.5, 0.5)*osg::Matrix::translate(4, 0, -2)) ;

• 点赞 1
• 评论
• 分享
x

海报分享

扫一扫，分享海报

• 收藏
• 手机看

分享到微信朋友圈

x

扫一扫，手机阅读

• 打赏

打赏

雾的能见度

你的鼓励将是我创作的最大动力

C币 余额
2C币 4C币 6C币 10C币 20C币 50C币
• 一键三连

点赞Mark关注该博主, 随时了解TA的最新博文

01-26
09-17 897
03-12 707
05-05 1388
04-02
04-26 864
01-27 1万+
04-23