osg操控器之键盘切换操控器osgGA::KeySwitchMatrixManipulator

osg视图操作关于Manipulator 想看干货,还是FreeSouth总结的东西,写的很全 http://www.d3dweb.com/Documents/201203/31-22251384929.html以下是我自己项目的记录及碎碎念,为了梳理和加深印象: 1.KeySwitchMatrixManipulator类可以看做一个各类操作器的管理类,用按键来切换这些操作器。比如‘1’会被切换到TrackBall‘2’会被切换到Dri 阅读详情

目录

1. 前言

2. 键盘切换操控器接口说明

3. 总结


1. 前言

       osg官方提供了很多操控器,在源码目录下的src\osgGA目录下,cpp文件名含有Manipulator的都是操控器,每个这样的cpp表示一种类型的操控器。其中KeySwitchMatrixManipulator.cpp文件实现了键盘切换操控器。

        所谓操控器是指:操控相机运动,从而实现场景视图矩阵变化,反映到观察场景用户的感官上就是:人眼感觉场景变化了,但现实中的物体是没变化的,只是相机方位或距离远近在改变,从而给人视觉上的感觉而已。
        所谓键盘切换操控器是指可以通过按下键盘不同键,实现在多个操控器之间切换。这在游戏中很常见,比如:按w键,游戏中的人驾车跑;按q键,则游戏中的人做飞船绕星球飞行等。osg的osgGA::KeySwitchMatrixManipulator类正是为这种需求而开发的。

        关于其它操控器的学习,请参考:

2. 键盘切换操控器接口说明

void addMatrixManipulator(int key, std::string name, CameraManipulator *cm);

该接口向键盘切换操控器增加一个操控器对象。其参数说明如下:

  • key:表示键盘键虚拟码的值。关于什么是键盘虚拟码,不懂的可以自行百度。
  • name:操控器名称。可以随意取。
  • cm:操控器对象指针,需自己实现或用osg自带的操控器。

如下代码:

osg::ref_ptr<osgGA::KeySwitchMatrixManipulator> keyswitchManipulator = new osgGA::KeySwitchMatrixManipulator;

keyswitchManipulator->addMatrixManipulator( '1', "Trackball", new osgGA::TrackballManipulator() );
keyswitchManipulator->addMatrixManipulator( '2', "Flight", new osgGA::FlightManipulator() );
keyswitchManipulator->addMatrixManipulator( '3', "Drive", new osgGA::DriveManipulator() );
keyswitchManipulator->addMatrixManipulator( '4', "Terrain", new osgGA::TerrainManipulator() );

      创建了一个键盘切换操控器对象,并通过调用addMatrixManipulator向键盘切换操控器依次加入osg自带的跟踪球操控器、飞行操控器、驾驶操控器、地形操控器。如果调用addMatrixManipulator函数后,没有调用selectMatrixManipulator接口(参见后文描述),则当前操控器默认为最后一个加入的操控器,以本例来说就是地形操控器。当场景运行起来后,按下键盘数字1键,则立马切换到跟踪球操控器,此时用鼠标移动模型,则模型按类似球的弧线运动;如果按下2键,则立马切换到飞行操控器,感觉场景就像自己飞一样;依次类推。

 void addNumberedMatrixManipulator(CameraManipulator *cm);

addNumberedMatrixManipulator同addMatrixManipulator功能类似,不同点是:该函数在内部会自动以字符串"1"的ASCII码的值即49与当前键盘切换操控器中的操控器数量的和为key,如当前有8个操控器,则调用该函数后,会增加一个49 + 8 = 57为key,以字符串"CameraManipulator"为name的操控器。

void selectMatrixManipulator(unsigned int num);

将索引为num的操控器设置为当前操控器。注意:因为KeySwitchMatrixManipulator类内部是通过map来实现在内存中保存传入的操控器类对象的,该map的key是addMatrixManipulator的第1个参数或addNumberedMatrixManipulator自动生成的一个数值,因为采用的map是默认是按照从小到大排序规则,而selectMatrixManipulator实现是:遍历map,每遍历一个计数就增加1,直到该计数和传入的参数num相等时,就以该操控器为当前操控器,显然这个不一定就是addMatrixManipulator的第1个参数标识的操控器。

CameraManipulator* getMatrixManipulatorWithIndex(unsigned int key);
const CameraManipulator* getMatrixManipulatorWithIndex(unsigned int key) const;

返回指定索引的操控器,类似上面 selectMatrixManipulator接口阐述的含义。

