【问题标题】:Pseudo 3D walls (top-down raycasting, sort of)伪 3D 墙(自上而下的光线投射,有点)
【发布时间】:2016-01-12 11:05:20
【问题描述】:

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

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

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

我想过限制每一层的偏移量,但我不知道怎么做。

我目前的方法:

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

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

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

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

【问题讨论】:

  • 每一层都应按相对滚动速度进行缩放。或者,您可以在相对于视口原点的背景图块顶部绘制 1:1 大小的叠加图块。为获得最佳效果,请使用立方体“盒子”构建墙壁,其中一个平顶和四个侧面瓷砖,其中两个将根据墙壁“盒子”相对于视口中心的位置倾斜绘制。
  • 我在任何地方都找不到与此技术相关的任何内容。我知道我可以让它更顺畅,工作正常,我只是不知道从哪里开始。

标签: c 2d parallax allegro


【解决方案1】:

对于视差滚动,滚动较快的层必须相应较大:

您可以使用彼此堆叠的未缩放图块,偏移量为从图块中心到视口中心的距离的固定分数,

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

如果墙壁是盒形的,并且您有顶部和四个侧面的图像,您可以将它们绘制成几乎 3D,

每个盒子墙的最多两侧被绘制,倾斜。

在所有情况下:

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

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

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

其中 z0 是一个常数,用于确定视差或深度效果的“大小”。

【讨论】:

  • 效果很好,只是现在这些块彼此如此接近。 Screenshot
  • @WilliamFernandes:更改 z₀,或缩放源坐标。请注意,x,y,z 的单位与视口坐标(像素)相同。
【解决方案2】:

我认为你在正确的路线上,但“无限高度”问题可以通过简单地给相机一个“高度”属性来解决,并通过计算调整每一层的“速度”......

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

在您向我们展示您的一些数学代码之前,无法提出更多建议。

【讨论】:

  • 玩家在摄像机的中心,所以摄像机只有在他移动时才会移动。 “速度”是我有 3 层,它们在 X/Y 坐标上增加和减少不同的值(层 #0 增加 1,而层 #1 增加 2,层 #2 增加 3)。我不太明白如何将它应用到我的方法中。
  • 刚刚添加,Wossname!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-09
  • 2021-10-12
  • 1970-01-01
  • 2020-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多