两倍接近的物体出现两倍大?


16

因此,我正在考虑创建一个2D游戏,在其中您还可以通过更改所在层来沿Z轴移动。根据深度,我想缩放2D精灵。

有一次,有人给我演示了一个演示,其中有很多2d子画面,通过滚动可以更改摄像机的深度。因此,放大时,对象将更靠近播放器,并显得更大。然后我想知道,当物体靠近1个单位时,该物体应该多大。您将如何计算?所以那个家伙告诉我:我使用的一条基本规则是:“对象的接近度是它的两倍,而外观则是它的两倍”。

现在,通过我自己进行测试,我知道该规则不适用于现实世界;)但是,在现实世界的计算中是否存在一些用于视角或某些常数的常量?还是公式?

我知道这可能不是问这样问题的最佳地点,但是由于这是我唯一一个用于解决与游戏有关的问题的网站,而且我的情况是游戏,因此我想尝试一下。另外,我有点期待这个人知道3D透视图和矩阵等方面的所有知识,因为它可能与3D游戏有关;)

tl; dr:

“一个接近两倍的物体,出现两倍大的物体”在现实世界中并非如此。但是哪个常数或公式正确?


3
我不知道答案是什么,但我知道如何找到答案。拍摄一些东西的照片。也许是一张纸。从不同的已知距离获取它们,然后进行一些数学计算以计算一张纸吸收了多少图像,并据此确定比率。可能是一个有趣的实验!
SpartanDonut

我想知道为什么没人提到自然对数...
乍得·哈里森

4
为什么不是真的?我认为是真的。
伊万·库基尔

@hydroparadise自然对数与这个问题有什么关系?
内森·里德

我知道我只是在做书呆子,但是“两次接近”是一个奇怪的词组。难道不是“半途而废”吗?“两倍”较大,但是如果距离较近,则距离较小。
MrVimes

Answers:


19

通常,这是正确的,具体取决于您的视点,移动方向以及视角。

对象透视图示例

请注意,在第一个摄影机视图中,由于红色块垂直于摄影机视图,因此该对象似乎以理想的1:2比例大了一倍(请注意,箭头指向的对象在移动后会碰到视图的边缘接近两倍)

第二个是旋转45度的相同大小的块。旋转时,底边缘与相机的距离不再与顶边缘相同,因此SEEM无法正确缩放为1:2的比例,但实际上是其两倍(在较远的蓝色方块与附近的蓝色方块具有相同的角度)。

总而言之,这实际上意味着您的朋友是正确的,并且您的对象的1:1比率(“对象的接近度是两倍,外观看起来是两倍)”是一个不错的选择。



好答案!图片肯定使它更清晰。实际上,我现在真的很愚蠢,因为在发布问题之前,我试着这样做,方法是握住我的手,然后将其移近。然后我想:不,它的感觉不大两倍。...我应该更精确地测量它;)透视是一件有趣的事!另外,像我一样的Ifeel本应该可以自己提出照片的;)但是,很好的答案!谢谢!
贝里(Berry)

@Mason Wheeler-分类:P
Tom'Blue'Piddock

8

两倍接近的对象的确出现两倍大。它是Thales定理的结果,在现实世界中是正确的。

有人可能会说,泰雷兹定理是透视投影背后的核心数学工具,并且在图形管道(OpenGL或DirectX)中称为透视分割。您肯定应该知道这个定理,并学会识别何时可以使用它。


很好的参考!我一定会检查Thales定理,并尝试更好地了解图形管道。
贝里(Berry)

7

实际上,这几乎是正确的(如果将对象移开两倍,则其看起来会变大一半),但它掩盖了对象的视觉尺寸随观看者移动而应如何变化。具体来说,物体越靠近物体,看起来变得越快。这是因为与物体距离较远时相比,观察者在距离物体较近时能更快地覆盖一半距离。或者换句话说,在观看者的速度恒定的情况下,“一半距离”的值会随着到对象的距离变化而变化。


2

由于您实际上并没有在3D空间中工作,因此我们可以假定子图形永远不会旋转(可以通过倾斜等方式模拟旋转)。这种简单的约束使其非常容易获得关于尺寸的精确数字(取决于距离)从相机上。

