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

Osg 开发三:OpenSceneGraph 变换节点及工程实例

文章目录

  • 一 OSG Group 节点
  • 二 OSG 变换节点
  • 三 变换节点示例
    • 1 开发环境
    • 2 工程配置
    • 3 位置变换节点示例
    • 4 矩阵变换节点示例
    • 5 对齐变换节点示例
  • 其他

一 OSG Group 节点

osg::Group组节点是 OSG 的核心部分,用来组织场景图中的数据。osg::Group上可以添加任意数量的子节点,子节点可以继续分发子节点,以此类推。通常情况下,只有父节点引用osg::Group,当释放场景图的根节点时,会引发连锁的内存释放,避免内存泄漏。osg::Group派生出许多实用的节点类,如osg::LODosg::Switchosg::Transform等。本文重点介绍osg::Transform

二 OSG 变换节点

osg::Transform变换节点继承自osg::Group,派生出osg::PositionAttitudeTransformosg::MatrixTransformosg::AutoTransform等。继承关系如下图所示:

派生变换节点的功能描述如下表所示:

名称功能描述
osg::PositionAttitudeTransform位置变换节点的作用是提供模型的位置变换、大小缩放、原点位置的设置以及坐标系的变换。
osg::MatrixTransform矩阵变换节点负责场景中的矩阵变换、矩阵运算及坐标系的变换,实现对模型的旋转、平移等操作。
osg::AutoTransform自动对齐节点的作用是使节点自动对齐于摄像机或者屏幕。实际引用中通常用来显示一些不变换的文字或者其他标识。

三 变换节点示例

1 开发环境

  • 操作系统:Windows10及以上
  • Qt 6.8.0 (MSVC 2022) Release / Qt 5.12.12 (MSVC 2017) Release

2 工程配置

(1)包含文件和库文件目录

INCLUDEPATH+=$$PWD/xxx/osg/include LIBS+=-L$$PWD/xxx/osg/lib/-lOpenThreads-losg-losgAnimation-losgDB-losgFX-losgGA \-losgManipulator-losgParticle-losgParticle-losgPresentation \-losgQOpenGL-losgShadow-losgSim-losgTerrain-losgText \-losgUI-losgUtil-losgViewer-losgVolume-losgWidget

(2)将osg动态库.dll拷贝到可执行文件所在目录

3 位置变换节点示例

(1)osg::PositionAttitudeTransform的常用成员函数

voidsetPosition(constVec3d&pos)//设置位置constVec3d&getPosition()const//得到位置voidsetAttitude(constQuat&quat)//设置姿态,参数为四元数constQuat&getAttitude()const//得到姿态

(2)示例代码

