基于OSG的虚拟校园系统的设计与实现

news2025/1/31 8:25:55

基于open scene graph的虚拟校园系统的设计与实现
摘要
•引言
• OSG基本原理
•OSG操作与动画
•视点的定位和切换
•自由漫游
•路径漫游
• 路径动画
• 点选和文字
• 粒子系统
• 3DMAX
• 无线通信与数据库设计
• 实现步骤
• 结论
摘要
随着科技的不断发展,人工智能(AI)和虚拟现实技术(VR)已经逐渐成为当前的热门领域,吸引了很多人相继投身于其中.三维虚拟学校系统基于Open Scene Graph(简称OSG,三维图形引擎)和NB-IoT通信网络,是在现代3D图形仿真和通信产业正当兴起的情况下来建设的.主要面向大学生群体,提供了一个直观认识学校的良好的印象.比如学生在入学前了解学校、各院实验室参观时,能够提供详尽的地图导航,引领你走遍学校的每一个细节.通过对视口的切换,改变天气,以及自由漫游路线,可记录下不同的美丽路径,方便以后漫游,能够最直观地认识学校. 关键词:open scene graph,物联网,3D仿真

 

•引言
传统的高校宣传大多是通过印刷文字和图片结合的宣传页来进行宣传的,学校各类情况信息的介绍还仍停留在图片与文字相结合的层面上,只能通过静态的方式进行信息展示,不够生动,形象和直观.同时,学校是一个大型区域,各类信息都在动态变化,而且,为了跟随并适应社会发展和增强自身的竞争能力,学校在各方面不断地进行改革,种种变化都给学校的管理工作带来了很多麻烦,也会对学校外来人员甚至学校自身包含的学生带来不便.所以,学校急需改变目前的现状,从而向大众更加生动形象地宣传和推广自身.随着科技的不断发展,人工智能(AI)和虚拟现实技术(VR)日渐成熟,为我们解决上述问题提供了帮助,本文所设计的三维虚拟学校系统就是基于Open Scene Graph在虚拟现实技术(VR)领域和无线通信技术来建设的.三维虚拟校园系统可以从校园环境及时更新、加强学生与学校之间的沟通、存储大量信息三个方面解决以上所有问题并带给老师与学生更好的精神体验和情感体验,从而扩大学校办学影响力,提高学校的竞争力,树立良好的形象.

• OSG基本原理
Open Scene Graph,是国外一名飞行员开发的开源C++库,用于实现3D模型的仿真场景开发.后来在400多名国内外程序员的共同开发下,它的规模越来越大,各种拓展包层出不穷,如:osgEarth,数字地球模拟;osgOcean,海洋流体模拟.
1)坐标系与矩阵osg坐标系是依据笛卡尔坐标系确认方向,其方向为:X向右,Y向里,Z向上.对虚拟场景中的三维物体实施标准变换,就是对物体本身的顶点矩阵实施变换.三维的坐标变换采用4*4矩阵,需要经过统一的平移和缩放为矩阵乘法的形式来计算. T=例如当需要旋转时,调用子矩阵:T=用于旋转操作.绕X轴旋转:[X Y Z 1]=[X Y Z 1]
2)场景节点树当用OSG建立一个场景时,是以节点树的方式,将做好的3D模型放入场景.通常的做法是在根节点root上添加Switch节点,该节点是开关节点,能够关闭该节点下的任意节点;在下面加入MatrixTransfrom节点,用于设置位移缩放等属性,和特效节点,该节点一般为雨雪效果或光源等节点;最后在MatrixTransfrom下面加入叶节点,也就是做好的3D模型.这样一层一层就能搭建一个场景树结构.最后在视景器viewer中viewer->setscenedata(root);便能直观地显示出3D模型,如图1所示。


•OSG操作与动画
想要在osg中实现键盘或鼠标点击事件,给用户带来更多选择,也就是切换摄像机位置和视角方向,必须通过矩阵方式改变传递参数值给摄像机设置.Osg中为开发者提供了相应的接口,osg:: CameraManipulator,继承自osg::EventHandler,中文名是操作器,能够实现对初始视点的定位,自由漫游,路径漫游等制作动画.

•视点的定位和切换
首先要设置开场视角,设置为透视视角.继承osgGA::CameraManipulator类,在构造函数中,设定类成员m_vPosition和m_vRotation,在得到矩阵方法getMatrix和getInverseMatrix方法中返回矩阵,返回给视景器viewer.如果初始视点设置不好,用户一进入界面,飞到地下或云朵上,就没有人性化的体验.通过setMatrix和setInverseMatrix的方法,同样输入矩阵就可以切换视点.

