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/
编程学习
技术分享
实战经验