CameraManipulator* getMatrixManipulatorWithKey(unsigned int key);
const CameraManipulator* getMatrixManipulatorWithKey(unsigned int key) const;

通过指定的key(即addMatrixManipulator函数的第1个参数)返回该key标识的操控器对象。 

3. 总结

       键盘切换操控器不是真实的操控器,可以认为是其它真实操控器的容器。可以根据按键变化在不同真实操控器之间切换。

osgmanipulator例子 这个例子演示了osg中拖拽器的使用,可以控制模型的移动、旋转缩放。 createDemoScene函数,如果没有加载模型,默认的创建几个基本几何体,bool  fixedSizeInScreen参数决定拖拽器是否固定大小。这个函数里面的代码很简单,创建了几个基 本几何体,然后把他们包装上不同的拖拽器,加入到场景中。 TabBoxDragger, TabPlaneDragger, Tab 阅读详情

相关推荐

OSG中TerrainManipulator(地形适配操纵器)

是osgGA库中的一个类,它继承自。在操作相机时,会考虑地形的高程信息,使相机始终沿着地形表面移动,避免穿入地下或飞得过高。cpp// 创建地形操作器// 设置最小高度(避免相机离地面太近)// 最小离地5米// 设置移动速度// 移动速度// 设置旋转速度// 旋转速度// 设置地形节点(如果自动检测失败)cpppublic:protected:// 重写高程查询方法// 先调用父类方法尝试获取高程// 如果父类找不到高程,使用默认值或自定义逻辑。

深之JohnChen的专栏 259

osgGA::KeySwitchMatrixManipulator按键选择切换操作器使用

osg::ref_ptr keyswitchManipulator = new osgGA::KeySwitchMatrixManipulator; keyswitchManipulator->addMatrixManipulator( '1', "Trackball", new osgGA::TrackballManipulator() ); keyswitchManipulator->

可乐鸡翅 3855

QT+OSG/osgEarth编译之六十五:osgManipulator+Qt编译(一套代码、一套框架,跨平台编译,版本:OSG-3.6.5工具库osgManipulator)

通过一套osgManipulator代码和框架,实现osgManipulator跨平台编译。 在Qt环境下,集成头文件、库文件,构建跨平台编译的pro文件。 通过构建的一套配置工程,基于Qt Creator IDE,完成跨平台的编译实践。 在Windows、Linux、MacOS等操作系统上进行测试,成功编译,形成的成果(头文件、库文件等)可在不同系统下调用或使用,从而更好地构建跨平台解决方案。 采用的是osg3.6.5版本。 读者可参考博客中的集成原理,构建不同版本的osgManipulator跨平台包。

LuckyHanMo的博客 502

C++学习(三一四)osg漫游器Manipulator例子

osg::ref_ptr<osgGA::KeySwitchMatrixManipulator> _manipulator; _manipulator = new osgGA::KeySwitchMatrixManipulator; _manipulator->addMatrixManipulator( '1', "Trackball", new osgGA::TrackballManipulator() ); _manipulator->...

hankern的专栏 1541

用友u8服务器优化,用友U8erp软件运行的性能优化方案图文教程

今天一定要给大家分享一下用友U8erp软件运行的性能优化方案图文教程,以下方案来自用友软件官方维护工程师反馈在在处理客户问题的时候,有一类问题较为挠头,就是诸如用友U8服务器效率低下的问题。比如用友U8运行慢,卡住等,我们暂先不提用友U8软件代码、脚本层面本身的性能提升问题,我们只是基于现有用友U8软件版本,在客户现有环境下排查用友U8软件运行的性能瓶颈,并采取一定的技术手段进行性能调校。本文将推...

weixin_39882870的博客 5306

Triton推理服务器实战:如何为PaddleOCR的ONNX模型配置动态批处理和并发推理

本文详细介绍了如何使用Triton推理服务器为PaddleOCR的ONNX模型配置动态批处理和并发推理,以提升GPU利用率和推理性能。通过实战案例和参数调优指南,帮助开发者解决高并发场景下的性能瓶颈问题,实现从实验室到生产环境的高效部署。

weixin_42527160的博客 426

osg解析系列-[osgManipulator::*Dragger]- 节点拖拽 应用示例

运行结果:按住Ctrl,对cow节点进行缩放,如下图。

qq_42531872的博客 648

Python实战:5分钟搞定N-CMAPSS航空发动机数据集解析(附完整代码)

