今年国庆在csdn上写前端美化文章的时候,偶然间看到这款游戏(原先不知晓有这么个游戏,吸引我的应该是贴图占了很大比重),然后就下载来玩,期间也遭遇了游戏闪退、任务卡壳、mod安装闪退、mod不能使用、衣服移植、身形问题、高跟鞋问题等等,有时候真不知道是我玩游戏,还是游戏在玩我。不断的找资料,不断的解决问题,跌跌撞撞地完成了各主线和支线任务,mod也装上了100个,自己也简单做了些衣服移植、添加物理特效、炉火等等。(我自己在学校的时候也做过网络大规模三维场景重建,数据量有上10T,建筑物几千栋,都没感觉这么心塞过。)
1、游戏任务问题
一个任务常常通过对话、级别触发,游戏程序然后按照顺序结构执行。除去mod造成的任务卡壳以外,在谷歌或者百度上随便搜一搜,都会有几十甚至上百条的游戏任务卡壳问题,等待着有心人去解决。一般而言,游戏设计者对一个任务的设计有着不同的思考和考量,但对于玩家而言,在通常情况下是不知道这些考量的。在任务过程中,设计者如果不给任何的提示或者暗示,玩家很难能够找到目标所在,从这一点来说,思考不到位是游戏设计者考虑不周全的问题了。比如说刚开始游戏的时候,开墓室门的那个龙爪,有几个人会去看龙爪手心的图样,然后按照那个图样转动圆盘;又比如24个珍贵宝石的收集、30个猩红奈恩根收集,灵魂石冢书页的收集,不会告诉你宝石放在哪个位置,找奈恩根就更不想了,黑镜那种压抑的环境除了让人难受以外,你还有更好的形容词形容它?诸如此类的还有主线的上古知识、黎明守卫的触及天空、龙裔的知识之道、冬堡的遏制政策、阵容的天际解放等等。黑暗兄弟会、盗贼、战友团任务倒是还好,简单。汗,黑暗兄弟会的任务太阴暗有没有。进入那些矮人遗迹卡壳了,居然是1+1=2的算术题。
解决方式
涉及到一个任务有多个小项的时候,不查资料是不行的,网上有视频、图文的教程,但是吧,视频的教程时间实在太长,最难受的是发布视频的人各种阴阳怪气。至于游民星空的图文教程也可以看看的:
上古卷轴5支线任务教程:https://www.gamersky.com/handbook/201612/851478.shtml
上古卷轴5主线任务教程:https://www.gamersky.com/handbook/201610/827328.shtml
上古卷轴5控制台命令:https://www.gamersky.com/handbook/201111/185581.shtml
上古卷轴5炉火材料:https://www.gamersky.com/handbook/201612/843733_2.shtml
这些教程有时候一到关键点的时候,居然掠过了,而且毫无地图方向感可言,方向词表述都是前面、后面、左边、右边。对于玩家而言,站的位置跟与教程讲授的人不一样,我哪知道你说的前面、后面是啥,能不能在小地图上标出来,说个东边、西边、南边、东北之类的?所以游民星空教程只当是任务的大致流程看看,知道这个任务大致要做什么,可能的难点在哪里,真正难点的解决还得搜。
还是看官网吧:https://en.uesp.net/wiki/Main_Page (现在的中英文应该都不是问题了,谷歌翻译就好)
比如:官网触及天空任务项,官网会告诉你该项任务涉及有哪些NPC、龙吼、魔法、装备、地点以及完成任务的条件、任务完成后的成就。有时候任务做得烦心的时候,也实在不想做该任务了,可以查找任务项的任务编号,在游戏界面按“~”调出,使用player.setstage xxxx xx,该项任务完成。一般而言,任务可以分项完成,也可以全部完成。如果任务一下子全部完成可能出bug,这时应该查找任务的详细情况,知道做该项任务的时候涉及哪些NPC,任务物品,最后把物品和成就添加进去就好。还是拿黎明守卫的触及天空任务打比方,任务就是在遗失山谷里跑跑跑(会花掉你一个上午的时间),最后也只是得到一把奥利尔的弓而已,一点意思都没有,看看官网任务流程。
触摸天空(DLC1VQ07) |
||
阶段 |
完成任务 |
日记帐分录 |
10 |
上古卷轴提供的视野似乎表明,奥瑞尔之弓可能位于一个称为暗夜洞穴的地方。如果我想收回弓箭并阻止Harkon完成太阳的暴政,我应该在准备好后立即开始。 目标20:找到奥里尔之弓 |
|
上古卷轴提供的视野似乎表明,奥瑞尔之弓可能位于一个称为暗夜洞穴的地方。如果我想收回弓箭并阻止Harkon完成太阳的暴政,我应该在准备好后立即开始。 目标20:找到奥里尔之弓 |
||
30 |
目标30:与Gelebor对话 |
|
50 |
我遇到过格勒博尔(Gelebor),他是奥里·艾尔(Auri-El)教堂的雪精灵骑士-圣骑士。他要求我杀死被法尔默(Falmer)腐败的兄弟Arch-Curate Vyrthur。我得到了一个初始化之s,最终将使我能够进入大殿式维特图尔和奥里尔之弓所在的钱特里的内部圣殿。 目标50:生存暗黑通道 |
|
55 |
目标70:填充发起方的外溢( |
|
100 |
我已经完全满足了骑士帕拉丁·格勒博尔给我的“入门之壶”。剩下的所有东西都可以进入大礼堂维特图尔和奥里尔之弓所在的钱特里的内部圣殿。 目标80:进入内部圣所 |
|
110 |
我已经可以使用Chantry的内部圣所。我应该找到并面对Virthur大主教,以保卫Auriel的弓。 目标90:找到大主教维特尔 |
|
120 |
目标100:面对大主教维特尔 |
|
135 |
目标110:杀死大主教维特尔 |
|
140 |
目标120:与Gelebor对话 |
|
150 |
目标130:取回奥里尔的弓 |
|
200 |
据我所知,太阳暴政是由大厨维特尔(Arch-Curate Vyrthur)创造的,目的是报复他成为吸血鬼时斥责他的Auriel。他拥有Auriel的弓,但仍需要纯净的吸血鬼之血来完成他的仪式。这将塞拉纳置于致命的危险中,我别无选择,只能消灭他。我现在拥有《太阳暴政》的最后一部作品,Auriel的弓。 |
表格中省略了以下空任务阶段:0、35、36、60、65、70、80、81、82、85、86、87、90、91、92、95、96、97、105、130 ,131、132。
任务代码是dlc1vq07,任务将近有33项,10个大项,仔细看过以后从0到100项基本上是跑跑跑,真是烦,直接对照上古卷轴5支线任务教程:https://www.gamersky.com/handbook/201612/851478.shtml中的触及天空,将前面的任务全部用代码滤掉,跑到对应位置后,直接从100开始做任务。(网上也有人是用player.sqs 查任务做的,但当时我没完成的任务实在太多,分不清楚dlc1vq07是不是触及天空的任务编号)。嗯,解释型脚本语言。
player.setstage dlc1vq07 10
player.setstage dlc1vq07 30
player.setstage dlc1vq07 35
player.setstage dlc1vq07 36
player.setstage dlc1vq07 50
player.setstage dlc1vq07 55
player.setstage dlc1vq07 60
player.setstage dlc1vq07 65
player.setstage dlc1vq07 70
player.setstage dlc1vq07 80
player.setstage dlc1vq07 81
player.setstage dlc1vq07 82
player.setstage dlc1vq07 85
player.setstage dlc1vq07 86
player.setstage dlc1vq07 87
player.setstage dlc1vq07 90
player.setstage dlc1vq07 91
player.setstage dlc1vq07 92
player.setstage dlc1vq07 95
player.setstage dlc1vq07 96
player.setstage dlc1vq07 97
当然有人更加省事:player.setstage dlc1vq07 200,全部完成。任务是完成了,弓没拿到,到时瑟拉娜会问你要那把弓的,那真是一顿尴尬。也许可以在官网或者emc找到奥利尔的弓代码,用player.additem 0x00080 1获得。
(对于这个游戏的脚本语言和三维引擎不怎么感冒,游戏引擎用的是古董Creation Engine,语言是这么的小众--Papyrus)
2、mod使用问题
上古卷轴组织管理mod的软件有Nexus mod manager、Mod Organizer,这两款软件无所谓谁好、谁坏。从某种意义上说,两个软件只不过是为上古卷轴或者其他游戏搭建一个虚拟环境,似乎跟现在的Cloud软件如出一辙(vmare应该很多人都听过)。由于mod在制作过程中都会存在着依赖或者父子关系,因此就有了所谓的排序问题(或许做过软件架构的会更加理解这一点,硬件-操作系统-数据库-第三方程序-应用程序-接口)。相应的,Skrim优先级最高、update次之,Dawngard、HearthFire、Dragonborn并列,优先级都一样。如果是一些特殊的mod插件,比如高跟鞋、物理系统等优先级要高于那些服饰、人物mod的,或者炉火做的房子、地域扩展之类的,应该比HearthFire低,因为这个mod都作为其他mod的master前置了。
但是从另一个角度来说,只要内存里面有mod的指针地址,这些Mod的优先级无所谓谁高谁低,因为CPU都能在内存中拿到这些内存资源,怕就怕在你不知道这些Mod内部是不是有依赖关系,比如:几乎所有mod都会安插一个master的主文件,通常是Skrim、update,如果服饰、人物mod事先进入了CPU,CPU也就拿不到Skrim、update了。
以上放在单个MOD里面同样适用,优秀的mod制作者会把她制作mod的依赖文件全部放入到mod里面,比如骨骼、材质、贴图、动作等。相比来说,劣质的mod或者出于某种意图的mod(拿mod赚钱的那种),不是少这,就是少那,你进入游戏,如果内存寻址错误造成内存泄漏,直接闪屏退出。最开始遇到闪屏退出问题的时候,我也是郁闷,网上搜说是电脑配置太低的问题,我的电脑有8核,16G内存,显卡NVIDIA GeForce GTX 1080,不可能是电脑配置太低的问题,应该是内存溢出了。
闪屏退出解决方式
闪屏退出了也没关系,至少是可以恢复过来的。使用mod管理软件的好处在于装了个错误的Mod,不会对游戏本体造成任何损害,大不了删除错误Mod就是了,然后将原有的游戏配置文件在重新替换(Skyrim.ini、SkyrimPrefs.ini,如果用的是重制版,这两配置文件内部的数据还是不要改吧,发行方应该测试了很久的),因为有时候内存溢出的时候,游戏会在配置文件里增加内容,你看到的配置文件已经不是最初的配置文件了。还有,至少看一下你将要安装的mod,可以使用SSEEdit查看一下该mod的文件结构,比如form表单,传奇版编号是43,重制版是44,如果重制版用43表单的mod,不好说游戏一定会闪退,但是至少这个mod不正常,也或者是贴图文件、身形文件用的是32位软件制作的,你用重制版导入,也可能造成内存寻址错误。也有使用人物mod缺少动作文件支持的,进去游戏人居然不动了,用FNIS Behavior更新动作很有必要。
3、衣服、身形、声音等问题
就现在的三维模型而言,它们始终都绕不开形状、纹理、贴图这几项基本组成要素(就像三维引擎、物理引擎始终绕不开OpenGL一样,即便有众多的商业引擎,它们底层还是在调用OpenGL库)。随着研究的深入,后续又多了骨骼、材质、刚体、声音这几类要素。并不是说后面的要素是附属品,而是计算机在描述物体的时候变得更加全面了:骨骼配合动画,使得人物有了动作;材质配合光照使得物体的表面呈现出反射、散射的特征,刚体配合空间形状位置使得物理碰撞检测成为可能。我们也就看到了现在的游戏变得越来越立体、越来越智能。当然,还有透视投影、立体照相(物理相机)等等,也可以这样说,我们所体验的游戏只不过是一幅幅的图像而已,貌似扯远了。
言归正传,在上古卷轴里,一个完整有意义的三维模型是用mod组织的,它也必然包含上述要素,也正是由于三维模型要素文件格式的参差不齐,才使得mod在使用的时候出现了各种问题。作为玩家呢,看到喜欢的mod也总想试着装在自己的游戏里运行,作为制作者呢,用心的制作人会把mod的配置条件一一清楚,每个细节都很到位,不用心的制作人呢,丢个模型上去,吸引眼球,然后玩家各种郁闷。
衣服、身形、声音解决方式
其实问题2已经触及到了mod从传奇版转换重制版遇到的关键问题所在,当然这类问题也有着更广泛的普遍性。游戏的兼容性是一个迈不出去的坎,制作这些游戏要素的软件也不一定就兼容了。比如:esm\esp报表文件、pex脚本文件、nif矢量图像文件、dds图像文件、osd扩展文件、fuz音频文件等等,对应的制作软件或者程序有SEEdit、papyrus、NifSkope、ps、3Dmax、ck,这些软件都是在不断更新中(又比如:tiff图像格式文件,虽说是公开格式,通用性强,但是每个软件出来的tiff都有自己的IFD和一系列标记,兼容性却不强)。其中esp或者esm文件起到了组织身形、动作、纹理等文件的作用,也是mod的核心所在,如果游戏连它都识别不了,还玩个锤子mod,那就需要找到相应的软件如:SEEdit、ck,把它正确转化了;nif、dds同理也是需要正确转化的,如果nif文件中配置有身形或者刚体物理文件,简便的方法是直接把物理文件删除,麻烦一点需要将物理文件分割,身形则需要用你所在游戏的身形替换,再麻烦 一点,需要用三维软件转换骨骼 ,并重新对照骨骼,对配置文件(xml)写入新的配置参数。mod制作的好点呢,身形、动作、插件等文件需要一起拷贝到mod里面,并且配置正确的路径。好吧,还有特殊癖好的,喜欢特别的声音,可以用音频软件将视频文件中的音频拆解下来,然后分割音频,找到声音文件夹,直接将需要的声音文件配置进去(貌似还可以配置wav音频文件的),嗯,还有个高跟鞋,在百度上搜配置文件吧,然后配置到模型的声效列表里面。
总体来说,这款游戏程序设计实在糟糕,剧本倒是还不错,无道德绑架,当然了,自由度高也是一方面。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
自由度高的反面是参与的人多,所谓人多嘴杂,乱七八糟。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
(有时候在想,玩游戏什么时候能够直接和游戏人物对话,不用点鼠标、敲字啥的该多好)。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
附一:三维模型基本组成
三维模型:三维模型是物体的多边形表示,通常用计算机或者其它视频设备进行显示。三维模型基本构成部分有网格和纹理,网格通常由三角形、四边形或者其它的简单凸多边形组成。三维矢量模型是二维中点、线、面矢量模型在三维中的推广。它将三维空间中的实体抽象为三维空间中的点、线、面、体四种基本元素,然后以这四种基本几何元素的集合来构造更复杂的对象。其中游戏中的三维角色模型还包含有骨骼、蒙皮、纹理、声音等要素(骨骼与蒙皮也是三维模型)。
面模型(facial model) |
体模型(volumetric model) |
混合模型 (mixed model) |
|
规则体元 |
非规则体元 |
||
不规则三角网(TIN) |
结构实体几何(CSG) |
四面体格网(TEN) |
TIN-CSG混合 |
格网(Grid) |
体素(Voxel) |
金字塔(Pyramid) |
TIN-Octree混合或Hybrid模型 |
边界表示模型(B-Rep) |
八叉树(Octree) |
三棱柱(TP) |
Wire Frame-Block混合 |
线框(Wire Frame)或相连切片(Linked slices |
针体(Needle) |
地质细胞(Geocellular) |
Octree-TEN混合 |
断面序列(Series Sections) |
规则块体(Regular Block) |
非规则块体(Irregular Block) |
|
断面-三角网混合(Section-TIN mixed) |
|
实体(Solid) |
|
多层DEMs |
|
3D Voronoi图 |
|
|
|
广义三棱柱(GTP) |
|
骨骼:
骨骼由一系列具有层次关系的关节(骨骼)和关节链组成,是一种树结构,选择其中一个是根关节,其它关节是根关节的子孙,可以通过平移和旋转根关节移动并确定整个骨架在世界空间中的位置和方向。父关节运动能影响子关节运动,但子关节运动对父关节不产生影响,因此,平移或旋转父关节时,也会同时平移或旋转其所有子关节。
蒙皮:皮是指人物角色的外部三维模型,就好像真实人物去除骨架后的那层皮肉,在三维游戏或者三维动画中,为了让人物角色能够真实运动,将外皮模型绑定到骨骼上的技术叫做蒙皮。
骨骼权重:
在不同骨骼的交接处,蒙皮常常只有一块,为了使外皮模型能够与骨骼一起运动,将外皮模型的顶点赋予不同的权重以实现不同骨骼影响下的外皮模型拉伸或者收缩。
动画关键帧:
关键帧动画,就是给需要动画效果的属性,准备一组与时间相关的值,这些值都是在动画序列中比较关键的帧中提取出来的,而其他时间帧中的值,可以用这些关键值,采用特定的插值方法计算得到,从而达到比较流畅的动画效果。
纹理:
纹理通俗地来说就是贴图:在三维图形渲染中,贴图与渲染器组合成材质,用来告诉gpu如何进行绘制,决定了三维模型表面最终呈现出来的颜色。贴图包括法线、颜色、高度、高光等多种贴图。
Diffuse Map(漫反射贴图,也称为颜色贴图;Base Color;Albedo Map -- 反照率贴图):用于表现物体被光照射到而显出的颜色和强度。
Bump Map(凹凸贴图):给模型增加立体感。它并不能改变模型的形状,而是通过影响模型表面的影子来达到凸凹效果的。游戏中有两种不同类型的凸凹贴图:法线贴图(normalmap)和高度贴图(highmap)。
Normal Map(法线贴图):定义了一个表面的倾斜度或者法线。换一种说法,他们改变了我们所看到的表面的倾斜度。
Height Map(高度贴图):一种黑白的图像,它通过像素来定义模型表面的高度。像素越白的地方越高,越黑的地方越低,灰色的在中间,从而表现不同的地形。
Specular Map(镜面光贴图,也称高光贴图)或Reflective Map或Gloss Map(光泽贴图):一种黑白的图像,像素越白的地方镜面反射越强,越黑的地方镜面反射越弱,用来表现模型表面反光程度(塑料>木头>皮肤>布料),从而区分不同材质。
Mask Map(Opacity Map,Opacity Mask Map,不透明贴图,遮罩贴图)。
Emission Map(Emissive Map,Self-Illumination Map [自发光贴图])
仅仅是提高贴图本身的亮度,不受场景光源和摄像机位置影响,也不会照亮其他物体
Glow Map(辉光贴图):模拟闪耀的效果,它不会照亮环境,不受场景光源和摄像机位置影响。
Light Map(光照贴图)
把物体光照信息预先烘焙保存到光照贴图中, 实时绘制时不再进行光照计算, 而是采用该贴图来表示明暗效果
Shadow Map(阴影贴图):可预先烘焙或实时计算。
Ambient Occlusion(AO贴图,环境阻塞贴图,Occlusion贴图,也简称为OCC或白模):使用一张灰白图来表示物体之间相互影响的效果,可以理解为明暗素描那样的一种表现形式,
主要用于改善阴影,贴图中越黑的地方,阴影就会加得越深(若输入一张纯白的AO贴图,相当于关掉了AO效果),给场景(模型)更多的深度,有助于更好的表现模型的细节。
Ambient Map(环境照明贴图,也可称为背光贴图):这里的Ambient不同于AO贴图中的Ambient,它作为Diffuse的一部分,控制着物体背光的色彩变化,同时也对迎光面产生一些影响。
在现实中,物体的背光面仍会受到环境中各种光线反弹的照亮,也不会是纯黑的。环境照明贴图常用在场景灯光不足的情况,用于提高物体暗面的亮度。
Environment Map(环境贴图),也称为反射贴图(Reflection Map):用一张贴图映射到反射对象上,使得在反射对象上看到场景的影像;这张图可以是一张做好的假的环境贴图,也可以实时生成(把反射对象当作一个虚拟眼睛,实时将场景生成一张虚拟的贴图)。按照映射的方式又分为:球面环境映射贴图(标准环境映射贴图,Sphere Map)、立方体环境映射贴图(Cube Map)、双抛物面环境映射贴图(Parabola Map)
Glossiness Map(光泽度贴图):PBR材质中用到的贴图,为一张黑白图,用于控制模型微表面粗糙程度。图中像素越白的地方,微表面越光滑,单个像素的反射光线的方向范围就越集中,高光点就越小越亮,将周围环境映射到模型表面就显得越清晰
Roughness Map(粗糙度贴图)与Glossiness Map相反
Metallic Map(金属度贴图):PBR材质中用到的贴图,为一张二值黑白图,很少有金属与非金属之间的过渡物质。
纹理UV坐标
纹理UV坐标含义就是一张纹理贴图的坐标,选择一张图片,比如以图片左下角为坐标原点,右上角为坐标(1.0,1.0),图片上所有位置纵横坐标都介于0.0~1.0之间。
纹理映射
纹理UV坐标和顶点位置坐标是一一对应关系,这也就是为什么一张图片可以映射到一个模型的表面,只要把图片的每个纹理坐标和模型的顶点位置建立一对一的关系,就可以实现图像到模型的映射。
渲染烘培
渲染烘培就是绘制画面的意思,计算机把存储的游戏数据(山川、人物、河流、房屋等等)通过处理在计算机屏幕上用一张图像画出来,这个处理过程经历了几何造型、坐标变换、区域填充、裁剪、消隐、光影模拟、片元着色、屏幕投射等一系列过程。
附二:三维模型数据格式
三维模型的软件比较多,有多种多样的数据格式
obj是Wavefront公司为它的一套基于工作站的3D建模和动画软件"AdvancedVisualizer"开发的一种文件格式。
OBJ文件是一种标准的3D模型文件格式,很适合用于3D软件模型之间的互导。OBJ文件是一种文本文件格式,这就意味着你可以直接用写字板打开进行查看修改。目前几乎所有知名的3D软件都支持OBJ文件的读写,不过很多软件需要通过插件才能做到这一点。另外,作为一种优秀的文件格式,很多游戏引擎也都支持OBJ文件。OBJ3.0格式支持多边形(Polygon),直线(Lines),表面(Surfaces),和自由形态曲线(Free-form Curves)。直线和多角形通过它们的点来描述,曲线和表面则根据于它们的控制点和依附于曲线类型的额外信息来定义。这些信息支持规则和不规则的曲线,包括那些基于贝塞尔 (Bezier)曲线,B样条(B-spline),基数(Cardinal/Catmull-Rom样条),和泰勒方程(Taylor equations)的曲线。
FBX 是 FilmBoX 这套软件所使用的格式,后改称 Motionbuilder。因为Motionbuilder扮演的是动作制作的平台,所以在前端的modeling和后端的rendering也都有赖于其它软件的配合,所以Motionbuilder在档案的转换上自然下了一番功夫。FBX最大的用途是用在诸如在 Max、Maya、Softimage 等软件间进行模型、材质、动作和摄影机信息的互导,这样就可以发挥 Max 和 Maya 等软件的优势。可以说,FBX 方案是非常好的互导方案。
BVH 是BioVision等设备对人体运动进行捕获后产生文件格式的文件扩展名。BVH文件包含角色的骨骼和肢体关节旋转数据。BVH 是一种通用的人体特征动画文件格式,,广泛地被当今流行的各种动画制作软件支持。通常可从记录人类行为运动的运动捕获硬件获得。
DAE 是纯文本的模型格式,其本质就是一个单纯的xml文件。相比fbx,对dae格式模型的载入我们拥有非常高的自由控制,这也是最复杂的地方。基本上,dae文件内一开始就把数据分成了好几大块。对我们来说最为有用的是VisualScenes(包含场景骨骼节点树)、Nodes(与VisualScenes类似,两者或互为补充)、Geometries(网格数据)、Materials/Effects/Images(材质相关信息)、Controllers(骨骼信息数据)、Animations(动画数据)、AnimationClips(全局的动画信息),其中静态模型一般也就包括VisualScenes和Geometries。
全称是Stereolithographic,是3DSystem公司提出的3D模型文件格式,它采用三角形离散地近似表示三维模型,目前已被工业界认为是快速成形领域的标准描述文件格式。STL文件的最大特点也是其主要问题是,它是由一系列的三角形无序排列组合在一起的,没有反映三角形之间的拓扑关系。
3ds是Autodesk 3dsMax使用的一种3D模型文件格式,现在主要用于存储mesh模型。
PLY 是一种电脑档案格式,全名为多边形档案(Polygon File Format)或 斯坦福三角形档案(Stanford Triangle Format)。 该格式主要用以储存立体扫描结果的三维数值,透过多边形片面的集合描述三维物体,与其他格式相较之下这是较为简单的方法。它可以储存的资讯包含颜色、透明度、表面法向量、材质座标与资料可信度,并能对多边形的正反两面设定不同的属性。在档案内容的储存上PLY有两种版本,分别是纯文字(ASCII)版本与二元码(binary)版本,其差异在储存时是否以ASCII编码表示元素信息。
特效工作室: ILM、Sony Pictures与Imageworks, 共同开发了一个开放源码系统,目标是解决特效界共同的问题, 如何可以共享复杂的动态场景, 跨越不同的软体之间, 这个格式命名为Alembic ,英文直译为蒸馏机。本质上就是一个CG交换格式, 专注于有效地储存, 共享动画与特效场景, 跨越不同的应用程式或是软体, 包含了商业贩售的软体或是公司内部开发的软体, 客制化的工具组。
glTF是一种可以减少3D格式中与渲染无关的冗余数据并且在更加适合OpenGL簇加载的一种3D文件格式。glTF的提出是源自于3D工业和媒体发展的过程中,对3D格式统一化的急迫需求。如果用一句话来描述:glTF 就是三维文件的 JPEG ,三维格式的 MP3。在没有glTF的时候,大家都要花很长的的时间来处理模型的载入。很多的游戏引擎或者工控渲染引擎,都使用的是插件的方式来载入各种格式的模型。可是,各种格式的模型都包含了很多无关的信息。就glTF格式而言,虽然以前有很多3D格式,但是各种3D模型渲染程序都要处理很多种的格式。对于那些对载入格式不是那么重要的软件,可以显著减少代码量,所以也有人说,最大的受益者是那些对程序大小敏感的3D Web渲染引擎,只需要很少的代码就可以顺利地载入各种模型了。此外,glTF是对近二十年来各种3D格式的总结,使用最优的数据结构,来保证最大的兼容性以及可伸缩性。这就好比是本世纪初xml的提出。glTF使用json格式进行描述,也可以编译成二进制的内容:bglTF。glTF可以包括场景、摄像机、动画等,也可以包括网格、材质、纹理,甚至包括了渲染技术(technique)、着色器以及着色器程序。同时由于json格式的特点,它支持预留一般以及特定供应商的扩展。
Psk 是 Epic Games Unreal Engine 的格式,也就是大名鼎鼎的虚幻游戏引擎的模型格式。虚幻游戏模型提取出来的就是 psk 格式。
X3D 是一种专为万维网而设计的三维图像标记语言。全称可扩展三维(语言),是由Web3D联盟设计的,是 VRML 标准的最新的升级版本。 X3D 基于 XML 格式开发,所以可以直接使用 XML DOM 文档树、XML Schema 校验等技术和相关的 XML 编辑工具。目前 X3D 已经是通过 ISO 认证的国际标准。
DXF 是一种开放的矢量数据格式,可以分为两类:ASCII格式和二进制格式;ASCII具有可读性好的特点,但占用的空间较大;二进制格式则占用的空间小、读取速度快。各种 CAD 软件中 DXF 被广泛使用,成为事实上的标准。绝大多数CAD系统都能读入或输出DXF文件。
附件三:相机
光源
在实际开发过程中,多数三维场景往往需要设置光源对象,通过不同的光源对象模型生活中的光照效果。
物理引擎
物理引擎是一种用于模拟真实物理现象的中间件,可以用来创建虚拟的物理环境,并在其中运行来自物理世界的规则。
Havok引擎的授权则比较昂贵和严格,光环4、上古卷轴5等游戏大作使用的都是这款引擎。PhysX虽然现在不开源,但也实行免费推广政策,是Unity3D、CryEngine等游戏引擎的首选。Bullet物理引擎是一款开源、免费的物理引擎,jMonkeyEngine3 选择了与Bullet引擎集成。
如同3D图形引擎是建立在计算机图形学和光学建模的理论基础之上,现代物理引擎也有其理论根基,最主要的就是物理学的分支——理论力学。
理论力学(theoretical mechanics)是研究物体机械运动的基本规律的学科,是力学的一个分支。它是大部分工程技术科学的基础,也称经典力学。其理论基础是牛顿运动定律。20世纪初建立起来的量子力学和相对论,表明牛顿力学所表述的是相对论力学在物体速度远小于光速时的极限情况,也是量子力学在量子数为无限大时的极限情况。对于速度远小于光速的宏观物体的运动,包括超音速喷气飞机及宇宙飞行器的运动,都可以用经典力学进行分析 。
理论力学通常分为三个部分:静力学、运动学与动力学。静力学研究作用于物体上的力系的简化理论及力系平衡条件;运动学只从几何角度研究物体机械运动特性而不涉及物体的受力;动力学则研究物体机械运动与受力的关系。动力学是理论力学的核心内容。理论力学的研究方法是从一些由经验或实验归纳出的反映客观规律的基本公理或定律出发,经过数学演绎得出物体机械运动在一般情况下的规律及具体问题中的特征。理论力学中的物体主要指质点、刚体及刚体系,当物体的变形不能忽略时,则成为变形体力学(如材料力学、弹性力学等)的讨论对象。静力学与动力学是工程力学的主要部分。
质点和刚体的运动是游戏物理引擎中运用最多的技术,因为刚体在发生碰撞时可以忽略物体的形态变化。对于需要实时运算的游戏来说,这意味着只需要针对质点的运动进行模拟,可以极大得简化模拟过程。比刚体更为复杂的是软体,例如布娃娃、弹球、布料等物体,在发生碰撞后会导致模型变形。在游戏中,这种变形通常意味着需要实时计算成千上万个顶点的位置。
碰撞检测,这个词通常有两种含义,一种是物理意义上的碰撞检测,另一种是数学意义上的碰撞检测。数学碰撞检测比物理碰撞检测的速度要快,而且消耗的内存也更少,因为压根就不用考虑质量、能量、动量、速度、加速度等物理因素。类似于鼠标拾取、视线范围等功能,使用射线与物体进行相交检测就可以轻易实现。有经验的游戏开发者会尽量使用数学方法来模拟物理引擎的功能,以此来优化游戏的性能。
对大量物体进行碰撞检测是个十分耗时的工作,因此,优化工作从最初就开始了。常用的优化方法有两种:其一是使用简单形状的碰撞体来代替复杂形状的物体,例如包围体、射线、平面等;其二是利用数据结构来减少实际参与检测的物体数量,例如九宫格、四叉树(2D)、八叉树(3D)等等。
物理引擎中对象封装
在诸多物理引擎中,“世界(World)”是各种物理规则的载体,比如“重力(Gravity)”。与游戏引擎中的场景图类似,“世界”也需要管理场景中的物体。如果你希望模拟物理现象,那么你就得先创造一个世界,再把各种形状的物体添加到这个世界中,然后开动世界的马达,让物体在世界中运动、碰撞、相互作用。
常我们只需要一个“世界”,但你也可以创造不同的世界。在多个世界中定义不同的物理规则,以此来模拟不同的物理现象,如地表、水下、太空等。除了物理规则以外,“世界”最常见的属性是“边界(Bound)”。这个属性的存在主要是考虑了程序的性能问题,用于剔除超出世界边缘的物体。毕竟我们的游戏画面就那么大,对那些超出玩家感知的物体进行运算可能没有太大的必要。
多世界同样也是一种分组手段。有时同一个场景中的物体,并不一定要在一个世界中进行碰撞检测。例如赛车游戏,车辆和赛道需要进行碰撞检测,但是观众和其他自然景观应该在另一个组中。不过大多数物理引擎会直接定义用于“分组(Group)”的对象,这样就没有必要为另一个世界分配内存资源了。
为了保证模拟的真实性,物理引擎一般会使用连续碰撞检测(CCD continuous collisiondetection),并且限制每两次碰撞检测之间的最小时间步长(timeStep)。假如运动的步长是0.1秒,当deltaTime为10秒时,物理世界的主循环可能要执行100次完整的碰撞检测。
因此,虽然物理引擎大多使用基于时间的主循环,但考虑到执行效率,通常也会配合线程或定时器来按固定帧率执行。一般物理引擎建议的执行速率是每秒60次计算,但是30帧、16帧甚至10帧的频率也是可以接受的。
特效
滤镜
在游戏场景渲染完成后,我们可以使用滤镜(Filter)对画面进一步加工。在3D游戏中,下列效果通常都是用滤镜来实现的:
着色器
3D场景渲染完毕后,GPU将会把画面数据返回给CPU,并保存为FrameBuffer对象。滤镜处理器在工作的时,会把FrameBuffer中的数据渲染到一个内存中的纹理(Texture)上,然后把这个纹理交给Filter去进行后期处理。
基本上每个滤镜都有对应的Shader程序,在程序中加载为一个Material对象。处理器顺序调用每一个滤镜的Material,对内存中的纹理进行渲染,最后再把画面数据写回到FrameBuffer中。
粒子
当你在游戏中看到下列内容之一时,可能是使用粒子系统实现的。
这类场景元素很难通过建模来实现,想要制作模型动画几乎是不可能的。在3D游戏中,我们使用粒子系统来模拟其它传统的渲染技术难以实现的抽象视觉效果。
粒子系统是由总体具有相同的表现规律,个体却随机表现出不同的特征的大量显示元素构成的集合。
这个定义有几个要素:
粒子系统既可以是动态的(火花、雨滴),也可以是静态的(草坪、毛发)。有些看似完全不同的东西,却可以使用相同的模式来实现。
一般来说,粒子系统是由3大部分组成的:
1、粒子发射器
粒子数量
生成速率
生成区域
持续时间
循环模式
2、粒子外观
形状(点状、片状、3D网格)
颜色
材质
大小
3、粒子行为
粒子发射器定义了粒子系统的群体性,包括粒子的数量、生成区域、生命周期等。
粒子外观和粒子行为共同定义了粒子系统的统一性,系统中的每个元素都应该遵循这些规则。
粒子系统的随机性则是通过下列方式实现的:
程序控制、
主循环是一款游戏或者框架的核心以及基础,它会让游戏以及动画看起来是在做实时的运行。几乎所有游戏(除了回合制等几种类型以外)都要基于主循环以及精确的时间控制。
游戏生命周期