老程序员分享:palomino项目简要分析(开源,基于osg)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 老程序员分享:palomino项目简要分析(开源,基于osg)

Palomino值得一提的他的架构,非常灵活,场景的控制用的是lua脚本,其他的开发人员可以以自己的方式编写lua脚本,组建不一样的场景,而不用修改很多c++的代码;当然也是比较难以掌握的,特别是要调用c++写的函数必须要了解每个函数的用处和用法,同时要熟练掌握lua脚本。


(源码地址:


1.1 场景简介


l 海面、天空:整个程序的情景是大海中的航母,及起飞的飞机,敌方导弹等。主要的背景是大海和天空。有涌动的海面、飘着白云的天空。


图 4_x005f_x001e_1初始画面


l 飞机:飞行中的飞机可以通过0-9键控制飞机的速度,通过上下左右键控制飞机飞行的方向和高低


图 4_x005f_x001e_2飞行并锁定任务的飞机


l 向目标发射导弹,我们可以看到导弹飞行的粒子效果


图 4_x005f_x001e_3 攻击目标


l 飞机坠毁效果,可以按Backspace键重新开始游戏


图 //代码效果参考:http://hnjlyzjd.com/hw/wz_23997.html

4_x005f_x001e_4 坠毁的飞机

1.2 程序结构


? 本模拟程序是基于OSG游戏引擎。在该引擎中添加了模型、粒子系统、键盘监听和模型轨迹控制等部分。工程代码的结构如下图所示:


图 4_x005f_x001e_5 工程结构图


1.2.1 程序的架构


场景的布置,任务的管理还有游戏的逻辑都是用脚本来完成的。


C++:


· simulator core


Lua:


· scene construction


· keyboard handling


· missions


· updating HUD


1.2.2 各lua脚本简介如下


? Actors.lua脚本内容分析


下面是几个物体相关的类的定义和实现:


1. -- Actor class –


这个类也就提供了一些基本的构造、析构、计时、获取其下相应3D对象等方法


2. -- AircraftActor –


继承于actor类,会在一个actor对象下挂载一个aircraft


3. -- PlayerActor (singleton) –


提供一个加载飞行器的播放器(player),并提供该飞行器相关操作的方法:发射导弹、开枪、调整羽翼等


4. -- MissileActor –


导弹类,继承于actor


5. -- SamActor –


该类控制导弹的射程范围以及发射


? Lib.lua脚本内容分析


这个脚本里面提供lua里面的基本方法:


1.//代码效果参考:http://hnjlyzjd.com/xl/wz_23993.html

lib.int(f)—将小数f整理为不大于它的整数并返回

2. lib.default(arg,default)—将arg设置为default如果arg=0


3. lib.NewInstance( classTable, argTable )—返回类classTable的实力


4. lib.DerivedClass( BaseMT )—继承


5. lib.DESTROY( table, member )—销毁table中的member元素


6. lib.CompareTables( t0, t1 )—比较两者,同则true,否则false


7. lib.Iterator( t, startingKey )—迭代器,返回第k个元素的地址


8. lib.IteratorAfter( t, key )—返回key的后一个元素地址


9. lib.ArrayRemove( t, val )—删除t中元素


10. lib.ArrayRotate( t )—逆序


11. lib.CatWords( s1, s2 )—链接两者


? sim_generic.lua、sim_specific.lua脚本内容解析


提供一些通用的库函数,用于物体与模拟器的交互,提供操纵object的方法:放置于scene、删除于scene等


This extends and supplements what C++ exports to Lua.


这个脚本拓展和提供c++提供给lua的接口


? sound.lua脚本内容解析


负责声音的播放,播放主题背景音乐和事件的音乐


? startup.lua脚本内容分析


开始log文件,


加载入所有lua脚本,以供程序调用接口


? Tick.lua脚本内容解析


控制时间的,每一个timer-tick都会调用该脚本


时钟周期负责场景的刷新啊、渲染啊等工作的节奏控制


? Timer.lua脚本内容解析


负责timer-tick回调函数的注册


? Views.lua


负责飞行员的视觉的模式和亮度的调整与控制


? Wenpon.lua脚本


飞机的雷达系统控制,可以获得雷达锁定的物体,雷达是与actor结合使用的,即挂载到actor上的,具体见actor脚本


? Cmd.lua脚本


模拟器的所有操作会被记录到一个cmdline队列里面,这个脚本的任务便是从队列中取出命令并执行


? Gfx.lua脚本


负责坐标处理和图形处理的数学函数在里面


? Hud.lua脚本


抬头显示仪的控制,就是飞行员眼前的显示仪


? Joystick.lua脚本


操纵杆,就是操作人员的各种按键的控制,比如飞机坠毁后,就忽略所有按键响应


? Keyboard.lua脚本


控制键盘按键响应的


? Manipulator_mod.lua脚本


Ctrl-C:退出


Space:恢复视图


F9:线框模式


F11:重新装在scene


F12:保存画面


? Mission.lua脚本


飞行任务组,猜想可能就一个航母上面对飞机的配置和分配:保存程序状态、重置程序状态、新建target


? Mission_carrier.lua脚本


基类是mission.lua,这里面提供了mission的具体实现


将飞机放在carrier上面


对friend飞机的飞行与停止进行控制等等


? Mission_ossim.lua脚本


继续拓展mission基类。


定义了飞行演戏的地点,用户可以通过地名选择相应的地皮进行模拟。


? Replay.lua脚本


再来一局


? Scene.lua脚本


负责装入背景,根据地名和用户自定义,获知系统默认


? Scene_Goldengate.lua脚本


负责一些小东西的scene,如房子、船、导弹等等


? Games.lua脚本


1. 开始游戏,并开启计时器


2. 飞行员牺牲后重新设置游戏


3. 绑定actor,并在hud上显示(活着的飞机)


4. 接触绑定actor(坠毁后)


5. 通过名字获得actor


6. 将相应的actor和object联系起来


7. 判断actor是否是一个target(攻击对象)


8. 记录分数


9. 每一个时钟周期更新游戏数据


10. 处理撞机事件


11. 还有救援直升机


1.2.3 主要c++工程分析


? Base


如其名,很多比较底层的类在base里面实现,很多其他的工程的类继承自base里面的基类,此外base还提供了一些共享的目标文件以及timer


? Collision


这个类里面封装了底层的碰撞检测的方法,通过Dyna检测是否与其他物体发生碰撞


? Control


飞机的rate-of-roll/pitch/yaw的计算是通过动力学计算得到的。当接收到键盘的事件后在更新时候执行相应的回调函数,每次更新会轮训输入的控制队列,有事件则依稀执行。


? Lua


Lua模块包括lua_bind ,lua_lang,lua_lang提供的lua的一些接口。Lua_bing为lua脚本提供了c的接口


C++里面在program.cc对lua调用为GET_LUA().RunScript( "startup.lua" );从而把控制权交给了lua脚本


还有另外一处调用了lua脚本


void


Program::Tick( const Milliseconds millisecElapsed )


{


// Run a Lua script every tick.


GET_LUA().RunScript( "tick.lua" );


}


在c里面掉用tick不断地对场景进行刷新。


? 还有其他的一些工程,如sky,world,shader等是场景的组件,physics,math等封装一些动力学接口,palomino是整个程序的入口,即掉用startup.lua的位置。


PS:osg相关参考

相关文章
|
9月前
|
缓存 运维 语音技术
【Python 自动化】自媒体剪辑第一版·思路简述与技术方案
【Python 自动化】自媒体剪辑第一版·思路简述与技术方案
91 0
|
5月前
|
Android开发 计算机视觉 C++
FFmpeg开发笔记(五十一)适合学习研究的几个音视频开源框架
音视频编程对许多程序员来说是一片充满挑战的领域,但借助如OpenCV、LearnOpenGL、FFmpeg、OBS Studio及VLC media player等强大的开源工具,可以降低入门门槛。这些框架不仅覆盖了计算机视觉、图形渲染,还包括多媒体处理与直播技术,通过多种编程语言如Python、C++的应用,使得音视频开发更为便捷。例如,OpenCV支持跨平台的视觉应用开发,FFmpeg则擅长多媒体文件的处理与转换,而VLC media player则是验证音视频文件质量的有效工具。
127 0
FFmpeg开发笔记(五十一)适合学习研究的几个音视频开源框架
|
6月前
|
C# 开发者 Windows
勇敢迈出第一步:手把手教你如何在WPF开源项目中贡献你的第一行代码,从选择项目到提交PR的全过程解析与实战技巧分享
【8月更文挑战第31天】本文指导您如何在Windows Presentation Foundation(WPF)相关的开源项目中贡献代码。无论您是初学者还是有经验的开发者,参与这类项目都能加深对WPF框架的理解并拓展职业履历。文章推荐了一些适合入门的项目如MvvmLight和MahApps.Metro,并详细介绍了从选择项目、设置开发环境到提交代码的全过程。通过具体示例,如添加按钮点击事件处理程序,帮助您迈出第一步。此外,还强调了提交Pull Request时保持专业沟通的重要性。参与开源不仅能提升技能,还能促进社区交流。
68 0
|
8月前
|
算法 安全 Java
技术经验分享:JavaSecurity:Java加密框架(JCA)简要说明
技术经验分享:JavaSecurity:Java加密框架(JCA)简要说明
|
9月前
|
JSON 开发者 数据格式
揭秘5.3k⭐开发者的秘密武器:it-tools在线工具集,你不可不知!
揭秘5.3k⭐开发者的秘密武器:it-tools在线工具集,你不可不知!
80 0
|
传感器
时隔这么长时间,我把常用的功能整理好了,再来感受VueUse工具库的优雅吧~
时隔这么长时间,我把常用的功能整理好了,再来感受VueUse工具库的优雅吧~
时隔这么长时间,我把常用的功能整理好了,再来感受VueUse工具库的优雅吧~
|
JSON 监控 搜索推荐
高效学习工具三步曲
高效学习工具三步曲
161 0
高效学习工具三步曲
|
存储 Python
深度之眼(十六)——Python:有益的探索
深度之眼(十六)——Python:有益的探索
129 0
深度之眼(十六)——Python:有益的探索
|
程序员
我的收藏:第四章:八十种在线工具
我的收藏:第四章:八十种在线工具
167 0
我的收藏:第四章:八十种在线工具
|
消息中间件 运维 关系型数据库
金鱼哥RHCA回忆录:CL210云应用程序自动化(练习+章节实验)
第八章 云应用程序自动化(练习+章节实验)
281 0
金鱼哥RHCA回忆录:CL210云应用程序自动化(练习+章节实验)

热门文章

最新文章