•自由漫游
为了让用户能够实现如同CS游戏的第一人称漫游,按wasd实现移动,这里继承osgGA::CameraManipulator类,通过事件处理函数对public变量赋值进行操作.当得到键盘按键方法ea.getKey() == ‘’时,设置视点位置m_vPosition和方向m_vRotation,返回给视景器viewer.

•路径漫游
摄像机按路线变化位置和视角.能够实现如同坐过山车一般的体验.Main函数中调用osg自带的osgGA::AnimationPathManipulator类,继承自osgGA::CameraManipulator.能够实现将设计好的路径动画传进去,这个操作器便能够创建视点移动动画,循环往复,自由设计,osg::ref_ptrosgGA::AnimationPathManipulator apm = new osgGA::AnimationPathManipulator(CreatePath());viewer->setCameraManipulator(apm);然后将预先设计好的路线传到AnimationPathManipulator中.

• 路径动画
在osg中,想要实现动画,有骨骼动画,帧动画等方式.这里使用帧动画的方式在osg中制作动画,用到osg::AnimationPath类,通过对各个帧内时间和物体变化矩阵的插值,合成为动画.


• 点选和文字
Osg支持文字信息输出.可以以HUD的形式输出到界面上,当鼠标在屏幕滑动时,也就是从屏幕上发出一条射线,与 3D 模型的场景会有很多的交点,我们取最后一个交点为鼠标在世界坐标系中的坐标.之后得到该坐标的节点的场景图形的名字,便可以输出存放于数据库的信息.将该事件加入操作器中,可以实现鼠标点击出现信息的功能.


• 粒子系统
粒子系统目前主要用来模拟虚拟环境中的爆炸效果,火焰的燃烧效果或者一些流水现象,这里将该效果用来描述雨雪天气,由于该系统是由一些散装的微小粒子(较小物体)聚集起来,再在算法下沿着一定的方向移动,形成屏幕上呈现的效果.这里使用osg自带的osgParticle::PrecipitationEffect,在main函数中加入节点树,便可以看到雨雪效果.

• 3DMAX
设计虽然osg可以用于构建图像,但是过于精密的图像还是需要另外的设计软件,网络上百家争鸣,比较广泛的使用的有:Autodesk的3DMAX、CAD,或是MAYA、ZBRUSH.各色渲染性能各有不同.单从难易度上讲,我们选择3DMAX作为3D模型设计工具.3DMAX的应用领域众多,在此,我们利用3DMAX实现了在虚拟现实中的运用,用到其中的样条线、文本,材质编辑器、缩放等功能.实现了路线设计、三维字体设计、建筑中心坐标的设置和调整建筑物大小.尽可能比较还原地设计了真实学校。图4 衢州学院3Dmax透视图

• 无线通信与数据库设计
基于NB-IoT实现远程通信.NB-IoT无线收发模块,是近几年流行起来的物联网模块,其主要功能是全球传感数据采集,连上基站,通过窄带网络将网络数据包发送给服务器.在当今中国网络基站遍布的状况下,理论上通信范围为无限远,我们采用移远公司的BC20模块,根据用户需求私人定制传感器连接,如摄像机数字图像处理检测停车位是否空闲后,BC20能够将信息打包发送至服务器,再加上VC++应用程序能够实现简单的UDP远程通信和SQL server数据库调用,能够在服务器上将无线传感器信息传入数据库,输出给图形界面.比如客户需求是校园内停车位情况数据采集.通过开启UDP端口识别进程后,应用程序对安置在停车位上的NB-IoT停车位检测装置传来的车位空闲情况的识别,应用程序自动修改数据库,osg渲染引擎对数据库的调用,将能够实现24小时的无休自动化工作.你随时能够在服务器上以3D图像的方式,比以往更直观地查阅到校园内动态停车信息展示.


• 实现步骤
1)通过3DMAX建筑建模,尽可能将校园建筑还原.
2)在osg图形界面中添加根节点和子节点,将3DMAX文件导入.
3)添加操作器和其他响应事件,使得用户能够获得更加人性化的漫游体验.
3)硬件传感器在校园各地安置,检测需要的数据,传给服务器.
4)将应用程序发至服务器,添加无线通信和数据库,将在各地采集的数据传入,在服务器上能够更加直观地看到数据.
5)软件性能优化,硬件定时维护.