voidMainWindow::initPosTransform(){// 初始化view3d//......osg::ref_ptr<osg::Group>root=new osg::Group();osg::ref_ptr<osg::Node>node=osgDB::readNodeFile("cow.osg");osg::ref_ptr<osg::PositionAttitudeTransform>pat1=new osg::PositionAttitudeTransform();pat1->setPosition(osg::Vec3(-10.0f,0.0f,0.0f));pat1->setScale(osg::Vec3(0.5f,0.5f,0.5f));pat1->addChild(node.get());osg::ref_ptr<osg::PositionAttitudeTransform>pat2=new osg::PositionAttitudeTransform();pat2->setPosition(osg::Vec3(10.0f,0.0f,0.0f));pat2->addChild(node.get());root->addChild(pat1.get());root->addChild(pat2.get());osgUtil::Optimizer optimizer;optimizer.optimize(root.get());viewer->setSceneData(root.get());ui->stackedWidget->addWidget(viewer);}

(3) 测试结果

4 矩阵变换节点示例

(1)osg::MatrixTransform常用成员函数

voidsetMatrix(constMatrix&mat)//设置矩阵constMatrix&getMatrix()const//得到矩阵voidpreMult(constMatrix&mat)//递乘,比较类似于++avoidpostMult(constMatrix&mat)//递乘,比较类似于a++constMatrix&getInverseMatrix()const//得到逆矩阵

(2)示例代码

voidMainWindow::initRectTransform(){// 初始化view3d//......osg::ref_ptr<osg::Group>root=new osg::Group();osg::ref_ptr<osg::Node>node=osgDB::readNodeFile("cow.osg");osg::ref_ptr<osg::MatrixTransform>mat1=new osg::MatrixTransform();osg::Matrix m;m.makeTranslate(osg::Vec3(10.0f,0.0f,0.0f));m.makeRotate(45.0f,1.0f,0.0,0.0);mat1->setMatrix(m);mat1->addChild(node.get());osg::ref_ptr<osg::MatrixTransform>mat2=new osg::MatrixTransform();osg::Matrix t;t.makeTranslate(osg::Vec3(-10.0f,0.0f,0.0f));mat2->setMatrix(t);mat2->addChild(node.get());root->addChild(mat1.get());root->addChild(mat2.get());osgUtil::Optimizer optimizer;optimizer.optimize(root.get());viewer->setSceneData(root.get());ui->stackedWidget->addWidget(viewer);}

(3)测试结果

5 对齐变换节点示例

(1)osg::AutoTransform的对齐模式

enumAutoRotateMode{NO_ROTATION,//无ROTATE_TO_SCREEN,//自动朝向屏幕ROTATE_TO_CAMERA//自动朝向相机}

(2)示例代码

voidMainWindow::initAutoTransform(){// 初始化view3d//......osg::ref_ptr<osg::Group>root=new osg::Group();std::stringtext("Fly To Sky");//3种变换模式//ROTATE_TO_SCREEN 自动朝向屏幕//ROTATE_TO_CAMERA 自动朝向相机//NO_ROTATION 无//添加ROTATE_TO_SCREEN模式变换节点root->addChild(createAutoTransform(osg::Vec3(0.0f,0.0f,60.0f),60.f,text,osg::AutoTransform::ROTATE_TO_SCREEN,osgText::Text::XY_PLANE));root->addChild(createAutoTransform(osg::Vec3(0.0f,0.0f,0.0f),60.f,text,osg::AutoTransform::NO_ROTATION,osgText::Text::YZ_PLANE));root->addChild(createAutoTransform(osg::Vec3(0.0f,0.0f,-60.0f),60.f,text,osg::AutoTransform::ROTATE_TO_CAMERA,osgText::Text::XY_PLANE));osgUtil::Optimizer optimizer;optimizer.optimize(root.get());viewer->setSceneData(root.get());ui->stackedWidget->addWidget(viewer);}

(3)测试结果

其他

官方店:https://2td9n4muhvgusvzepfo0a3cyfue8cph.taobao.com/

http://www.jsqmd.com/news/1176608/

相关文章:

  • Obsidian Charts与Dataview集成:打造动态数据可视化工作流的终极指南
  • 开发者指南:如何用led-name-badge-ls32模块创建自定义LED徽章内容
  • Inventory Kamera与第三方工具集成:如何将数据导入SEELIE.me和Aspirine计算器
  • 123. 买卖股票的最佳时机 III
  • Docker 多阶段构建深度实战:Nginx Ingress Controller 的三阶段源码构建
  • 为什么用 AI 去改 AI 写的内容,AIGC 率反而更高?
  • 2026年高温合金厂家推荐:选购指南与报价参考 - 优企名品
  • Transformer vs AGW:ReID-Survey两大技术路线的终极对比指南
  • 2026年7月最新天津欧米茄官方售后服务网点地址及客服电话一览 - 欧米茄服务中心
  • 2026年7月最新海口江诗丹顿官方售后客户服务热线与维修网点地址汇总 - 江诗丹顿官方服务中心
  • iOS架构进阶:为什么说iOS-Viper-Architecture是大型项目的最佳选择?
  • Django API Domains完整教程:5步实现领域分离与API优化
  • 如何通过System Design Interview面试:7个核心方法论与4S分析法详解
  • 使用next数组加速匹配过程
  • Orchestra核心架构深度解析:任务、智能体与工具的完美融合
  • 10个Try Puppeteer实用技巧:提升你的云端网页自动化效率
  • 2026年华东区域充电转接头相关企业名录梳理 - 起跑123
  • TDD-Katas项目解析:从Bowling Game到String Calculator的核心实现原理
  • 2026北京名表回收哪家回款快?毓典当场验货即刻到账 - 奢品流通笔谈
  • 如何快速上手Web Audio Samples:10个必学音频处理示例解析
  • 告别冗长代码:EasyDB实现PHP数据库CRUD操作的极简方案
  • 如何使用Spatie URL包进行URL路径分段处理与操作
  • 2026年7月最新大连江诗丹顿官方售后热线及客户服务网点地址 - 江诗丹顿服务中心
  • 第一章 Linux基础
  • Try Puppeteer核心功能揭秘:从网页截图到数据爬取的完整教程
  • OpenWhispr核心功能解析:本地Nvidia Parakeet与Whisper模型如何保护你的语音数据
  • Godot平台游戏状态机实战教程:构建流畅的角色动画和动作系统
  • 寒假第一周周日7.12总结
  • 5个步骤快速上手telegram-purple:Libpurple的Telegram插件安装教程
  • 15个实战项目突破性指南:从零打造惊艳作品集的系统性方案