osgwidget 使用 方法以及案例分享

news/2024/12/28 16:12:57/

 osgwidget 使用 方法以及案例分享

按钮 一个常见的 osg::Widget 就是按钮。下面的代码展示了如何使用 osg::Switch 和 osgText 创建一个简单的按钮:
osg::ref_ptr<osg::Switch> buttonSwitch = new osg::Switch();
osg::ref_ptr<osgText::Text> buttonText = new osgText::Text();
buttonText->setText("Click me!");
buttonText->setCharacterSize(30);
buttonText->setPosition(osg::Vec3(0, 0, 0));
buttonText->setAlignment(osgText::Text::CENTER_CENTER);
buttonSwitch->addChild(buttonText.get());标签页 另一个常见的 osg::Widget 就是标签页。下面的代码展示了如何使用 osg::Group、osg::PositionAttitudeTransform 和 osgText 创建一个简单的标签页:
osg::ref_ptr<osg::Group> tabGroup = new osg::Group();
osg::ref_ptr<osg::PositionAttitudeTransform> tabTransform = new osg::PositionAttitudeTransform();
tabTransform->setPosition(osg::Vec3(-50, 0, 0));
osg::ref_ptr<osgText::Text> tabText = new osgText::Text();
tabText->setText("Tab 1");
tabText->setCharacterSize(20);
tabText->setPosition(osg::Vec3(0, 0, 0));
tabTransform->addChild(tabText.get());
tabGroup->addChild(tabTransform.get());文本框 最后一个例子是文本框。下面的代码展示了如何使用 osg::Geode、osgText 和 osg::Geometry 创建一个简单的文本框:
osg::ref_ptr<osg::Geode> textBoxGeode = new osg::Geode();
osg::ref_ptr<osgText::Text> textBoxText = new osgText::Text();
textBoxText->setText("Type here!");
textBoxText->setCharacterSize(20);
textBoxText->setPosition(osg::Vec3(0, 0, 0));
osg::ref_ptr<osg::Geometry> textBoxGeometry = osg::createTexturedQuadGeometry(osg::Vec3(-50, -20, 0), osg::Vec3(100, 0, 0), osg::Vec3(0, 40, 0));
osg::ref_ptr<osg::Texture2D> textBoxTexture = new osg::Texture2D();
// 设置纹理
textBoxGeode->addDrawable(textBoxGeometry.get());
textBoxGeode->addDrawable(textBoxText.get());

osgWidget是OpenSceneGraph(OSG)的一个扩展库,提供了一个基于OpenGL的2D GUI框架。它允许用户创建和管理图形用户界面元素,例如按钮、标签、滑块、文本框等,并将它们嵌入到OSG场景中。

osgWidget的主要特点包括:

  1. 支持多个窗口,每个窗口都可以包含任意数量的部件。

  2. 可以使用纹理作为部件的背景,支持透明度和平铺模式。

  3. 组件可以响应鼠标事件,例如单击、双击、拖动等。

  4. 可以自定义部件的外观和行为,例如字体、颜色、大小等。

osgWidget的使用方法类似于其他GUI框架,需要创建一个GUI环境对象并添加所需的部件。下面是一个简单的osgWidget代码示例,用于创建一个带有两个按钮和一个标签的窗口:

#include <osgWidget/WindowManager>
#include <osgWidget/Box>// 创建GUI环境对象和窗口管理器
osg::ref_ptr<osgWidget::WindowManager> wm = new osgWidget::WindowManager(graphicsContext->getTraits());// 创建窗口
osg::ref_ptr<osgWidget::Box> window = new osgWidget::Box("window");// 创建按钮
osg::ref_ptr<osgWidget::Button> button1 = new osgWidget::Button("button1");
osg::ref_ptr<osgWidget::Button> button2 = new osgWidget::Button("button2");// 创建标签
osg::ref_ptr<osgWidget::Label> label = new osgWidget::Label("label");// 将按钮和标签添加到窗口中
window->addWidget(button1.get());
window->addWidget(button2.get());
window->addWidget(label.get());// 添加窗口到窗口管理器
wm->addChild(window.get());osgWidget是一个功能强大的GUI框架,可以方便地将用户界面集成到OSG场景中,提供更丰富和交互性的应用程序体验。
osg::MatrixTransform 和 osgWidget::Box 都是 OpenSceneGraph(OSG)中的类,但它们用途不同。osg::MatrixTransform 是 OSG 中的一个节点类,用于在场景图中对节点进行平移、旋转、缩放等变换操作,可以将其子节点沿着给定的变换矩阵进行变换。通常用于表示模型的空间变换和动画效果。例如,我们可以使用以下代码将一个模型沿X轴平移10个单位:osg::ref_ptr<osg::MatrixTransform> modelTransform = new osg::MatrixTransform();
modelTransform->setMatrix(osg::Matrix::translate(10.0, 0.0, 0.0));
modelTransform->addChild(modelNode);其中 modelNode 是待变换的模型节点,modelTransform 是应用了平移变换的 MatrixTransform 节点。而 osgWidget::Box 则是 OSGWidget 库中的一个部件类,用于创建一个矩形区域作为容器,可以将其他部件添加到其中。通常用于创建用户界面的布局结构。例如,我们可以使用以下代码创建一个 Box 容器,并将两个按钮添加到其中:osg::ref_ptr<osgWidget::Box> container = new osgWidget::Box("container");
osg::ref_ptr<osgWidget::Button> button1 = new osgWidget::Button("button1");
osg::ref_ptr<osgWidget::Button> button2 = new osgWidget::Button("button2");
container->addWidget(button1.get());
container->addWidget(button2.get());其中,container 是创建的 Box 容器,button1 和 button2 是添加到容器中的按钮部件。综上所述,osg::MatrixTransform 用于场景图节点的变换操作,而 osgWidget::Box 用于用户界面的布局组件。

