[原创] 盟军敢死队 - 3D导航网格浏览器W. I. P

Commandos 3D .Sec Viewer W. I. P
 

简述:.Sec文件是盟军敢死队2/3中用来存储地形网格的专属文件,在游戏中,该地形网格主要用来实现三维的逻辑判断、提供必要的地形信息并辅助二、三维图像的混合渲染。本项目旨在实现一个支持三维显示的.Sec文件浏览器,通过解析盟2/3的.Sec文件格式,以三维立体形式再现其中的地形信息。近期计划是实现3D渲染、区域平面拾取和相关信息显示功能;远期计划是进一步提供.3ds文件与.Sec文件的双向转换能力,及地形属性设置功能,最终实现一个部分依赖于3DS Max、集查看、修改、优化和校验功能于一身的.Sec文件修改工具,从而为盟2/3的地图MOD提供必要的手段。

声明:本项目纯属个人休闲娱乐,仅供业余时间研究用,与任何团体或商业机构无关。不定时更新中。

鸣谢:本项目在开发过程中得到了盗版钦差rex等两位的大力支持和帮助,特在此表示感谢!

下载:最新的发布版本(12/19/2006),测试用.Sec文件下载已取消,请自行提取。


2006.12.1
一直很喜欢Commandos 2,它精美的室外场景和复杂的室内结构给我留下了深刻的印象。怀着对盟2制作者技术水平的尊敬,并出于relaxing myself的目的,这两天断断续续地思考了一下盟2的技术特点。发现它的室外场景非常有特色:为降低对机器性能的要求,其作者采用了2维-3维混合的渲染方式,即人物和车辆都是纯3维的,其室外地图场景中的逻辑判定也是纯3维的,而地图场景的绘制却是以2维方式来进行的,比方说sprite遮挡、alpha覆盖等,其实采用的都是2维的处理手法。

这样做的好处是很明显的,我们可以从多个角度来考虑这个问题:首先,这使得其室外场景极其精美,盟军画面的一个主要特色在于其大地图都是手绘的,在不提高硬件要求的前提下,这种方式保证了其画面质量能够达到一个非常高的水平;其次,室外场景的3维判定逻辑使得在2维画面上人物的行为变得十分自然,比方说从低处爬楼梯爬到高处,其人物位置的变化真实而富有立体感;当从树荫下走到没有阴影的地方,人物显示亮度会发生变化;还有高处悬崖上的哨兵不能发现处于自己正下方的特种兵等等,这些动态细节的展现放在纯2维场景中是不可想象的;最后,这种混合处理方式使得其室内室外场景在引擎的逻辑判断技法方面得到了统一,因为其室内场景是全三维的,从而简化了引擎设计。

当然,弊端也存在着的:首先,由于是手绘室外地图,2维美工的工作量相当大,因此室外场景只能旋转4个固定方向;其次,3维判定网格的视角必须和2维地图严格匹配(上图),因此在制作时需要额外的协调工作,这个工作量也不小,我猜想Pyro的美工可能将不得不首先将全部场景中的三维模型都初步的做出来,然后打光,然后再选取好4个角度定位,最后交给2维美工来打底稿——至于.sec文件中所存放的,其实只是前者的一个低模而已;第三,引擎还是要同时应付2维-3维场景渲染的问题,如3维转换、2维遮挡等,而且用这种方式来实现动态2维场景其工作量也较大,比方说让树枝随风摇曳啥的,盟2/3里面恰好是没有这种动态效果的。

总之,有利有弊,关键在于如何根据游戏性来进行权衡和取舍,我觉得盟2的技术思路在这方面做得是非常cooooool的,或者说,它以事实告诉我们,当前2-3维混合渲染的方式在很大程度上还没有被人们所充分挖掘。

OK,先贴个最初的图,目前搞定了初步的水平面、垂直面插补及其法线计算,还有光照效果,不过Z-深度和垂直线框还没有搞定,这从图上可以看得出来,该消隐的线并没有被遮挡掉,so 这个立体感么…有点不对劲…不过至少线、面的计算大抵都还是正确的。


2006.12.2
消除了区域线框与共面多边形的Z-Fighting,现在红色的区域线框也可以被正确地消隐了,而且非常清晰,比单纯看白模有立体感多了。另外,把垂直线框(蓝色)也描出来了。令人失望的是,似乎在较大的场景中,所有计算所得的垂直面绘制出来之后显得异常的杂乱,Why?:(


2006.12.3
突破性进展! 已经证实造成大场景中垂直面错位的原因在于.Sec文件数据本身便存在着不一致的情况,而且还非常普遍,多处字段内容需要进行额外的校验和纠正,这也许是Pyro的工作人员反复地修改模型所导致的吧...目前所有大地图上的复杂场景都显示正常了,包括我最喜欢的Castle ColditzSavo Island,先放个White Death的幻灯吧,还记得这个著名场景么?;)

 


