C 伪三维墙(自顶向下的光线投射,类似于)

C 伪三维墙(自顶向下的光线投射,类似于),c,2d,parallax,allegro,C,2d,Parallax,Allegro,看,我不会发布代码,因为我需要逻辑、数学和算法。嗯: 我正在尝试使用图层和视差滚动实现一个自上而下的平铺贴图的3d视觉效果。问题是:目前我只是为每一层设置不同的“速度”。但这只适用于某些非常特定的摄影机位置,而且,它使块具有几乎无限的高度(因为它们将“增加高度”,直到超出摄影机的FOV) 是否有更好(应该)的方法来达到效果?哦,我用了C和快板5 我曾考虑过限制每一层的偏移量,但我不知道如何限制 我当前的方法: 这是我当前图层“速度”的代码(它重复上、下、左、右,改变坐标): 然后,我运行一个循环

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

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

是否有更好(应该)的方法来达到效果?哦,我用了C快板5

我曾考虑过限制每一层的偏移量,但我不知道如何限制

我当前的方法:

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

然后,我运行一个循环,以绘制与当前层偏移相关的贴图

顺便说一句,这就是所需的效果(例如有3层):


我认为你说得对,但是“无限高”问题可以通过简单地给相机一个“高度”属性来解决,并通过计算来调整每一层的“速度”

图层速度=(图层高度/相机高度)*缩放系数//给出一个浮点值


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

我认为你说得对,但是“无限高”问题可以通过简单地给相机一个“高度”属性来解决,并通过计算来调整每一层的“速度”

图层速度=(图层高度/相机高度)*缩放系数//给出一个浮点值


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

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

可以使用堆叠在彼此顶部的未缩放平铺,以平铺中心到视口中心距离的固定分数进行偏移

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

如果墙是长方体,并且有顶部和四面的图像,则可以用几乎3D的方式绘制它们

每个箱壁最多画两个侧面,倾斜

在所有情况下:

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

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

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


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

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

可以使用堆叠在彼此顶部的未缩放平铺,以平铺中心到视口中心距离的固定分数进行偏移

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

如果墙是长方体,并且有顶部和四面的图像,则可以用几乎3D的方式绘制它们

每个箱壁最多画两个侧面,倾斜

在所有情况下:

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

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

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


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

玩家位于摄影机的中心,因此摄影机仅在移动时移动。“速度”是指我有3个层,它们在X/Y坐标上以不同的值增减(层0增加1,层1增加2,层2增加3)。我不太明白如何在我的方法中应用它。只是添加了它,Wossname!玩家位于摄影机的中心,因此摄影机仅在他移动时移动。“速度”是指我有3个层,它们在X/Y坐标上以不同的值增减(层0增加1,层1增加2,层2增加3)。我不太明白如何在我的方法中应用它。只是添加了它,Wossname!每个层都应该按照相对滚动速度进行缩放。或者,可以相对于视口原点在背景平铺的顶部绘制1:1大小的覆盖平铺。为了获得最佳效果,请使用立方体“长方体”构建墙,其中一个平顶,四个侧边瓷砖,其中两个将根据墙“长方体”相对于视口中心的位置倾斜绘制。我在任何地方都找不到与此技术相关的任何内容。我知道我可以让它更平滑,工作正常,我只是不知道从哪里开始。每一层都应该根据相对滚动速度进行缩放。或者,可以相对于视口原点在背景平铺的顶部绘制1:1大小的覆盖平铺。为了获得最佳效果,请使用立方体“长方体”构建墙,其中一个平顶,四个侧边瓷砖,其中两个将根据墙“长方体”相对于视口中心的位置倾斜绘制。我在任何地方都找不到与此技术相关的任何内容。我知道我可以让它更平滑,工作正常,我只是不知道从哪里开始。效果很好,只是现在这些块彼此非常接近@威廉费尔南德斯:改变₀, 或缩放源坐标。请注意,x、y、z的单位与视口坐标(像素)相同。这非常有效,只是现在块彼此非常接近@威廉费尔南德斯:改变₀, 或缩放源坐标。请注意,x、y、z的单位与视口坐标(像素)相同。
if (key[ALLEGRO_KEY_UP])
    camera_y[0] -= 1;
    camera_y[1] -= 2;
    camera_y[2] -= 3;