osg::MatrixTransform 和 osgWidget::Box 测试代码

644283b4af53bb284e470d99

以下是一个简单的测试代码,其中创建了一个osg::MatrixTransform节点来控制osgWidget::Box组件的位置和方向。在这个例子中,osgWidget::Box组件被添加到场景图中,然后放置在osg::MatrixTransform节点上,之后通过调整osg::MatrixTransform节点的变换来改变osgWidget::Box组件的位置和方向。

#include <osg/MatrixTransform>
#include <osgWidget/Box>
#include <osgViewer/Viewer>int main()
{// 创建场景根节点osg::ref_ptr<osg::Group> root = new osg::Group;// 创建MatrixTransform节点osg::ref_ptr<osg::MatrixTransform> mt = new osg::MatrixTransform;// 创建osgWidget::Box组件osg::ref_ptr<osgWidget::Box> box = new osgWidget::Box;box->setMargin(1); // 设置边界大小box->setColor(1.0f, 0.0f, 0.0f, 1.0f); // 设置颜色为红色// 将Box组件添加到MatrixTransform节点上mt->addChild(box);// 将MatrixTransform节点添加到场景中root->addChild(mt);// 设置初始变换osg::Matrix m;m.setTrans(osg::Vec3(0, 0, 0)); // 设置平移mt->setMatrix(m); // 应用平移变换// 创建OSG Viewer窗口osgViewer::Viewer viewer;viewer.setSceneData(root);viewer.realize();// 进入主循环while (!viewer.done()){osg::Matrix transMat;transMat.makeTranslate(osg::Vec3(1.0f, 0.0f, 0.0f)); // 计算新的平移矩阵mt->setMatrix(transMat); // 平移Box组件viewer.frame();}return 0;
}

这段代码的效果是每次循环时将osgWidget::Box组件向右平移1.0f的距离。通过这个例子可以发现,osg::MatrixTransform和osgWidget::Box可以非常容易地结合使用来实现3D交互式界面。


http://www.ppmy.cn/news/50562.html

相关文章

ExecutorService 线程池详解

背景&#xff1a;经常创建和销毁、使用量特别大的资源&#xff0c;比如并发情况下的线程&#xff0c;对性能影响很大。思路&#xff1a;提前创建好多个线程&#xff0c;放入线程池中&#xff0c;使用时直接获取&#xff0c;使用完放回池中。可以避免频繁创 建销毁、实现重复利用…

全国青少年信息素养大赛图形化编程决赛·模拟五卷,含答案解析

目录 一、单选题 下载文档打印: 全国青少年电子信息智能创新大赛 图形化编程挑战题模拟五卷 一、单选题 1. 执行下图程序后,“花名”列表的第3项是?( )

什么是redis发布订阅模式,并用java代码实现小demo

Redis中的发布订阅模式是一种消息传递模式&#xff0c;其中订阅者通过订阅特定的频道&#xff08;channel&#xff09;来接收发布者发送的消息。发布者将消息发送到指定的频道&#xff0c;所有订阅该频道的订阅者都会收到相同的消息。 发布订阅模式主要应用于实时数据处理、消息…

streamx平台部署

一. streamx介绍 StreamPark 总体组件栈架构如下&#xff0c; 由 streampark-core 和 streampark-console 两个大的部分组成 , streampark-console 是一个非常重要的模块, 定位是一个综合实时数据平台&#xff0c;流式数仓平台, 低代码 ( Low Code ), Flink & Spark 任务托…

在线图片编辑网站汇总

目录 前言一、在线抠图工具1. 佐糖2. remove.bg3. Clipping Magic4. 起兮深深5. BgSub6. 改图神器7. PIXLR 二、其他工具1. 压缩图2. AI人工智能图片放大 前言 本文收录了多个可以在线抠图、在线编辑图片的网站。 一、在线抠图工具 1. 佐糖 官网&#xff1a;链接 特点&#x…

搭建一个简单的react router工程

1.创建一个新的 React 工程&#xff1a;可以使用 create-react-app 脚手架工具来快速创建一个新的项目&#xff0c;命令行输入 npx create-react-app my-app 即可创建一个名为 my-app 的新项目。 2.安装 react-router-dom 库&#xff1a;在命令行中运行 npm install react-rou…

Adobe国际认证证书有用吗?

Adobe国际认证又称为Adobe认证(英文:Adobe Certified Professional)是Adobe公司CEO签发的权威国际认证体系,旨在为用户提供Adobe软件的专业认证。 该体系基于Adobe核心技术及岗位实际应用操作能力的测评体系得到国际ISTE协会的认可&#xff0c;并在全球 148 各国家推广&#x…

Opencv+Python笔记(四)图像的形态学处理

1.腐蚀与膨胀 膨胀用来处理缺陷问题&#xff0c;把缺陷填补掉&#xff0c;提高亮区面积&#xff1b; 腐蚀用来处理毛刺问题&#xff0c;把毛刺腐蚀掉&#xff0c;降低亮区面积。 腐蚀操作可以消除噪点&#xff0c;同时消除部分边界值&#xff0c;导致目标图像整体缩小。 膨胀…