角度

From Minecraft Parkour Wiki
This page is a translated version of the page Angles and the translation is 100% complete.

本文是鼠标运动的续篇,重点讨论三角函数在 Minecraft 中的工作原理。


玩家的偏航角是一个浮点数,用于追踪玩家的水平旋转角度(以度为单位)。这一数值没有界限

玩家的朝向是将偏航角限制在 [-180°, 180°]范围内,如 F3 所示。

有效角,或简称角度,是一个介于 Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\textstyle 0}Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\textstyle 2^{16}-1} 之间的整数。



有效角

Minecraft 依赖于有效角进行其三角函数计算,这意味着玩家的偏航角需要转换成一个可处理的角度值。

这种转换会引入不精确性,因为一个有效角大约覆盖了 ~Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle 0.0055^{\circ}} 的真实角度范围。


Sin() 与 Cos() 源代码(来自class MathHelper):

private static final float[] SIN_TABLE = new float[65536];


public static float sin(float value) //以弧度为单位
{
    return SIN_TABLE[(int)(value * 10430.378F) & 65535];
}

public static float cos(float value) //以弧度为单位
{
    return SIN_TABLE[(int)(value * 10430.378F + 16384.0F) & 65535];
}


static
{
    for (int i = 0; i < 65536; ++i)
    {
        SIN_TABLE[i] = (float)Math.sin((double)i * Math.PI * 2.0D / 65536.0D);
    }
}

注意: & 65535给出除以 65536(Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle 2^{16}} )的(正)余数 为了将玩家的偏航转换为弧度(当调用 sin 和 cos 时),游戏会使用这两个公式:

//通用公式
f = this.rotationYaw * (float)Math.PI / 180.0F

////添加sprintjump boost时使用的公式
f = this.rotationYaw * 0.017453292F

它们的目的是一样的,但对于较大的值,结果可能不同。

在这种情况下,疾跑跳跃会使玩家稍微向一侧移动,这对于创造无转向跳法可能很有用。

半角

(int)(value * 10430.378F)(int)(value * 10430.378F + 16384.0F) 应该相隔 16384 个单位(90°),但由于浮点的不精确性,有些值可能会偏离 1 个或更多的单位,从而导致计算结果稍有偏移。

两个连续的角度(30237 和 30238)和中间的正半角。

半角就是这样的值,可以在连续的角度“中间”找到(因此得名)。

半角的存在完全是由于括号内的“+ 16384”。


半角在工具辅助跑酷(Tool-Assisted Parkour)之外没有太大用处:它们对跳跃距离的影响微小,并且很难通过实时鼠标移动来使用。


每个半角都有一个相关的乘数,代表其有效性。

它对应于从 cos(f) 和 sin(f) 获得的单位向量的范数。

从数学上讲,它应该始终等于 1,但在这种情况下并不成立。

  • “增益”半角的范数大于 1:它们会提升移动速度。
  • “减益”半角的范数小于 1:它们会降低移动速度。



Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\textstyle \left \|\vec{v}\right \|=\sqrt{\cos(f)^{2}+\sin(f)^{2}}}


当与给定的跳跃距离相乘时,它给出了使用相应半角时跳跃距离的上限。



有用的半角列表



大半角

2021 年 7 月 27 日,kemytz 发现,在使用 Optifine 的快速运算(一种将有效角数量减少到4096个的功能)时,某些偏航角可以提供更高的速度。实际上,这并非快速运算所特有的,随后也在原版中发现了“大半角”。

大半角更有效,因为在该范围内,浮点数可以处理的精度较低:角度可以被偏移多达 64 个单位,而不仅仅是一个单位。

例如,偏航角为 5898195° 时的乘数为 1.003,这与小半角(135.0055° 的乘数为 1.00005)相比是巨大的。这个半角是目前最有效的存在,并使 2.125bm 4+0.5 之类的跳跃成为可能。

要达到如此高的数值可能需要使用宏或模组,因为手动旋转会耗时太长。


通过快速运算,半角被进一步放大,玩家可以在偏航角小于 Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle 360 \times 2^{19}} 移动,而在原版中只能在 Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle 360 \times 2^{15}} 内移动。

例如,偏航角 121000000° 的乘数是 1.09,这是如此荒谬,它使平地连跳五远成为可能。这个机制不应被视为官方机制,因为它依赖于模组,并且在服务器上使用这个漏洞可能是不被允许的(即使是 Optifine)。

新版本的 Optifine 改变了快速运算的效果,消除了大量快速运算半角(自 2019 年 12 月发布的 U L5 版本以来)。


特征

减益半角在 -90° 和 0° 之间很常见,因为负浮点数向上截断,而正浮点数向下截断。

在 0° 和 90° 之间几乎不存在减益半角。

增益半角很少出现在 90° 和 180° 之间。

大半角的形式为 Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle 360 \times 2^n - \theta} ,其中 Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle \theta \in [0,90]}Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle n \in \{0, ... ,14\}} 。它们都为增益直到 Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle n \geq 8} ,此时它们既可能是增益又可能是减益。