【问题标题】:How to fake a 2D sprite moving on the Z axis?如何伪造在 Z 轴上移动的 2D 精灵?
【发布时间】:2011-07-20 23:08:25
【问题描述】:

我会精确我的问题,我有一个 2D 对象在 2D 世界(X,Y)中移动,我想伪造 Z 轴上的移动。所以我认为最好的办法是稍微调整一下它的范围(宽度、高度)和位置。 但是,确定大小为(w,h)并从相机向前移动 1 米(Z 轴)的对象的新范围的方程式是什么?这样一个函数的参数是什么?

提前感谢您的帮助。

【问题讨论】:

  • 让精灵变大还是变小?如果您使用的是 2D 等轴测视图,则还需要使运动曲线化。

标签: math graphics


【解决方案1】:

通过存储对象的真实(X,Y,Z) 坐标来使用投影,并在平面上方以二维投影(K*X/(Z+K),K*Y/(Z+K)) 显示来自相机K 的单位,其中+Z 远离相机。

要更改高度、宽度,请遵循类似的模式,(DX,DY) 是精灵的真实大小,(K*DX/(Z+K),K*DY/(Z+K)) 是表观(绘制)大小。

要做到这一点,您可以遵循这篇 FlipCode 文章中的建议。

【讨论】:

    【解决方案2】:

    主要参数是到相机的距离和孔径角。

    通过new_size = size / distance确定新的大小很简单。 请注意,没有距离的对象将是无限大的。 要获得孔径角的效果,您需要包含另一个因素fnew_size = f * size / distance 其中f 是单位大小的距离。 单位尺寸的距离是图像以其原始尺寸绘制的距离。 当然,这也不能为零。通过这个距离,您可以隐含地定义张角。

    当我谈到尺寸时,我指的是宽度和高度,因此公式适用于两者。

    希望你能听从我的解释。

    【讨论】:

    • 是的,我明白你的意思,谢谢你的回答。您认为“单位大小的距离”可以通过某种方式计算吗?就像相机的特性(fov,ratio)一样。
    • 您可以通过以下方式进一步改进:new_size = f * size / (f + distance)。这样距离 0 处的大小将为 1,距离 f 处的大小将是原始大小的一半,等等......
    • 对,这会抵消距离并将“零点”移动到相机后面。
    • 但是没有人说:“单位尺寸的距离是图像以原始尺寸绘制的距离”。所以这意味着在距离 f 处 new_size 应该是原始大小,所以我们有 f * size / f + f = size / 2,但它不是原始大小。
    • 在@tehvan 的提议中,原始大小的点是零距离。他稍微改变了 f 的含义,但这取决于你,你想要什么。我认为他的公式可以更直观地处理。
    【解决方案3】:

    宽度和高度将与与观看者的距离成反比。如果它们的距离是原来的两倍,则大小将减半。因此,如果您与观察者的“自然”距离是 A,并且新位置在 A+Z,那么您需要将原始宽度和高度乘以 A/(A+Z)。这也适用于较小的负 Z 值(对象更靠近观察者并且会显得更大)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-10
      • 1970-01-01
      • 1970-01-01
      • 2021-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多