Angles/zh: Difference between revisions

From Minecraft Parkour Wiki
Content added Content deleted
(Updating to match new version of source page)
(Updating to match new version of source page)
 
(4 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>




'''Sin() 与 Cos() 源代码'''(来自class MathHelper):<syntaxhighlight lang="java">
<div class="mw-translate-fuzzy">
'''Sin() 与 Cos() 源代码'''(来自[[SourceCode:MathHelper|MathHelper]]):<syntaxhighlight lang="java">
private static final float[] SIN_TABLE = new float[65536];
private static final float[] SIN_TABLE = new float[65536];
</div>




Line 45: 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 58: Line 59:
在这种情况下,疾跑跳跃会使玩家稍微向一侧移动,这对于创造无转向跳法可能很有用。
在这种情况下,疾跑跳跃会使玩家稍微向一侧移动,这对于创造无转向跳法可能很有用。


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


Line 98: Line 100:




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


Line 117: Line 120:




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


Line 125: 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° 之間。

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