尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

Osg 开发三:OpenSceneGraph 变换节点及工程实例
📅 发布时间:2026/7/12 22:20:52

文章目录

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

一 OSG Group 节点

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

二 OSG 变换节点

osg::Transform变换节点继承自osg::Group,派生出osg::PositionAttitudeTransform、osg::MatrixTransform、osg::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/

相关新闻

  • 终极Samsungctl指南:如何通过Python轻松控制三星电视
  • Inventory Kamera与第三方工具集成:如何将数据导入SEELIE.me和Aspirine计算器
  • Django API Domains完整教程:5步实现领域分离与API优化

最新新闻

  • 基于深度学习的车牌识别与停车场管理系统31(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_
  • ElevenLabs与PlayHT、Resemble.ai横向评测(2024Q2最新数据):中文停顿准确率、情感连贯性、API响应延迟TOP3对比
  • 简历堆满 RAG 案例,面试却被问崩:大模型时代的工程化生存法则
  • 2026成都装修头部装企全解析:里林、朗润、圣都、生活家、岚庭、彩兔! - 推荐官
  • BlockingQueue详解
  • HarmonyOS《柚兔学伴》项目实战02-多模块架构设计与 HSP/HAR 模块化

日新闻

  • IX9104 PCIe5.0 高速交换芯片@ACP#完整规格 + 应用场景总结
  • Unity游戏集成Coze智能体:实现NPC智能对话与知识库联动
  • SAP EPIC 建行回单查询:从标准类CL_EPIC_EXAMPLE_CN_CCB_GHTD到Z类的5处关键修改

周新闻

  • IX9104 PCIe5.0 高速交换芯片@ACP#完整规格 + 应用场景总结
  • Unity游戏集成Coze智能体:实现NPC智能对话与知识库联动
  • SAP EPIC 建行回单查询:从标准类CL_EPIC_EXAMPLE_CN_CCB_GHTD到Z类的5处关键修改

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号