首先,您需要了解如何渲染3D对象。即使摄像机会聚到单个点,也有一个不可见的平面充当在其上绘制对象的屏幕。您需要了解的关于屏幕的唯一一件事就是它离相机有多远。

这是在两个不同距离处如何将对象渲染到摄像机的示意图。

如您所料,物体的高度取决于与相机的距离。但是由于放牧发生在近乎拣选的平面上,因此我们必须计算该点精灵的高度。

一些基本的触发计算将使您得出以下公式:

f(d, v) = v/(v+d)
* Where f is the size ratio to the original sprite aka size factor
    and v is the distance to the near clipping plane (trial and error value)
    and d is the distance from the near clipping plane to the object

例:

Assuming you have a sprite that is 2.5x1.8 units in size and 10 units away 
   from the camera, and that the near clipping plane is 5 units from the camera.

sizeFactor = 5/(5+10) = 0.3

renderHeight = actualHeight * sizeFactor = 1.8 * 0.3 = 0.54
renderWidth  = actualWidth * sizeFactor = 2.5 * 0.3 = 0.75

我建议从头开始,v=5然后根据其外观从那里进行调整。我可能会摆弄小提琴,使您可以实时查看更改。

TL; DR

The change in height or width should be multiplied by the following factor:

sizeFactor = v/(v+d)

Where v = Some number greater than 0 that never changes (try 1 thru 5)
  and d = the distance from the camera

So an object that is 2.5 units tall would be rendered at 2.5*sizeFactor units tall.

编辑: 当您说沿z轴移动时,我假设您需要一个透视图(像大多数3D游戏,射击游戏等)。根据距离计算对象大小的数学方法还取决于帧中的位置,类似于周边视觉。取而代之的是,我将使用正交视图(例如Mario,Angry Birds,Super Smash Bros等)进行数学尝试。我不知道您要达到的外观,但是只要看起来真实,玩家就永远不会知道!

演示!


是的,我实际上的目标是正交投影。我正在“借”我当前灵感的游戏是《雷曼起源》。在游戏的某些部分,您可以跳上花朵,然后在另一个层中弹跳,深度不同。然后,相机将相应深度放大或缩小。可以在此视频中的4:50和5:00 看到轴示例。
Berry

此外,很好的答案!但是,仅凭确认“适用于两倍,两倍大”这一规则就足够了,所以我选择了Blue的答案是最好的。
Berry

谢谢您,祝您游戏顺利!但我确实想向其他人澄清,如果一切都非常靠近相机,那么“两倍接近,两倍大”将非常有用。随着事情的发展,尺寸的变化会减小。例如,闭上您的拇指,然后伸出手臂看。拇指的大小明显变小。之后,看远处的东西。向后退一步(大约与您的手臂长度相同)。注意大小几乎没有变化吗?如果游戏的视野很长,那么使用一点数学就会大有帮助。
吉姆·巴克2013年

编辑:我在以前的评论中犯了一个错误。当这些项目相对于它们到相机的距离保持相当接近时,“两倍接近,两倍大”是正确的。
吉姆·巴克

这是我整理的一个快速演示,使用鼠标移动并使用滚轮更改深度。
Jim Buck

0

这没有涉及,我认为这可能是有好处的:应该注意,当距离减半时,X和Y尺寸都加倍将使精灵的总面积增加4倍。这是因为:

Area = X * Y

放大后:

NewArea = (x*2) * (y*2)

这可能给您的印象是缩放效果发生得很快或太强烈。您可以通过将以上公式中的2更改为1.5或1.33之类的浮点值来调整系数。

或者,我所做的是将摄像机深度(距离)与图块的距离(距离)与摄像机平移(X和Y)一起存储在字节值中,然后计算出投影图块的大小:

XTileSize = (255 / CameraZ) * DefaultTileWidth
YTileSize = (255 / CameraZ) * DefaultTileHeight

请注意,CameraZ该限制必须严格在1-255之间,并且将来限制可能对您有利或不利。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.