Angles/zh: Difference between revisions

From Minecraft Parkour Wiki
Content added Content deleted
No edit summary
(Updating to match new version of source page)
 
(3 intermediate revisions by one other user not shown)
Line 14: Line 14:




<span id="Significant_Angles"></span>
== 有效角 ==
== 有效角 ==


Minecraft 的三角函数依赖于有效角,即玩家的偏航角必须转换为一个角度。
Minecraft 的三角函数依赖于有效角,即玩家的偏航角必须转换为一个具体角度。


<div class="mw-translate-fuzzy">
这种转换导致角度的不精确:一个有效角跨越 ~<math>0.0055°</math>。
这种转换导致角度的不精确:一个有效角跨越 ~<math>0.0055°</math>。
</div>




Line 43: Line 46:
}
}
}
}
</syntaxhighlight>'''注意:''' ''<code>& 65535</code>''给出除以 65536 的(正)余数(<math>2^{16}</math>)
</syntaxhighlight>'''注意:''' ''<code>& 65535</code>''给出除以 65536(<math>2^{16}</math>)的(正)余数


为了将玩家的偏航转换为弧度(当调用 sin 和 cos 时),游戏会使用这两个公式:<syntaxhighlight lang="java">
为了将玩家的偏航转换为弧度(当调用 sin 和 cos 时),游戏会使用这两个公式:<syntaxhighlight lang="java">
Line 56: Line 59:
在这种情况下,疾跑跳跃会使玩家稍微向一侧移动,这对于创造无转向跳法可能很有用。
在这种情况下,疾跑跳跃会使玩家稍微向一侧移动,这对于创造无转向跳法可能很有用。


<span id="Half_Angles"></span>
== 半角 ==
== 半角 ==


Line 96: Line 100:




<span id="Large_Half_Angles"></span>
== 大半角 ==
== 大半角 ==


Line 115: Line 120:




<span id="Characterization"></span>
== 特征 ==
== 特征 ==


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


大半角的形式为 <math>360 \times 2^n - \theta</math>,其中 <math>\theta \in [0,90]</math> 以及 <math>n \in \{0, ... ,14\}</math>。它们都为增益直到 <math>n \geq 8</math>,此时它们既可能是增益又可能是减益。
大半角的形式为 <math>360 \times 2^n - \theta</math>,其中 <math>\theta \in [0,90]</math> <math>n \in \{0, ... ,14\}</math>。它们都为增益直到 <math>n \geq 8</math>,此时它们既可能是增益又可能是减益。

Latest revision as of 09:06, 26 December 2023

Other languages:

本文是鼠标运动的延续,着重介绍三角函数在 Minecraft 中的工作原理。


玩家的偏航角是一个浮点数,用于跟踪玩家的水平旋转(以度为单位)。它是无限的

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

有效角,或者简单地说,角度是一个整数(从 )。



有效角

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°}


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()的(正)余数 为了将玩家的偏航转换为弧度(当调用 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”。


半角在工具辅助跑酷之外没有太大用处:它们对跳跃距离的影响很小,并且它们几乎无法用于原速下的鼠标移动。


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

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

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

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




当与给定的跳跃距离相乘时,它给出其所对应的半角增益后的跳跃距离上限。



有益的半角列表



大半角

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

由于在该范围内可以使用的精度浮点数较少,因此大半角更有效:角度最多可以移动 64 个单位,而不是移动一个单位。

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

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


通过快速运算,半角被进一步放大,玩家可以在偏航角小于 运动,而在原版中只能在 内运动。

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

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


特征

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

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

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

大半角的形式为 ,其中 。它们都为增益直到 ,此时它们既可能是增益又可能是减益。