osgwidget 使用 方法以及案例分享

news2024/10/6 10:42:49

 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.coloradmin.cn/o/446513.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[论文阅读] (29)李沐老师视频学习——2.研究的艺术·找问题和明白问题的重要性

《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座&#xff0c;并分享给大家&#xff0c;希望您喜欢。由于作者的英文水平和学术能力不高&#xff0c;需要不断提升&#xff0c;所以还请大家批评指正&#xff0c;非常欢迎大家给我留言评论&#xff0c;学术路上期…

写在28岁,回看3年前的自己,庆幸当时入了软件测试这行

为什么会学习软件测试&#xff1f; 已经28岁了&#xff0c;算一下快过去3年了&#xff0c;刚毕业那会工作了一年&#xff0c;因为自己当时很迷茫&#xff08;觉得自己挺废的&#xff09;&#xff0c;所以就没去工作就一直在家&#xff0c;家里固定每个月给点生活费&#xff0c…

人工智能、ChatGPT等火爆的当下 AI大模型爆发

4月18日&#xff0c;火山引擎在其举办的“原动力大会”上发布自研DPU等系列云产品&#xff0c;并推出新版机器学习平台&#xff1a;支持万卡级大模型训练、微秒级延迟网络&#xff0c;让大模型训练更稳更快。火山引擎总裁谭待表示&#xff0c;AI大模型有巨大潜力和创新空间&…

chatgpt实际是怎样工作的?

文章翻译自&#xff1a; https://www.assemblyai.com/blog/how-chatgpt-actually-works/ ChatGPT 是 OpenAI 的最新语言模型&#xff0c;比其前身 GPT-3 有了重大改进。与许多大型语言模型类似&#xff0c;ChatGPT 能够为不同目的生成多种样式的文本&#xff0c;但具有更高的精…

用ChatGPT搭建公司内部ChatGPT服务器

一、前言 我是ChatGPT&#xff0c;一个由OpenAI训练的大型语言模型。我被设计用于回答各种问题并生成文本&#xff0c;可以处理多种自然语言任务&#xff0c;例如问答、摘要和翻译等。在我的学习过程中&#xff0c;我阅读了数百万篇文本&#xff0c;并使用这些文本来提高我的理…

了解分布式Session

大家好&#xff0c;我这名CRUD工程师又来了&#xff0c;最近我的一个同事突然在看分布式Seesion的问题&#xff0c;然后我们两个也是互相讨论了一下&#xff0c;今天我就想着把分布式Session的知识点好好的梳理一下。 在很多系统中&#xff0c;用户的登录功能都是用Session去实…

Eclipse 4.27.0 制作并使用jar包

目的&#xff1a; 记录使用Eclipse 4.27.0 制作并使用jar包的过程&#xff0c;以备查看。 一&#xff0c;制作jar包 新建工程new ->Java Project 输入工程名&#xff0c;注意这里勾掉 Create module-info.java file的复选框&#xff0c;也可以在创建后自行删除该文件 后面…

[架构之路-171]-《软考-系统分析师》-5-数据库系统-4- 数 据 库 的 控 制 功 能(并发控制、性能优化)

目录 5 . 4 数 据 库 的 控 制 功 能 5.4.1 并发控制 1 . 事务的基本概念 2 . 数据不一致问题 3 . 封锁协议 4 . 死锁问题 5.4.2 数据库性能优化 1 . 硬件升级 2 . 数据库设计 5.4.3 数据库的完整性 1 . 完整性约束条件 2 . 实体完整性 3 . 参照完整性 4 . 用户定…

SVD求解ICP问题

Background ICP&#xff08;Iterative Closest Point&#xff09;问题&#xff0c;迭代最近点。已知一组三维点在两个坐标系中的坐标表示&#xff0c;求这两个坐标系之间的变换关系&#xff0c;称为ICP问题。 最开始想到这个问题&#xff0c;是想进行手眼标定&#xff0c;有一…

