逆向工程 - 这是廉价的 3D 距离函数吗?

Reverse engineering - Is this a cheap 3D distance function?

我正在对 1999 年的一款游戏进行逆向工程,我遇到了一个功能,该功能看起来是在检查玩家是否在触发音频源的 3d 点范围内。反编译器对代码的处理非常糟糕,但我想我明白了。

// Position Y delta
v1 = * (float * )(this + 16) - LocalPlayerZoneEntry - > y;

// Position X delta
v2 = * (float * )(this + 20) - LocalPlayerZoneEntry - > x;

// Absolute value
if (v1 < 0.0)
    v1 = -v1;

// Absolute value
if (v2 < 0.0)
    v2 = -v2;

// What is going on here?
if (v1 <= v2)
    v1 = v1 * 0.5;
else
    v2 = v2 * 0.5;

// Z position delta
v3 = * (float * )(this + 24) - LocalPlayerZoneEntry - > z;

// Absolute value
if (v3 < 0.0)
    v3 = -v3;

result = v3 + v2 + v1;

// Radius
if (result > * (float * )(this + 28))
    return 0.0;

return result;

有趣的是,在游戏中,触发似乎非常不一致,有时会出现相当大的偏差,具体取决于我从哪一侧接近触发器。

有谁知道这是否是过去常用的算法?

注意:类型都是我加的,所以可能不正确。我假设这是 bool 类型的函数。

可视化距离函数 (a metric) 的最佳方法是绘制其单位球面(距原点单位距离的点集——所讨论的度量是范数诱导的)。

首先用更数学的形式重写它:

N(x,y,z) = 0.5*|x| + |y| + |z|          when |x| <= |y|
         = |x| + 0.5*|y| + |z|          otherwise

让我们对 2d 执行此操作(假设 z = 0)。绝对值使函数在四个象限中对称。 |x| <= |y| 条件使其在所有八个扇区中对称。让我们关注行业 x > 0, y > 0, x <= y。我们要找到N(x,y,0) = 1时的曲线。对于该部门,它减少到 0.5x + y = 1,或 y = 1 - 0.5x。我们可以去绘制那条线。当 x > 0, y > 0, x > y 时,我们得到 x = 1 - 0.5y。全部绘制出来得到以下单位 'circle':

为了比较,这里是欧几里得单位圆的叠加:

在第三维中,它的行为类似于出租车指标,有效地为您提供了一个 'diamond' 形状的球体:

所以是的,它是一个便宜的距离函数,尽管它缺乏旋转对称性。