• 结论
Osg属于计算机图形学范畴,使用osg能够给数据带来最直观的表现.如果将在各地采集到的数据,以一种图形化的方式显示,则能够十分清晰地看到数据传输和动态,轻松掌握真实世界各地情报,为物联网的发展实现更进一步的飞跃. 参考文献
[1]OSG(OpenSceneGraph)安装.[OL]. https://www.jianshu.com/p/7fb0e414e1a9
[2]MFC HYPERLINK "https://www.cnblogs.com/wkfvawl/p/11101171.html"图形编辑界面工具.[OL]. https://www.cnblogs.com/wkfvawl/p/11101171.html
[3] SXEarth三维数字地球.[OL]. http://www.sxsim.com/h-col-106.html
[4] osg 场景漫游.[OL].https://www.cnblogs.com/herd/p/11125192.html
[5]osgEarth例子.[OL].https://www.cnblogs.com/coolbear/archive/2013/07/16/3192866.html
[6]杨化斌.OpenSceneGraph 三维视景仿真技术开发详解[M].北京:国防工业出版社.
[7]最常见的开源游戏引擎.[OL].http://www.open-open.com/lib/view/open1349767893947.html
[8] osg HYPERLINK "https://www.cnblogs.com/lyggqm/p/9505448.html"背景图设置.[OL].https://www.cnblogs.com/lyggqm/p/9505448.html
————————————————
版权声明:本文为CSDN博主「笑舞阳」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sky_fireblue/article/details/111990977

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/363238.html

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

相关文章

2023年,8种必备Selenium编写自动化用例的技巧

在开始自动化时,您可能会遇到各种可能包含在自动化代码中的方法,技术,框架和工具。有时,与提供更好的灵活性或解决问题的更好方法相比,这种多功能性导致代码更加复杂。在编写自动化代码时,重要的是我们能够…

2023年网络安全十大发展趋势

近日,中国计算机学会(CCF)计算机安全专委会中来自国家网络安全主管部门、高校、科研院所、大型央企、民营企业的委员投票评选出2023年网络安全十大发展趋势。 趋势一 数据安全治理成为数字经济的基石 我国《数据安全法》提出“建立健全数据…

spring的启动过程(一) :IOC容器的启动过程