本文提供了一份针对N-CMAPSS航空发动机数据集的快速解析实战指南。通过Python的h5py库,详细演示了如何读取HDF5文件结构、理解数据分类(如传感器、健康参数、场景描述符)并加载为Pandas DataFrame。文章还澄清了数据集中常见的变量数量疑惑,并给出了从数据加载到构建剩余使用寿命预测模型预处理流水线的完整代码,帮助工程师和研究人员高效入门航空发动机预测性维护分析。

weixin_29057065的博客 422

Implementation Model Editor of AVEVA in OpenSceneGraph

Implementation Model Editor of AVEVA in OpenSceneGraph eryar@163.com 摘要Abstract:本文主要对工厂和海工设计软件AVEVA的交互方式进行详细介绍,对OpenSceneGraph中的人机交互工具拖拽器进行说明,并在其中实现了模型直接交互操作。对交互建模感兴趣的读者可结合其源代码,对其实现细节进行分析。 关键字Key ...

weixin_34239169的博客 476

gesp c++ 五级知识点

gesp c++ 五级知识点

MMD.然大大 2009

【即插即用模块】注意力篇 | TGRS 2025 | SCPP:独家复现!三特征多尺度注意力融合,涨点必备!

摘要:SCPP(Scale-aware Pyramid Pooling)是一种创新的多尺度特征融合模块,专为U型网络瓶颈设计。它通过局部特征提取(1×1卷积)、多尺度膨胀卷积(1/3/5膨胀率分支)和全局特征聚合(全局平均池化)三重结构,结合SE通道注意力机制和自适应加权融合,显著提升特征表达能力。实验表明,SCPP能有效解决边缘模糊和错误检测问题,在遥感图像分割等任务中表现优异。该模块支持即插即用,适用于各类需要多尺度特征增强的视觉任务。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 944

1、osgViewer::Viewer,osgViewer::ViewerBase,osgGA::KeySwitchMatrixManipulator,osg::ArgumentParser的说明

一、osgViewer::Viewer类 Viewer() Viewer (osg::ArgumentParser &arguments) Viewer (const osgViewer::Viewer &viewer, const osg::CopyOp &copyop=osg::CopyOp::SHALLOW_COPY)说明:这三个函数是osgViewer::Viewer的构造函数。其中

sxj的专栏 2218

05GATK流程和找变异

05GATK流程和找变异 GATK 集合了一套功能全面的高通量测序数据基因组分析工具包,算是业界的权威,更新的速度非常快。需要注意的是,不同版本的 GATK 在工具应用上会有些许不同。这里我们使用是最新版本 GATK 4.1.4.1(截止2019年12月31日)。 数据准备 前面我们提到了,走GATK流程需要到官网下载很多数据库文件,比如下面这些: dbsnp_146.hg38.vcf.gz dbsnp_146.hg38.vcf.gz.tbi Mills_and_1000G_gold_standard.

qq_23435961的博客 1660

自定义一个简单的操控器类

osg已经自己实现了很多操控器类,这些操控器类存放在osg源码目录下的src\osgGA目录。感兴趣的童鞋,可以自己去研究源码。虽然说osg实现了很多常用的操控器类,但现实中的业务需求是各种各样的,当osg自己实现的操控器不能满足平时的业务需求时,就需要自己开发操控器,本博文通过实现一个简单的操控器,来说明如何定制开发自己的操控器类。

danshiming的博客 557

Deeplabv3+改进1:添加CBAM注意力机制|有效涨点

我们提出卷积块注意力模块(CBAM),这是一种简单而有效的前馈卷积神经网络注意力模块。给定一个中间特征图,我们的模块会依次沿两个独立维度(通道和空间)推断注意力图,然后将注意力图与输入特征图相乘,以实现自适应特征细化。由于 CBAM 是一个轻量级且通用的模块,它可以无缝集成到任何 CNN 架构中,几乎不会增加开销,并且可以与基础 CNN 一起端到端训练。我们通过在 ImageNet-1K、MS COCO 检测和 VOC 2007 检测数据集上进行的大量实验验证了 CBAM。

AIcurator的博客 1691

YOLOv8自定义训练:车牌识别全流程(从标注到推理,附可视化代码)

