伪 3D 墙(自上而下的光线投射,有点)

Pseudo 3D walls (top-down raycasting, sort of)

看,我没有发布代码,因为我需要逻辑、数学和算法。恩:

我正在尝试使用图层和视差滚动为自上而下的图块地图实现 3d 视觉效果。问题是:目前我只是为每一层设置不同的“速度”。但这只适用于一些非常特定的相机位置,而且,它使得块几乎具有无限的高度(因为它们会“增加高度”直到它们超出相机的 FOV)。

有没有更好的(应该)实现的效果?哦,我正在使用 CAllegro 5

我想过限制每一层的偏移量,但我不知道如何。

我目前的方法:

这是我当前的图层“速度”代码(上下左右重复,改变坐标):

if (key[ALLEGRO_KEY_UP])
    camera_y[0] -= 1;
    camera_y[1] -= 2;
    camera_y[2] -= 3;

然后我 运行 一个循环来使用相对于当前图层偏移的图块绘制地图。

顺便说一下,这就是想要的效果(3 层的示例):

我认为你是对的,但是 "infinite height" 问题可以通过简单地给相机一个 "altitude" 属性 并调整 "speed" 来解决] 通过计算每一层 ...

layer.speed = (layer.altitude / camera.altitude) * ZOOM_FACTOR; //给出一个浮点值。

除非您向我们展示您的一些数学代码,否则无法提出更多建议。

对于视差滚动,滚动速度越快的图层必须相应越大:

您可以使用未缩放的图块堆叠在一起,偏移图块中心到视口中心的固定距离,

但顶部不会连续(除非底部重叠)。如果所有图层图块都是 hand-drawn 或渲染图像,则这不是问题。

如果墙壁是box-shaped,并且你有顶部和四个侧面的图像,你几乎可以用 3D 画出来,

每个盒子壁的最多两个边被绘制,倾斜。

在所有情况下:

如果视口的中心在世界坐标(xc, yc), 点(x, y, z ) 映射到相对于视口中心的坐标 (x', y'):

x' = (x - xc) × (z + z0) / z0

y' = (y - yc) × (z + z0) / z0

其中 z0 是决定视差或深度效果 "size" 的常数。