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

发布时间:2026/7/12 22:10:16
Osg 开发三:OpenSceneGraph 变换节点及工程实例 文章目录一 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/