Angles/zh: Difference between revisions

From Minecraft Parkour Wiki
Content added Content deleted
No edit summary
(Updating to match new version of source page)
 
(37 intermediate revisions by 2 users not shown)
Line 1: Line 1:
<languages/>
<languages/>
本文是[[Special:MyLanguage/Mouse Movement|鼠标运动]]的延续,着重介绍三角函数在Minecraft中的工作原理。
本文是[[Special:MyLanguage/Mouse Movement|鼠标运动]]的延续,着重介绍三角函数在 Minecraft 中的工作原理。




Line 6: Line 6:
玩家的'''偏航角'''是一个[http://zh.wiki.sxisa.org/wiki/%E6%B5%AE%E7%82%B9%E6%95%B0 浮点数],用于跟踪玩家的水平旋转(以度为单位)。它是'''无限的'''。
玩家的'''偏航角'''是一个[http://zh.wiki.sxisa.org/wiki/%E6%B5%AE%E7%82%B9%E6%95%B0 浮点数],用于跟踪玩家的水平旋转(以度为单位)。它是'''无限的'''。


玩家的'''朝向'''是将偏航角限制在[-180°, 180°],如[[Special:MyLanguage/Debug Screen|F3]]所示。
玩家的'''朝向'''是将偏航角限制在 [-180°, 180°],如 [[Special:MyLanguage/Debug Screen|F3]] 所示。


'''有效角''',或者简单地说,'''角度'''是一个整数 (从 <math display="inline">0</math> 到 <math display="inline">2^{16}-1</math>)。
'''有效角''',或者简单地说,'''角度'''是一个整数(从 <math display="inline">0</math> 到 <math display="inline">2^{16}-1</math>)。




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>




'''Sin() and Cos() 代码''' (来自[[SourceCode:MathHelper|MathHelper]]):<syntaxhighlight lang="java">
'''Sin() Cos() 代码'''来自class MathHelper):<syntaxhighlight lang="java">
private static final float[] SIN_TABLE = new float[65536];
private static final float[] SIN_TABLE = new float[65536];




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


public static float cos(float value) //in radians
public static float cos(float value) //以弧度为单位
{
{
return SIN_TABLE[(int)(value * 10430.378F + 16384.0F) & 65535];
return SIN_TABLE[(int)(value * 10430.378F + 16384.0F) & 65535];
Line 43: Line 46:
}
}
}
}
</syntaxhighlight>'''Note:''' ''<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">
//通用公式
//通用公式
f = this.rotationYaw * (float)Math.PI / 180.0F
f = this.rotationYaw * (float)Math.PI / 180.0F
Line 52: Line 55:
f = this.rotationYaw * 0.017453292F
f = this.rotationYaw * 0.017453292F
</syntaxhighlight>
</syntaxhighlight>
两者都有相同的目的,但对于较大的值,结果可能不同。
它们的目的是一样的,但对于较大的值,结果可能不同。

在这种情况下,跑跳跃玩家稍微向一侧移动,这对于无转弯策略可能很有用。



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


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


<code>(int)(value * 10430.378F)</code> 和 <code>(int)(value * 10430.378F + 16384.0F)</code> 应该相隔 16384 个单位(90°),但由于浮点不精确,某些值可能会进一步相差 1 个或多个单位,从而导致与预期计算轻微偏
<code>(int)(value * 10430.378F)</code> 和 <code>(int)(value * 10430.378F + 16384.0F)</code> 应该相隔 16384 个单位(90°),但由于浮点不精确,某些值可能会进一步相差 1 个或多个单位,导致与预期计算出现轻微偏


[[File:Half angle visualized.png|thumb|582x582px|两个连续的角度(30237 和 30238)和中间的正半角。]]'''半角''' 就是这样的值,可以在连续角的“中间”找到(因此得名)。
[[File:Half angle visualized.png|thumb|582x582px|两个连续的角度(30237 和 30238)和中间的正半角。]]'''半角'''就是这样的值,可以在连续角的“中间”找到(因此得名)。


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


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




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


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


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




Line 88: Line 90:




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








[[Special:MyLanguage/Positive Half Angles|有的半角列表]]
[[Special:MyLanguage/Positive Half Angles|有的半角列表]]








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


2021年7月27日,凯米兹发现,使用Optifine Fast Math(一种将有效角数量减少到4096个的功能)时, [https://youtu.be/eMDajBi_QW0 某些偏航角提供更高的速度]。实上,这并不是快速运算所特有的,很快人们就发现了原版的“大半角”。
2021 7 27 ,kemytz 发现,使用 Optifine 的快速运算(一种将有效角数量减少到4096个的功能)时,[https://youtu.be/eMDajBi_QW0 某些偏航角可以提供更高的速度]。实上,这并快速运算所特有的,而且很快就发现了原版的“大半角”。


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


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


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




通过快速运算,半角被进一步放大,球员可以在偏航角小于<math>360 \times 2^{19}</math>运动,而在原版中只能在 <math>360 \times 2^{15}</math>内运动。
通过快速运算,半角被进一步放大,玩家可以在偏航角小于 <math>360 \times 2^{19}</math> 运动,而在原版中只能在 <math>360 \times 2^{15}</math> 内运动。


例如,偏航121000000°的乘数是1.09,这是如此可笑,它使[https://youtu.be/Juz9bDZa5rc 平地连跳五远成为可能]。这个机制不应官方,因为它依赖于一个mod,并且在服务器上使用这个漏洞可能是未经授权(即使是Optifine)
例如,偏航121000000° 的乘数是 1.09,这是如此荒谬,它使[https://youtu.be/Juz9bDZa5rc 平地连跳五远成为可能]。这个机制不应被为官方机制,因为它依赖于 Mod,并且在服务器上使用这个漏洞可能是未经许可即使是 Optifine)


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






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


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


在0°和90°之间很少存在减速的半角。
90° 之间几乎不存在减半角。


加速的半角很少出现在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 (syntax error): {\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° 之間。

大半角的形式為 ,其中 。它們都為增益直到 ,此時它們既可能是增益又可能是減益。