2006.12.4
整理了一下代码,发现了一个垂直插补面法线计算的bug,浮点运算的结果总是那么微妙… 同时稍微改进了一下代码,现在支持地形属性着色了;) 还记得萨沃岛拉罗谢尔潜艇基地吗?呵呵,从着色模型上可以很清楚地看出各处的地形特征,比如,深蓝色区域代表着深水、桔色代表沙土地、灰色代表水泥地面、金色代表木质地面、绿色代表草地、深绿色代表被阳光阴影覆盖的草地、黑色代表着不可进入的区域等。


2006.12.5
添加了对盟3 .Sec文件的显示支持,感谢rex提供的信息帮助。不过看下来感觉盟3中室外地图可没有盟2的出彩,大多数偏小,而且构图也很简单,尤其是室内场景,更是远不及盟2丰富…这再次说明盟3只不过是盟2的一个简化版expansion。


2006.12.6
开始关注渲染效率的问题,优化了一下水平、垂直网格中的顶点数量;并且修正了一个在计算垂直插补面时因不正确的Border重复剔除所导致的线、面缺失的bug。至目前为止,尽管仍然存在着部分点、线、面的数据冗余,但整个模型的计算应该是没有什么大问题了。


2006.12.7
添加了水平区域的鼠标拾取功能,呵呵,一个有趣的矩阵计算游戏,现在能够以任意视角点选模型中的任意平面了,hmm... 也许其计算效率还有提高的余地... 同时发现了一个致命的bug:由于没有考虑网格和线框数据为空的情况,当根本不存在任何垂直网格或线框需要绘制时,程序将会崩溃… 把这个问题修正之后试了一下,几乎所有的.sec文件都能正常绘制了;D


2006.12.8
小小的改进了一下,目前可以在当前拾取的多边形区域质心处显示其编号了,又一个小小的数学游戏,呵呵。感觉画面的刷新速率还不太令人满意(我的眼睛对帧频抖动极其敏感),又把代码review了一遍,发现了一个潜伏已久的低级错误-_-b:线框中的近万条直线居然是一根一根绘制的… 这种效率极低的方式不仅容易导致CPU和显卡处理速度的不匹配,而且至少占用了15-20%的CPU处理能力…改成一次性向显卡发送多根(>4096)直线的绘制指令之后,rendering pipeline终于顺畅了,CPU占用率也随之骤降,持续稳定在1%左右,效果极好!


2006.12.10
为便于澄清地形属性中还不甚明了的部分信息所代表的含义,添加了一项类似半透明HUD的区域信息显示功能。修正了一个因窗口Resize事件而导致的拾取系统计算错误。改了改对字体和Sprite等资源的生存期管理方式,但感觉仍不太满意...看来这个框架性顽疾非得解决不可。


2006.12.12
下了狠心大动干戈。将整个程序的异常处理及其资源管理部分的代码彻底地重写了一遍,总算可以近乎完美地应付各种设备丢失的情况了,同时还修正了一小部分D3D资源泄漏的框架性问题,程序稳定性得到了空前提升(甚至可以和warcraft 3毫不冲突的同时运行!heh)。顺手把窗口缩放处理的代码也添进去了,再也不必像以前那样需要忍受缩放窗口所导致的画面模糊了。此外,还提供了全屏显示支持,突然发现其效果比窗口显示模式要炫得多,呵呵


2006.12.14
小改进,在标题栏和HUD中显示当前的.sec文件名。试着添加了一下Flexible Camera System,感觉前后左右平移Camera用起来并不太方便,所以做了些设计改动,添加了一项“Camera粘着”的新功能,只需在你感兴趣的区域面上双击左键,该选中区域的质心即成为整个模型的旋转轴心,这样便能够很容易地观察任意一处的局部细节了,很简单,但是操作很快捷、也很高效。最后提示一下,'R'键是恢复默认Camera旋转轴的复位键。


2006.12.19
小改进again,闲暇的时候修正了一下对模态对话框的兼容性,顺便整理了一下框架代码(仍需进一步整理...),现在可以直接打开其他.Sec文件而无需每次都重启程序了。快捷键是'O'键。由于模态对话框与全屏显示模式不兼容,因此全屏版下载取消...

posted @ 2006-12-13 22:06  neoragex2002  阅读(2904)  评论(11)    收藏  举报