网格的绘制
2dfm吧
全部回复
仅看楼主
level 12
厉风 楼主
看上图,我们假定观察者(比如我们)和游戏中的角色(和我们差不多高的真人)同样站立在地面上,大方框的十字中心(粉色)恰好是我们眼睛的位置。
格斗角色头顶和脚底分别与我们眼睛连线,可以看作格斗角色头顶和脚底分别射入我们眼睛里的光线。
眼睛接受来自其格斗角色的光,使我们脑中形成格斗角色的影像,因此,这个影像应该处于两条光路路径所限制的范围中。
这个影像应该是投影在一个投影屏幕上的,而我们看到的格斗游戏画面应该就是这个屏幕上的画面。
因此,格斗角色的影像在光路限制范围内的那个位置(本文中所有“位置”都指的是中轴线的位置)就应该是投影屏幕相对我们观察者的位置。
我们现在只需要格斗角色实际距离我们多远,以及格斗角色的影像相当于多大,就可以得到这个投影屏幕的实际位置了。
已知格斗角色所在位置如图所示,距离我们观察者有12个长度单位远。
为了获得格斗角色的影像相当于实物的多大,我们假想这个大方框就是游戏画面相当于实物的比例。
如果大方框恰好是640x480的游戏画面大小,那么我们就要把8个单位长度看作是相当于游戏中的320像素(相当于每个单位40像素)。
我们都知道游戏中角色站立的位置距离游戏画面下边缘刚好40像素(相当于我们一个单位长度)。
所以,距离地面一个单位高的位置应该就是“格斗角色实际站立的地面位置投影到投影屏幕中的高度”。
由于游戏中的角色在画面上的高度大约为200像素,也就相当于图中“格斗角色的影像”的大小,这样我们就得到了格斗角色的影像相当于实物的多高了。
把这个高度的格斗角色影像放进光路限制范围,保持着让这个影像的头顶顶点被格斗角色头顶发出的光线穿过的条件来移动影像,使得这个影像的脚底顶点刚好被格斗角色脚底发出的光线穿过时,我们就确定了这个影像的合适位置,也就是投影屏幕的位置(距离观察者大约10个长度单位远)。
我们之所以要找到这个屏幕的位置,就是要利用它来绘制画面中的3d投影网格,因为这些网格的分布完全由这个投影屏幕决定。

2011年01月20日 07点01分 1
level 12
厉风 楼主
我们考虑图中大方框的十字中心是我们眼睛的位置,眼睛到地面基本相当于我们观察者站立的身高,我们站立的地面位置距离投影屏幕的距离在前面已经求出,是10个单位长度。那么,投影屏幕位置右侧地面上任何一个长度刻度点发出的光,射入我们眼睛之前,会先穿过投影屏幕的位置,并产生一个交点,这个交点的高度就是“地面上的刻度在投影屏幕上的投影位置”的高度。
所以我们只要从这些点出发平行地面作横线,就是那些地面坐标刻度在游戏画面上的横线影像。
例如投影屏幕所在地面位置,在游戏中就应该是从下向上数第三条线,恰好就是游戏中角色站立的那个高度为40像素的横线处(为了突出显示,我们把那条粉色横线修改为草褐色横线)。
由于投影屏幕下边缘上排列的刻度都是保持真实长度的(不会因为三维投影而缩短),所以,我们可以在模拟投影屏幕正面效果的大方框下边缘上直接排布这些刻度。
而观察者观察到的无穷远点在投影屏幕上的投影高度应该等于观测者眼睛的高度,那么,我们就可以把这个大矩形框的中心点作为无穷远点在投影屏幕上的投影。
我们假定从屏幕底部的每一个刻度点出发,都垂直屏幕向无穷远处发出一条射线,这些直射线因为都垂直投影屏幕,所以它们相互平行延伸至无穷远,它们的投影一定分别从各个刻度点出发,汇聚到无穷远点在屏幕上的投影点处。
所以,大方框中心点到大方框底边的各个刻度点的连线就形成了地面上的一条条“跑道”。
这些跑道和致歉我们得到的那些粉色横线相交,就得到了地面坐标网格在屏幕上的投影图象。
我们直观上就可以验证这样得到的地面坐标网格是符合我们的日常观察经验的。
我们前面绘制地板素材
https://tieba.baidu.com/f?kz=980787237
时候用的那个网格图就是这么来的。
2011年01月20日 07点01分 2
level 12
厉风 楼主
绘制场景立墙的网格也是类似的。投影屏幕距离人眼的距离不会因为屏幕转动而改变,所以依旧是10个单位。
为了绘制方便,我们把前面的图转过90度。这样,立墙就看起来类似前面的地面了。
我们需要注意的是,此时我们要绘制的立墙“地面”并不是恰好和游戏画面(大方框)下边缘在同一高度的,而是更靠下两个单位高度。
所以,立墙真实位置才是此时投影屏幕的真正下边缘,它明显是在画面外的(画面外下方)。
所以,我们应该以此高度为当前真正的“地面”,绘制网格。
绘制方法和前面相同,先把投影屏幕右侧的“地面”刻度分别作投影点,根据这些投影点得到粉色的一系列横线。
然后作“地面”上每个刻度到大方框中心(无穷远点投影点)的连线,与前面得到的粉色横线相交。

2011年01月20日 07点01分 3
level 12
厉风 楼主
然后把得到的网格转回90度,得到立墙的坐标网格。
实际上立墙的绘制比这要简单得多。我们之所以介绍这个方法,就是为了介绍一下特殊高度的“平面”的网格应该如何绘制。
你首先要记住投影平面到眼睛的距离是不变的,怎么转都一样。
其次是你要清楚,你想绘制哪个平面的网格,就要把那个平面当作真正的“地面”来设置上面的长度刻度。
一堵画面外的立墙是这样绘制的,画面内的立墙也是类似的,只不过你要把画面内的那个墙面看作“地面”来布置标准长度刻度。
同样,高于游戏地面的平台,例如棚顶,其网格绘制也是类似的,只不过你应该把它看作“地面”。
实际上,如果你的游戏的两侧立墙左右对称,棚顶和地板上下对称,那么只要把网格复制并翻转粘贴到另一侧即可。
2011年01月20日 08点01分 4
level 12
厉风 楼主
下面介绍立墙的简单画法。
如图,我们把前面得到的地板和立墙的网格粘贴在一张图中,可见立墙所在的地板斜线与一系列地板横线相交的交点向上引纵线就能立即得到立墙网格的一系列平行线。
而我们只要把立墙最外边缘纵线看作标准线,设置标准刻度,对每个刻度点向画面中心点连线就可以生成立墙的网格。
这个办法其实是和前面的方法等效的。其中的数学原因我们就不细说了,有兴趣的朋友可以去买一本画法几何学看看。

2011年01月20日 08点01分 5
level 12
厉风 楼主
因此,我们同样可以知道,如果我们有了立墙的网格,那么想要生成任意高度的平行地面的平台的网格都是很容易的:
例如我们绘制上图中上方的那个平面的网格,只要找到立墙上对应的粉色斜线,从斜线与立墙系列纵线的交点向左引一系列横线,然后把这个平面最外边的那条横线看作标准线设置标准刻度,从每个刻度点向画面中心点连线与系列横线相交,就生成了这个平面的网格。
这是我们最常用的网格图。虽然它是320x240分辨率的,但是我们通常将其横纵分别放大四倍使用。
2011年01月20日 08点01分 6
1