当前位置: 首页 > news >正文

OSG学习记录

学习自OpenSceneGraph Quick Start Guide的中文版,建议学习书(比较全面)

OSG的内存管理机制

程序保存一个指向根节点的指针,不保存场景图形中其他节点的指针。根节点将直接或间接地“引用”场景图形中的所有的节点。

当应用程序不再使用场景图形时,每个节点所使用的内存需要释放以避免内存泄漏。

内存引用计数器

所有OSG场景图形节点均采用引用计数,引用计数值为0时,此对象自动释放。

释放根节点的指针,场景图形中的所有节点和数据逐一释放。

ref_ptr<>

Geode类:osg的叶节点,包含了用于渲染的几何信息。

Group节点可以有多个子节点。

代码作用:创建场景图像,写入到名为"Simple.osg"的文件中。

#include <osg/Group>
#include <osg/Geode>
#include <osg/Geometry>
#include <osg/ref_ptr>#include <osgDB/Registry>
#include <osgDB/WriteFile>
#include <osg/Notify>
#include <iostream>
using std::endl;
osg::ref_ptr<osg::Node> createSceneGraph()
{// 创建一个用于保存几何信息的对象osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;// 创建四个顶点的数组osg::ref_ptr<osg::Vec3Array> v = new osg::Vec3Array;geom->setVertexArray(v.get());v->push_back(osg::Vec3(-1.f, 0.f, -1.f));v->push_back(osg::Vec3(1.f, 0.f, -1.f));v->push_back(osg::Vec3(1.f, 0.f, 1.f));v->push_back(osg::Vec3(-1.f, 0.f, 1.f));// 创建四种颜色的数组osg::ref_ptr<osg::Vec4Array> c = new osg::Vec4Array;geom->setColorArray(c.get());geom->setColorBinding(osg::Geometry::BIND_PER_VERTEX);c->push_back(osg::Vec4(1.f, 0.f, 0.f, 1.f));c->push_back(osg::Vec4(0.f, 1.f, 0.f, 1.f));c->push_back(osg::Vec4(0.f, 0.f, 1.f, 1.f));c->push_back(osg::Vec4(1.f, 1.f, 1.f, 1.f));// 为唯一的法线创建一个数组osg::ref_ptr<osg::Vec3Array> n = new osg::Vec3Array;geom->setNormalArray(n.get());geom->setNormalBinding(osg::Geometry::BIND_OVERALL);n->push_back(osg::Vec3(0.f, -1.f, 0.f));// 由保存的数据绘制四个顶点的多边形geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS, 0, 4));// 向 Geode 类添加几何体(Drawable)并返回 Geodeosg::ref_ptr<osg::Geode> geode = new osg::Geode;geode->addDrawable(geom.get());return geode.get();
}
int main(int argc, char* argv[])
{osg::ref_ptr<osg::Node> root = createSceneGraph();if (!root.valid())osg::notify(osg::FATAL) << "Failed in createSceneGraph()."<< endl;bool result = osgDB::writeNodeFile(*(root.get()), "Simple.osg");if (!result)osg::notify(osg::FATAL) << "Failed in osgDB::writeNode()."<< endl;
}

添加一部分代码,使用窗口进行显示。

    #include <osgViewer/Viewer>osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;viewer->setUpViewInWindow(50, 50, 800, 600);viewer->setSceneData(root);return viewer->run();

相关文章:

  • uniapp条件编译
  • object对象列表使用sorted函数按照对象的某个字段排序
  • 运维开发.Kubernetes探针与应用
  • 详细介绍运算符重载函数,清晰明了
  • 使用matplotlib绘制折线条形复合图
  • C语言| 求1到100之间所有能被3整除的数之和
  • 小程序发成绩
  • FinalShell 配置SSH密钥登陆
  • 云阅读(小说系统)看小说,管理小说
  • ubuntu安全加固
  • gmssl vs2010编译
  • RedisTemplate的Long类型使用increment自增报错
  • Flask教程5:flask数据库SQLAlchemy
  • 数组跟列表有什么区别
  • [机器学习]GPT LoRA 大模型微调,生成猫耳娘
  • Android 架构优化~MVP 架构改造
  • C++类中的特殊成员函数
  • CentOS7简单部署NFS
  • java 多线程基础, 我觉得还是有必要看看的
  • java概述
  • jquery ajax学习笔记
  • Map集合、散列表、红黑树介绍
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • python大佬养成计划----difflib模块
  • Python利用正则抓取网页内容保存到本地
  • React的组件模式
  • vue.js框架原理浅析
  • vue:响应原理
  • 从0实现一个tiny react(三)生命周期
  • 对象引论
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 计算机常识 - 收藏集 - 掘金
  • 一个SAP顾问在美国的这些年
  • 一个完整Java Web项目背后的密码
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • 选择阿里云数据库HBase版十大理由
  • #stm32整理(一)flash读写
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (十六)串口UART
  • (循环依赖问题)学习spring的第九天
  • (译)计算距离、方位和更多经纬度之间的点
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .NET MVC 验证码
  • .Net 知识杂记
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • @test注解_Spring 自定义注解你了解过吗?
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)
  • [ 转载 ] SharePoint 资料
  • [].shift.call( arguments ) 和 [].slice.call( arguments )
  • [20170705]diff比较执行结果的内容.txt
  • [Android View] 可绘制形状 (Shape Xml)