车牌检测全流程实践指南 摘要:本文详细介绍了基于YOLOv8的车牌检测完整实现方案。针对车牌检测中的三大难点(小目标、多角度、光照变化),提供了从数据准备到模型部署的全流程解决方案。重点包括:1)数据采集与标注规范;2)针对小目标的YOLOv8模型优化配置;3)K-means锚框聚类方法;4)训练参数调优策略。通过实际验证,该方法可获得95%以上的检测准确率,并附有完整的代码实现和可视化工具,便于开发者快速复现应用。 (字数:149字)

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 850

osg漫游器的原理和执行流程

关键词:manipulator; 漫游器; 第一人称漫游器; osg; osg漫游器的原理; osg漫游器的流程 从CameraManipulator讲起吧,CameraManipulator是漫游器的基类,它继承于GUIEventHandler class OSGGA_EXPORT CameraManipulator : public GUIEventHandler { ... }; ...

三维小糊涂,泽云,三维开发技术分享 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

osgGA::KeySwitchMatrixManipulator 跟随

#ifdef _WIN32 #include <Windows.h> #endif // _WIN32 #include <osg/Group> #include <osg/Camera> #include <osgDB/ReadFile> #include <osg/Node> #include <osg...

weixin_30399797的博客 431

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

MatrixManipulator类

MatrixManipulator 是一个基类,提供了各种接口,它提供的接口包括矩阵变换和事件处理。 从osgGA::MatrixManipulator类派生的子类就是OSG中默认的操作器,主要包括: osgGA::AnimationPathManipulator //动画路径操作器 osgGA::DriveManipulator //车行操作器 osgGA::FlightManipulat

hscoder的博客 1734

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

OSG处理键盘输入

本章目标: ¶使程序具备将键盘事件与特定函数相关联的能力。在前面的教程中我们已经可以使用更新回调来控制炮塔的旋转。本章中我们将添加一个键盘接口类,实现通过用户的键盘输入来更新炮塔的转角。GUI(图形用户接口)事件处理器:GUI事件适配器和GUI动作适配器 ¶GUIEventHandler类向开发者提供了窗体系统的GUI事件接口。这一事件处理器使用GUIEventAdapter实例来接收

痞子龙3D编程 6297

OSG场景鼠标操作器关闭throw功能

https://tieba.baidu.com/p/5528158582?red_tag=2814227647 前几天在mac上配置好了osg,发现运行osgviewer范例时,鼠标滑动后cow会旋转,加入setAllowThrow false后可以关闭这个效果。晚上回家在ubuntu上试试。 // set up the camera manipulators.     {         o...

tankweight的博客 1086

OSG学习——漫游操作器

在进行制作漫游操作器时,遇到了几个问题。 一:在新的版本下,:MatrixManipulator 已经改名为CameraManipulator。 二:在继承CameraManipulator的类中,四个虚函数 第1个和第2个为设置矩阵及设置逆矩阵,可以不进行设置。 第3个和第4个为得到矩阵和逆矩阵,其中得到逆矩阵和响应函数handle会每一帧都会进行渲染。 三:在响应函数handle...

城南花已开 887

浅谈在操控器类中,为何要通过osgGA::CameraManipulator的逆矩阵改变视点位置

这个变换的过程其实相当于需要求出把B点移回世界坐标原点的矩阵,A点再乘以这个矩阵就可以,这个移回的矩阵是这样计算的,把人从世界坐标原点移到B点的变换是Matrix,而把B点移回世界坐标原点的变换就是InverseMatrix,现在我们要把A点放在以B点为局部坐标下,则需要变换的就是InverseMatrix。原因这里有点绕,大家认真理解一下,世界坐标下,一个盒子在A点(xa,ya,za),视点在B点(xb,yb,zb),先不管朝向不朝向的。虽然入参不一样,但是跟踪一下会发现会调用过去的。

danshiming的博客 548

OSG人机交互

OSG人机交互

小猿一枚的专栏 2362

【OSG学习笔记】Day 14: 操作器(Manipulator)的深度使用

如果内置的操作器无法满足需求,我们可以继承类来实现自定义操作器。home():重置操作器到初始状态。handle():处理事件(如鼠标、键盘输入)。和:返回摄像机的变换矩阵和逆矩阵。

u012739527的博客 751

osg源码分析osgGA/KeySwitchMatrixManipulator

/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield * * This library is open source and may be redistributed and/or modified und...

chenyijie1529的博客 394
上一篇: osg操控器之动画路径操控器osgGA::AnimationPathManipulator分析
下一篇: 利用几何画板Sketchpad画球体的方法
荆楚闲人
博客等级 码龄20年 3万+粉丝 473原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值