Osg 开发三:OpenSceneGraph 变换节点及工程实例 📅 发布时间:2026/7/12 22:08:44 👁️ 浏览次数: 文章目录一 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) Release2 工程配置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-losgWidget2将osg动态库.dll拷贝到可执行文件所在目录3 位置变换节点示例1osg::PositionAttitudeTransform的常用成员函数voidsetPosition(constVec3dpos)//设置位置constVec3dgetPosition()const//得到位置voidsetAttitude(constQuatquat)//设置姿态参数为四元数constQuatgetAttitude()const//得到姿态2示例代码voidMainWindow::initPosTransform(){// 初始化view3d//......osg::ref_ptrosg::Grouprootnew osg::Group();osg::ref_ptrosg::NodenodeosgDB::readNodeFile(cow.osg);osg::ref_ptrosg::PositionAttitudeTransformpat1new 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_ptrosg::PositionAttitudeTransformpat2new 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 矩阵变换节点示例1osg::MatrixTransform常用成员函数voidsetMatrix(constMatrixmat)//设置矩阵constMatrixgetMatrix()const//得到矩阵voidpreMult(constMatrixmat)//递乘比较类似于avoidpostMult(constMatrixmat)//递乘比较类似于aconstMatrixgetInverseMatrix()const//得到逆矩阵2示例代码voidMainWindow::initRectTransform(){// 初始化view3d//......osg::ref_ptrosg::Grouprootnew osg::Group();osg::ref_ptrosg::NodenodeosgDB::readNodeFile(cow.osg);osg::ref_ptrosg::MatrixTransformmat1new 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_ptrosg::MatrixTransformmat2new 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 对齐变换节点示例1osg::AutoTransform的对齐模式enumAutoRotateMode{NO_ROTATION,//无ROTATE_TO_SCREEN,//自动朝向屏幕ROTATE_TO_CAMERA//自动朝向相机}2示例代码voidMainWindow::initAutoTransform(){// 初始化view3d//......osg::ref_ptrosg::Grouprootnew 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/
TDD-Katas扩展实践:如何为现有项目添加自定义Kata与测试用例 TDD-Katas扩展实践:如何为现有项目添加自定义Kata与测试用例 【免费下载链接】TDD-Katas This repository contains Hands on Test Driven Development Katas (C#) 项目地址: https://gitcode.com/gh_mirrors/tdd/TDD-Katas TDD-Katas是一个专注于测试驱动开… 2026/7/12 22:08:44
CloudMatrix384 超节点:下一代分布式计算架构解析 1. 什么是 CloudMatrix384 超节点?CloudMatrix384 超节点是一种面向大规模分布式计算场景的高性能、高可用计算单元。它通常由 384 个计算核心、高速互联网络和分布式存储模块组成,旨在为 AI 训练、科学计算、大数据分析等计算密集型任务提供强大的算力支… 2026/7/12 22:04:44
NuvioMobile 跨平台同步揭秘:Android 与 iOS 无缝数据共享终极指南 NuvioMobile 跨平台同步揭秘:Android 与 iOS 无缝数据共享终极指南 【免费下载链接】NuvioMobile Official Nuvio Mobile Repository 项目地址: https://gitcode.com/gh_mirrors/nu/NuvioMobile NuvioMobile 是一款基于 Kotlin Multiplatform 和 Compose Mul… 2026/7/12 22:00:43
产教融合校热企冷怎么破?头部企业出题模式正在落地 做教育政策研究这些年,产教融合是我见过的最"老"的新概念——说它老,因为至少喊了十年;说它新,因为2026年的一系列动作让我看到了真正破局的苗头。核心变化不在于文件数量的多少,而在于游戏规则的底层逻辑变… 2026/7/12 23:29:10
基础知识:日经225指数深度全景分析(2026版) 日经225指数(Nikkei 225)是全球最重要的股票指数之一,既是日本经济的“温度计”,也是全球AI半导体产业链景气度的直接映射。2026年,该指数经历了从“史无前例的上涨”到“历史高位震荡”的极致演绎,其背后是… 2026/7/12 23:27:08
深度分析富时A50期指连续:全球资金配置A股的“风向标” 富时中国A50指数期货(简称富时A50期指)是全球投资者参与A股核心资产交易的重要工具之一,其连续合约更是市场关注的焦点。该品种由新加坡交易所(SGX)挂牌交易,以美元计价,追踪富时中国A50指数&am… 2026/7/12 23:27:08
openEuler etmem进阶指南:如何通过第三方策略扩展内存分级功能 openEuler etmem进阶指南:如何通过第三方策略扩展内存分级功能 【免费下载链接】Storage-docs Documentation Repository Dedicated to Storage Features 项目地址: https://gitcode.com/openeuler/Storage-docs 前往项目官网免费下载:https://ar… 2026/7/12 23:21:06
Word 自定义样式纳入自动目录:3步解决非标准标题的目录生成难题 Word自定义样式纳入自动目录的终极解决方案在企业文档模板或学术论文排版中,我们经常遇到一个棘手问题:精心设计的自定义标题样式无法被Word自动目录识别。本文将彻底解决这一痛点,通过三个关键步骤实现非标准样式的目录集成,同时… 2026/7/12 23:21:06
开发者实战:基于NVIDIA-Nemotron-Labs-3-Elastic-30B-A3B-FP8构建RAG系统的完整流程 开发者实战:基于NVIDIA-Nemotron-Labs-3-Elastic-30B-A3B-FP8构建RAG系统的完整流程 【免费下载链接】NVIDIA-Nemotron-Labs-3-Elastic-30B-A3B-FP8 项目地址: https://ai.gitcode.com/hf_mirrors/nvidia/NVIDIA-Nemotron-Labs-3-Elastic-30B-A3B-FP8 &… 2026/7/12 23:19:06
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/12 0:01:13
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/12 0:01:13
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/12 0:03:14
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/12 0:01:13
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/12 0:01:13
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/12 0:03:14