模式7是一个非常简单的效果。它将2D x / y纹理(或图块)投影到某些地板/天花板。旧的SNES使用硬件来执行此操作,但是现代计算机功能如此强大,您可以实时执行此操作(并且无需提及ASM)。
将3D点(x,y,z)投影到2D点(x,y)的基本3D数学公式为:
x' = x / z;
y' = y / z;
当您考虑它时,这是有道理的。距离较远的物体小于附近的物体。想想铁轨无处可去:
如果我们回看公式输入值x
,y
它将是我们正在处理的当前像素,并且z
将是有关该点有多远的距离信息。要了解z
应该是什么,请查看该图片,其中显示z
了上面图片的值:
紫色=近距离,红色=远处
因此,在此示例中,z
值是 y - horizon
(假设(x:0, y:0)
位于屏幕的中心)
如果我们将所有内容放在一起,它将变成:(伪代码)
for (y = -yres/2 ; y < yres/2 ; y++)
for (x = -xres/2 ; x < xres/2 ; x++)
{
horizon = 20; //adjust if needed
fov = 200;
px = x;
py = fov;
pz = y + horizon;
//projection
sx = px / pz;
sy = py / pz;
scaling = 100; //adjust if needed, depends of texture size
color = get2DTexture(sx * scaling, sy * scaling);
//put (color) at (x, y) on screen
...
}
最后一件事:如果您想制作马里奥赛车游戏,我想您也想旋转地图。嗯,这也非常容易:旋转sx
并sy
在获得纹理值之前。这是公式:
x' = x * cos(angle) - y * sin(angle);
y' = x * sin(angle) + y * cos(angle);
如果您想通过地图移动,只需在获取纹理值之前添加一些偏移量即可:
get2DTexture(sx * scaling + xOffset, sy * scaling + yOffset);
注意:我测试了算法(几乎复制粘贴),并且可以正常工作。这是示例:http : //glslsandbox.com/e#26532.3(需要启用最新浏览器和WebGL)
注意2:我使用简单数学,因为您说过您想要简单的东西(而且似乎对向量数学不熟悉)。您可以使用维基百科的公式或教程获得相同的效果。他们的操作方式要复杂得多,但您可以配置效果的可能性更大(最终效果相同...)。
有关更多信息,我建议您阅读:http : //en.wikipedia.org/wiki/3D_projection#Perspective_projection