一、web容器的加载 首先我们要先知道一个web项目的启动过程。 将Web项目部署到Tomcat中的方法之一,是部署没有封装到WAR文件中的Web项目。要使用这一方法部署未打包的webapp目录,只要把我们的项目(编译好的发布项目,非开发项目&am…

掌握MySQL分库分表(五)SpringBoot2+MybatisPlus整合Sharding-Jdbc水平分表实现

文章目录创建Java-Maven项目创建数据库、表创建Java实体类配置启动类水平分表配置文件配置测试分库分表实现分析控制台SQL逻辑SQL真实SQL主键重复问题创建Java-Maven项目 添加依赖 <properties><java.version>11</java.version><maven.compiler.source&…

PMP考试有没有什么技巧可以介绍一下么?

一、试题形式 ——中英文对照 即每道题都是一遍英文&#xff0c;一遍翻译的中文&#xff0c;在审题的时候有一些小的技巧需要注意。首先如果你的英文水平足够好&#xff0c;建议直接阅读原文。PMP试题毕竟是美国人出的&#xff0c;语言的组织、思想的表达&#xff0c;肯定更符…

python居然能语音控制电脑壁纸切换,只需60行代码

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 家在日常的电脑使用中&#xff0c;都会有自己喜爱类型的桌面 单纯的桌面有时候会让人觉得单调 今天&#xff0c;就由我带领大家只用60行代码打造一款语音壁纸切换器程序&#xff0c; 让大家能够通过语音的方式来控制电脑去…

c++模板的简单认识

文章目录 前言一.泛型编程 函数模板 模板参数的匹配原则 类模板总结前言 ADD函数很好写&#xff0c;但是如果我们要有int类型的&#xff0c;double类型的&#xff0c;char类型的等等各种类型&#xff0c;难道要写这么多不同的ADD函数吗&#xff0c;这么写简直太麻…

Linux:基于bufferevent epoll tcp服务器代码

基于bufferevent epoll tcp服务器代码: #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <string.h> #include <event2/event.h> #include <event2/buffer…

Excel/Word的一些快捷操作整理

Excel/Word的一些快捷操作整理 1. 给Word文件导入目录 前提&#xff1a;大致内容已经定稿&#xff0c;文章中各标题分级明确&#xff0c;最好各级标题字体大小设置不一样。 步骤&#xff1a;在头部导航栏&#xff0c;选择**“引用”–“目录”**&#xff0c;根据自己需求选择其…

KDJB1200六相继电保护测试仪

一、概述 KDJB1200继电保护测试仪是在参照电力部颁发的《微机型继电保护试验装置技术条件(讨论稿)》的基础上&#xff0c;广泛听取用户意见&#xff0c;总结目前国内同类产品优缺点&#xff0c;充分使用现代新的的微电子技术和器件实现的一种新型小型化微机继电保护测试仪。可…

DataWhale 大数据处理技术组队学习task3

四、分布式数据库HBase 1. 产生背景 1.1 Hadoop的局限性 优点&#xff1a;存储结构化、半结构甚至非结构化的数据&#xff0c;是传统数据库的补充&#xff0c;是海量数据存储的最佳方法。缺陷&#xff1a; 只能进行批处理&#xff0c;并且只能以顺序的方式访问数据。&#x…

【C++】-- 异常

目录 C语言传统的处理错误的方式 C异常概念 异常的使用 异常的抛出和捕获 自定义异常体系 异常的重新抛出 异常安全 异常规范&#xff08;C期望&#xff09; C标准库的异常体系 异常的优缺点 C异常的优点 C异常的缺点 总结 C语言传统的处理错误的方式 传统的错误…

zookeeper单机部署

一.下载zookeeper压缩包 二.上传解压安装包到/data/zookeeper目录&#xff0c;并解压 tar -zxvf apache-zookeeper-3.5.8-bin.tar.gz 三.修改配置文件 cd apache-zookeeper-3.5.10-bin/conf mv zoo_sample.cfg zoo.cfg vi zoo.cfg 修改为如下&#xff1a; dataDir/data/zooke…

【研究空间复用及函数调用问题】

本篇总结函数调用过程会存在的一些奇怪现象&#xff0c;空间复用问题&#xff0c;其实本质上涉及函数调用的底层原理&#xff0c;理解函数栈帧的创建和销毁这样的问题直接迎刃而解。1.空间复用问题案例1案例22.函数调用过程不清晰问题案例33.总结1.空间复用问题 案例1 我们先…

程职场人必备微软出品的实用小工具

系统增强工具PowerToys 下载地址&#xff1a;https://github.com/microsoft/PowerToys 什么是 Windows 系统中&#xff0c;最好的辅助工具&#xff1f; PowerToys 一定可以获得提名。PowerToys 是一款来自微软的系统增强工具&#xff0c;就像是一个神奇的系统外挂&#xff0c;…

精确控制 AI 图像生成的破冰方案,ControlNet 和 T2I-Adapter

ControlNet 和 T2I-Adapter 的突破性在哪里&#xff1f;有什么区别&#xff1f;其它为 T2I 扩散模型施加条件引导的相关研究ControlNet 和 T2I-Adapter 的实际应用效果如何&#xff1f;使用体验上&#xff0c;跟 SD原生支持的 img2img 有什么区别&#xff1f;ControlNet 在插画…

电商数据采集——2022年中国手机行业数据浅析

据国家统计局数据显示&#xff0c;2022年12月&#xff0c;国内手机产量当期值为14310.3万台&#xff0c;同比下降18.4%&#xff1b;累计值为156080万台&#xff0c;同比下降6.2%。 据中国信通院数据显示&#xff0c;2022年12月&#xff0c;国内市场手机出货量2786.0万部&#x…

F.pad() 函数

F.pad() 对tensor 进行扩充的函数。 torch.nn.functional.pad (input, pad, mode‘constant’, value0) input&#xff1a;需要扩充的 tensor&#xff0c;可以是图像数据&#xff0c;亦或是特征矩阵数据&#xff1b;pad&#xff1a;扩充维度&#xff0c;预先定义某维度上的扩充…

内存泄露定位手段(c语言hook malloc相关方式)

如何确定有内存泄露问题&#xff0c;如何定位到内存泄露位置&#xff0c;如何写一个内存泄漏检测工具&#xff1f; 1&#xff1a;概述 内存泄露本质&#xff1a;其实就是申请调用malloc/new&#xff0c;但是释放调用free/delete有遗漏&#xff0c;或者重复释放的问题。 内存…

搞懂事件——C# 的event的机制深度理解

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:无尽的折腾后,终于又回到了起点,工控,我来了 !1. 前言 为什么忽然对Event感兴趣了? 因为进入Web时代以后,很少使用它了,忽然想起这个知识点,…