【问题标题】:Reverse engineering - Is this a cheap 3D distance function?逆向工程 - 这是一个便宜的 3D 距离函数吗?
【发布时间】:2019-11-27 23:08:54
【问题描述】:

我正在对 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 类型的函数。

【问题讨论】:

    标签: c++ algorithm math reverse-engineering


    【解决方案1】:

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

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

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

    让我们为 2d 做这个(假设 z = 0)。绝对值使函数在四个象限中对称。 |x| &lt;= |y| 条件使其在所有八个扇区中对称。让我们关注行业x &gt; 0, y &gt; 0, x &lt;= y。我们想找到N(x,y,0) = 1时的曲线。对于该部门,它减少到0.5x + y = 1y = 1 - 0.5x。我们可以去画那条线。当x &gt; 0, y &gt; 0, x &gt; y 时,我们得到x = 1 - 0.5y。将其全部绘制为以下单位“圆圈”:

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

    在第三个维度中,它的行为类似于出租车指标,有效地为您提供“钻石”形球体:

    是的,它是一个廉价的距离函数,尽管它缺乏旋转对称性。

    【讨论】:

    • 我认为形状大概是这样的:readtiger.com/img/wkp/en/Enneagonal_pyramid1.png 另一个,翻转一个,下面。
    • @Soonts: 是的,只是那张脸太多了,而且只有一半 :) 我会尝试渲染一个 3D 版本。
    • 我没数过,用图像搜索“八角金字塔”。好的,这个可能更好:upload.wikimedia.org/wikipedia/commons/8/86/…
    • 请注意,x + y/2 代表 y&lt;x 是 30 年前近似 sqrt(x^2+y^2) 的常用方法,当时有可用的处理器。它可能是旧游戏的继承
    • 哦,来吧,动画和阴影,认真的吗? +1 不仅因为您去那里的额外里程;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 2012-09-06
    • 2023-04-01
    • 2012-03-12
    相关资源
    最近更新 更多