逆向工程-这是便宜的3D距离功能吗?

use*_*923 13 c++ algorithm math reverse-engineering

我从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;
Run Code Online (Sandbox Code Playgroud)

有趣的是,在游戏中,触发似乎很不稳定,有时取决于我从哪一侧接近触发。

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

注意:这些类型都是我添加的,因此可能不正确。我认为这是布尔类型的函数。

ybu*_*ill 19

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

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

N(x,y,z) = 0.5*|x| + |y| + |z|          when |x| <= |y|
         = |x| + 0.5*|y| + |z|          otherwise
Run Code Online (Sandbox Code Playgroud)

让我们进行2d处理(假设为z = 0)。绝对值使函数在四个象限中对称。该|x| <= |y|条件使其在所有八个扇区中均对称。让我们专注于该领域x > 0, y > 0, x <= y。我们想在时找到曲线N(x,y,0) = 1。对于该部门,它减少为0.5x + y = 1y = 1 - 0.5x。我们可以去画那条线。对于什么时候x > 0, y > 0, x > y,我们得到x = 1 - 0.5y。将其全部绘制,将得到以下单位“圆”:

八边形

为了进行比较,下面是一个欧几里得单位圆:

与欧几里得

在第三维中,它的行为就像出租车的度量标准,有效地为您提供了“菱形”形状的球体:

动画的

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

  • @Soonts:是的,除了那张脸太多而且只有一半:)我会尝试渲染 3D 版本。 (2认同)
  • 哦,来吧,动画和阴影,认真的吗?+1 *不仅*因为您去那里的额外里程;-) (2认同)