头歌c语言实训项目-综合案例课外练习:大奖赛现场统分

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 第1关&#xff1a;大奖赛现场统分 题目&#xff1a; 代码思路&#xff1a; 代码表示&#xff1a; 第1关…

【看图识文】tesseract.js@4.0.2

看图识文 介绍示例一示例二示例三示例四示例五示例六 介绍 该库用于识别并获取图片上的文字&#xff0c;支持多种语言。对英文识别度非常高&#xff0c;但是对中文的识别度非常一般。需要单独训练对应的中文库。对白纸黑字的合同文识别度还不错&#xff0c;其他的都不太好。 …

Android之编写申请权限库PermissionX

比如要实现拨打电话的功能&#xff0c;一般我们要编写如下Android运行时权限API class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)if(ContextCom…

日撸 Java 三百行day35

文章目录 说明day35 图的 m 着色问题1.问题描述2.思路2.代码 说明 闵老师的文章链接&#xff1a; 日撸 Java 三百行&#xff08;总述&#xff09;_minfanphd的博客-CSDN博客 自己也把手敲的代码放在了github上维护&#xff1a;https://github.com/fulisha-ok/sampledata day3…

JUC安全/非安全容器

一、JUC java.util.concurrent下的类就叫JUC类&#xff0c;JUC下典型的类有&#xff1a; 1.ReentrantLock可重入锁 2.Semaphore信号量 3.CountDownLatch计数器 4.CyclicBarrier循环屏障 二、线程安全&非安全容器 2.1非线性安全容器 2.2线性安全容器 三、关于HashMap ha…

【谷歌浏览器 -- Vimium 常用快捷键】

文章目录 1.1.1 标签页管理1.1.2 网页操作1.1.3 打开链接1.1.4 搜索1.1.5 自定义搜索引擎短语1.1.6 Vimimu 使用注意事项 Vimium 是一款用键盘控制 Chrome 浏览器的 Chrome 插件, 可以在 Chrome 应用商店下载到. 下面列出个人比较习惯使用的几个快捷键。 1.1.1 标签页管理 [ x…

【C语言】基础语法4:函数和递归

上一篇&#xff1a;控制流程结构 下一篇&#xff1a;数组和指针 ❤️‍&#x1f525;前情提要❤️‍&#x1f525;   欢迎来到C语言基本语法教程   在本专栏结束后会将所有内容整理成思维导图&#xff08;结束换链接&#xff09;并免费提供给大家学习&#xff0c;希望大家…

Cookie、Session、Token的区别

1 网站交互体验升级 1.1 无状态的 http 协议 HTTP 无状态协议&#xff0c;是指协议对于业务处理没有记忆能力&#xff0c;之前做了啥完全记不住&#xff0c;每次请求都是完全独立互不影响的&#xff0c;没有任何上下文信息。 缺少状态意味着如果后续处理需要前面的信息&…

基于蛋白-配体复合物构建药效团的药物设计(Pharmacophore)

基于蛋白-配体复合物构建药效团的药物设计&#xff08;Pharmacophore&#xff09; step 1.蛋白-配体复合物准备 点击File-->Import Structures导入之前已经下载好的1IEP.pdb&#xff08;Abl蛋白和Imatinib的晶体复合物&#xff09; 蛋白准备&#xff1a;点击Tasks--->…

【数据集实例】CMIP6气候模式数据下载-以河东地区为例

1 数据准备 主要根据研究区域等,介绍下载数据需求。 1.1 研究区域 以甘肃省河东地区为例,分区图如下所示: 数据时间范围如下所示: 历史时段:1970-2014年(共44年)预估时段:2015-2100年此外,根据研究内容,确定下载的变量为: 日尺度降水:缩写为pr日尺度最高/最低温…

OrCAD创建原理图库

OrCAD创建原理图库 概述常规器件建库方法大封装器件建库基于pinout表格创建原理图库导入方法&#xff1a; 通过fsp软件导入fpga原理图库 概述 原理图库是硬件设计的基本工作&#xff0c;每个新人都要先学会建库&#xff0c;才能开始画图&#xff0c;本文主要介绍几种常用的建库…