3d 引擎中对场景数据的接口设计
目前是我第一次设计 3d engine ,虽然主要贡献 3d 方面代码的同事不是第一次做了。我们做了两年多,大方向上是我在把握设计。但是毕竟是没有什么经验,也就老在修改。
这个周末再审以前做的东西,觉得接口上还需要调整一下。比如精灵的控制接口、摄象机的控制接口、场景描述的接口等等。以一个游戏开发人员的角度来看,我需要接口是什么样子的?
我希望是最方便的描述虚拟世界中各样东西的相互关系,引擎当隐藏住不必要的细节,比如 3d 方面的数学知识,专业化的术语,复杂的坐标转换等等。今天写下这些,不是定论,而是做些思考的记录。
我想知道,对于 3d 引擎的使用人员,如何描述虚拟场景,暴露出怎样的接口是比较合适的。
对于我们的游戏,和大多数游戏,角色在场景中的坐标是二维而不是三维的。就好象描述你在地球上的位置,大体上经纬度就够了,只有在需要更在很复杂的场景中(比如一栋高楼中),再加上一个离地面的高度。
这里,我们取的都是离地面的高度,而不是相对地心的。所以你站在南极比站在赤道上离地面更近,或是站在拉萨的街道上比站在上海的商场里离地心更远,都是不需要考虑的事情。
高度这个维度,远不需要经纬度的精度高。在一些需要得到高度信息的位置,比如我们在高层建筑里,只需要说自己在第几层。而在小河边,则只需要了解在桥上还是桥下。因为大多数情况下, 人必须脚踏实地。
最终,我需要 3d engine 加载完场景数据后,使用它时,只需要设置经纬度,就可以把一个物件放置在那里了。默认情况下,物体总是紧贴地面的。如果需要让物体悬浮在空中,我们只需要外加一个高度属性,这个属性的值描述了物体相当当前经纬坐标上的地表的高度值。
当同一个经纬坐标上,有多层地表怎么办?解决方法是分层表示。地面可分成多个层面。举个例子,有一条河,两岸之间架了一座桥。这样一个场景当被分成三个层面。
两岸及河床是第一层,水面是第二层,桥面是第三层。
当河水干涸的时候,水面一层消失,退化成两层。(通常在建模的时,岸边和河床就是一体的,水是额外做上去的)
人从岸边上桥,就从一个层跨越到了更高的层,这个跨越线,可以额外标注出来。
同样,从岸边下水,也是一个跨层的过程,同时触发游泳的事件。从水面下潜,也有类似的过程。
根据逻辑需要,引擎还应该提供层与层之间的高度换算。比如桥面的高度相当于从水面计算的高度值。
那么空中的物体如何计算?方法是,提供一个零层,这个层面一定是在欧式几何空间中保持水平的。(当然如果想做一个球面的游戏,这个层面也可以是球形的)浮在空中的物体可以依据这个来换算坐标。
我们还需要引擎提供同一层面上每个经纬坐标点上的法向量值,或是两个不同点之间相对零层面的高度差(这个值可以通过上面的方法换算得到)。这个用途之一是为了处理四足动物的摆放。
不是每个层面的任意坐标点上都有有效的法向量的,比如一座桥,桥面以外的空间在它那个层面上都是无效的。如果命令物体移动到无效的位置上,我们可以知道该物体会发生坠落,掉到下个层面上。或是简单的阻止这样干。所以这个信息还可以用于描述阻挡物。
大多数情况下,我们并不需要精确的描述物体的坐标。正如我们在现实生活中,除非手持 GPS 设备,否则很少用经纬度来汇报自己的方位。我们只需要知道什么在什么的附近就够了。所以确定位置通常是编辑器做的事情,而游戏逻辑只用知道物体在哪个地点。
坐标值通常只用在描述和计算物体运动的过程里面。存在于比较低阶层次的接口上。
尽量脱离坐标值本身,我们也不必太在意坐标是二维量,还是一个三维量;物体在空间中的状态,是用一个向量表示、还是一个矩阵,或是四元数等等。我们也就隐藏了引擎是 3d 还是 2d 或是所谓 2.5D 这些细节了。
最后的目标就是,用图象引擎提供的接口来描述物体和物体之间的关系,而不是单个物体在空间中的绝对位置。应该抽象出哪些接口供开发者使用,还需要再斟酌一下。
Comments
Posted by: Cloud | (12) June 8, 2008 01:42 AM
Posted by: Anonymous | (11) June 7, 2008 11:42 PM
Posted by: 天黑请闭眼 | (10) June 5, 2008 06:59 PM
Posted by: Anonymous | (9) June 2, 2008 02:24 PM
Posted by: 天堂的隔壁 | (8) June 1, 2008 08:24 PM
Posted by: joe wulf | (7) June 1, 2008 07:19 PM
Posted by: 亮亮真牛 | (6) June 1, 2008 04:24 PM
Posted by: 亮亮真牛 | (5) June 1, 2008 04:20 PM
Posted by: sjinny | (4) June 1, 2008 01:55 PM
Posted by: churunmin | (3) June 1, 2008 09:29 AM
Posted by: Cloud | (2) June 1, 2008 12:28 AM
Posted by: swordmaster | (1) May 31, 2008 11:38 PM