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

简介: 老程序员分享: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相关参考

相关文章
|
存储 缓存 NoSQL
Leveldb学习笔记:leveldb的使用与原理探究
Leveldb学习笔记:leveldb的使用与原理探究
Leveldb学习笔记:leveldb的使用与原理探究
|
8月前
|
机器学习/深度学习 人工智能 文字识别
Umi-OCR:31K Star!离线OCR终结者!公式+二维码+多语种,开源免费吊打付费
Umi-OCR 是一款免费开源的离线 OCR 文字识别工具,支持截图、批量图片、PDF 扫描件的文字识别,内置多语言识别库,提供命令行和 HTTP 接口调用功能。
789 0
Umi-OCR:31K Star!离线OCR终结者!公式+二维码+多语种,开源免费吊打付费
|
10月前
|
PyTorch 算法框架/工具 芯片
新手入门:DGL在昇腾上的安装问题
本文介绍了在aarch64架构和Python 3.10环境下安装DGL(Deep Graph Library)的过程。首先通过`uname -a`确认硬件架构,接着使用`python --version`检查Python版本。为确保兼容性,从指定链接下载适合的whl包或通过pip安装dgl。过程中遇到了torchdata版本不兼容的问题,通过降级torchdata至0.7.1版本解决。此外,针对NPU芯片适配,重新安装了与CANN 8.0.RC2兼容的torch和torch_npu组件。最终成功导入dgl包并准备进行模型训练验证。
Cmake生成指定vs版本的工程文件
本文简单总结了使用 cmake 生成 visual studio 工程文件的过程
|
Ubuntu Unix Linux
Linux专栏01:Linux发展历史及背景介绍
Linux专栏01:Linux发展历史及背景介绍
800 0
|
存储 人工智能 程序员
技术心得记录:堆(heap)与栈(stack)的区别
技术心得记录:堆(heap)与栈(stack)的区别
257 0
|
SQL 调度 数据库
【Database】Sqlserver如何定时备份数据库和定时清除
【Database】Sqlserver如何定时备份数据库和定时清除
957 2
|
Python
如何使用正则表达式提取网页中的特定信息
如何使用正则表达式提取网页中的特定信息
572 1
|
算法 API 开发者
【Qt UI相关】Qt中如何控制 窗口的最大化、最小化和关闭按钮?一文带你掌握用法
【Qt UI相关】Qt中如何控制 窗口的最大化、最小化和关闭按钮?一文带你掌握用法
3116 1
|
物联网 Android开发
【Android App】发送BLE广播及通过主从BLE实现聊天应用讲解及实战(附源码和演示 超详细)
【Android App】发送BLE广播及通过主从BLE实现聊天应用讲解及实战(附源码和演示 超详细)
2675 1