角度
本文是鼠標運動的延續,着重介紹三角函數在Minecraft中的工作原理。
玩家的偏航角是一個浮點數,用於跟蹤玩家的水平旋轉(以度為單位)。它是無限的。
玩家的朝向是將偏航角限制在[-180°, 180°],如F3所示。
有效角,或者簡單地說,角度是一個整數 (從 到 )。
有效角
Minecraft 的三角函數依賴於有效角,即玩家的偏航角必須轉換為一個角度。
這種轉換將導致不精確:一個有效角跨越 ~Failed to parse (syntax error): {\displaystyle 0.0055°} ).
Sin() and Cos() 原代碼 (來自MathHelper):
private static final float[] SIN_TABLE = new float[65536];
public static float sin(float value) //in radians
{
return SIN_TABLE[(int)(value * 10430.378F) & 65535];
}
public static float cos(float value) //in radians
{
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);
}
}
Note: & 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 個或更多個單位,從而導致與預期計算的輕微偏移。
半角 就是這樣的值,可以在連續角的「中間」找到(因此得名)。
半角的存在完全是由於括號內的「+ 16384」。
半角在工具輔助跑酷之外沒有太大用處:它們對跳躍距離的影響很小,並且它們幾乎無法用於實時鼠標移動。
每個半角都有一個相關的乘數,代表其效益。
它對應於從 cos(f) 和 sin(f) 獲得的單位向量的範數。
從數學上講,它應該始終等於 1,但這在這種情況下並不成立。
- 「遞增」半角的範數大於 1:它們會增加移動速度。
- 「遞減」半角的範數小於 1:它們會降低移動速度。
當與給定的跳躍距離相乘時,它以其對應的半角給出了改進跳躍距離的上限。
大半角
2021年7月27日,凱米茲發現,當使用Optifine Fast Math(一種將有效角數量減少到4096個的功能)時, 某些偏航角會提供更高的速度。事實上,這並不是快速運算所特有的,很快人們就發現了原版的「大半角」。
大半角更有效,因為在該範圍內可以使用的精度浮點數較少:角度最多可以移動 64 個單位,而不是移動一個單位。
例如,偏航角為5898195°時的乘數為1.003,這與小半角(135.0055°的乘數為1.00005)相比是巨大的。這個半角是目前最有效的存在,並使[https://youtu.be/bQfl2Lleafw
2.125bm 4+0.5]之类的跳跃成为可能。
要達到如此高的數值,可能需要使用宏或mod,因為手動旋轉需要花費太長時間。
通過快速運算,半角被進一步放大,球員可以在偏航角小於運動,而在原版中只能在 內運動。
例如,偏航121000000°的乘數是1.09,這是如此可笑,它使平地連跳五遠成為可能。這個機制不應該被認為是官方的,因為它依賴於一個mod,並且在伺服器上使用這個漏洞可能是未經授權的(即使是Optifine)。
新版本的 Optifine 改變了快速運算的效果,消除了很多 FM 半角(自2019年12月發佈的U L5版本以來)。
特徵
減速的半角在-90°和0°之間很常見,因為負浮點數向上截斷,而正浮點數向下截斷
在0°和90°之間很少存在減速的半角。
加速的半角很少出現在90°和180°之間。
大半角的形式為,其中 以及 。 它們都在增加直到,此時它們可能會增加或減少。