Angles/zh: Difference between revisions
No edit summary |
(Updating to match new version of source page) |
||
(22 intermediate revisions by 2 users not shown) | |||
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>。 |
||
</div> |
|||
'''Sin() |
'''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) // |
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) // |
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>'''注意:''' ''<code>& 65535</code>''给出除以 |
</syntaxhighlight>'''注意:''' ''<code>& 65535</code>''给出除以 65536(<math>2^{16}</math>)的(正)余数 |
||
为了将玩家的偏航转换为弧度 |
为了将玩家的偏航转换为弧度(当调用 sin 和 cos 时),游戏会使用这两个公式:<syntaxhighlight lang="java"> |
||
//通用公式 |
//通用公式 |
||
f = this.rotationYaw * (float)Math.PI / 180.0F |
f = this.rotationYaw * (float)Math.PI / 180.0F |
||
Line 54: | Line 57: | ||
它们的目的是一样的,但对于较大的值,结果可能不同。 |
它们的目的是一样的,但对于较大的值,结果可能不同。 |
||
在这种情况下, |
在这种情况下,疾跑跳跃会使玩家稍微向一侧移动,这对于创造无转向跳法可能很有用。 |
||
<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 77: | Line 79: | ||
从数学上讲,它应该始终等于 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日,kemytz发现,在使用Optifine的快速运算(一种将有效角数量减少到4096个的功能)时, |
2021 年 7 月 27 日,kemytz 发现,在使用 Optifine 的快速运算(一种将有效角数量减少到4096个的功能)时,[https://youtu.be/eMDajBi_QW0 某些偏航角可以提供更高的速度]。实际上,这并非快速运算所特有的,而且很快就发现了原版的“大半角”。 |
||
由于在该范围内可以使用的精度浮点数较少,因此大半角更有效:角度最多可以移动 64 个单位,而不是移动一个单位。 |
|||
例如,偏航角为5898195°时的乘数为1.003,这与小半角 |
例如,偏航角为 5898195° 时的乘数为 1.003,这与小半角(135.0055° 的乘数为 1.00005)相比是巨大的。这个半角是目前最有效的存在,并使 [https://youtu.be/bQfl2Lleafw 2.125bm 4+0.5] 之类的跳跃成为可能。 |
||
要达到如此高的数值 |
要达到如此高的数值可能需要使用宏或模组,因为手动旋转会耗费大量时间。 |
||
通过快速运算,半角被进一步放大, |
通过快速运算,半角被进一步放大,玩家可以在偏航角小于 <math>360 \times 2^{19}</math> 运动,而在原版中只能在 <math>360 \times 2^{15}</math> 内运动。 |
||
例如,偏航121000000°的乘数是1.09,这是如此荒谬,它使[https://youtu.be/Juz9bDZa5rc 平地连跳五远成为可能]。这个机制不应 |
例如,偏航角 121000000° 的乘数是 1.09,这是如此荒谬,它使[https://youtu.be/Juz9bDZa5rc 平地连跳五远成为可能]。这个机制不应被视为官方机制,因为它依赖于 Mod,并且在服务器上使用这个漏洞可能是未经许可的(即使是 Optifine)。 |
||
新版本的 Optifine 改变了快速运算的效果,消除了大量快速运算半角(自2019年12月发布的U L5版本以来)。 |
新版本的 Optifine 改变了快速运算的效果,消除了大量快速运算半角(自 2019 年 12 月发布的 U L5 版本以来)。 |
||
<span id="Characterization"></span> |
|||
== 特征 == |
== 特征 == |
||
减 |
减益半角在 -90° 和 0° 之间很常见,因为负浮点数向上截断,而正浮点数向下截断。 |
||
在0°和90°之间几乎不存在减 |
在 0° 和 90° 之间几乎不存在减益半角。 |
||
增益半角很少出现在 90° 和 180° 之间。 |
|||
大半角的形式为<math>360 \times 2^n - \theta</math>,其中 <math>\theta \in [0,90]</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
本文是鼠标运动的延续,着重介绍三角函数在 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 个或多个单位,导致与预期计算出现轻微偏差。
半角就是这样的值,可以在连续角的“中间”找到(因此得名)。
半角的存在完全是由于括号内的“+ 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° 之间。
大半角的形式为 ,其中 且 。它们都为增益直到 ,此时它们既可能是增益又可能是减益。