为什么在游戏开发中弧度优先于度?


39

我一直在寻找弧度的定义,发现数学家更喜欢弧度,因为它们是从pi派生的,而不是像度数那样完全任意的。

但是,我还没有找到在游戏开发中使用它们的令人信服的理由,可能是由于我完全缺乏相关的数学理解。我知道语言中大多数sin / cos / tan函数的弧度是多少,但是有人也可以按度创建库函数(并避免使用pi时固有的舍入错误)。

我不希望这是一个自以为是的民意测验,我只是想听听那些从事游戏开发(以及相关的数学研究)的人,他们认为弧度提供了优于学位的体验,而不是“我们使用弧度因为我们一直使用它们”,只是为了帮助我(可能还有其他人)了解它们的好处。


2
一个答案是它们更快。在诸如sin之类的功能中使用弧度之前,您不必隐蔽度。我应该更具体地说,一种计算sin(x)的方法是使用泰勒展开式-展开时,“ x”必须以弧度为单位。
user3728501 2013年

Answers:


49

在数学中使用弧度是因为

  1. 他们测量圆上的弧长,即半径为r的圆上的角度theta的弧仅为r * theta(与pi / 180 * r * theta相反)。
  2. 当按弧度定义trig函数时,它们遵循彼此之间更简单的关系,例如余弦是正弦的导数,或者对于小x,sin(x)〜= x。如果用度数来定义,则正弦的导数将为pi / 180 *余弦,对于小x,我们将得到sin(x)〜= pi / 180 * x。

不是像pi这样的数学家。由于上述原因,弧度实际上是角度测量比角度测量更自然的选择。它们是pi / 180等因素消失的角度度量。

因此,IMO的问题不是“为什么使用弧度”,而是“为什么使用弧度”。换句话说,不需要使用弧度的理由。它们是角度测量的默认选择。一个需要使用学位的理由。例如,一个人可能会选择在应用程序的用户界面中以度为单位显示角度,因为许多人(尤其是艺术家)更加熟悉角度。但是,我个人已经习惯于以弧度而不是角度来考虑角度。

我没有任何具体的gamedev示例供您参考,因为这实际上不是gamedev问题,而是数学问题,并且在使用数学的任何领域都一样。

(顺便说一句,使用pi时没有比使用度数更多的“内在舍入误差” ...角度应该始终是实数,而不是整数,否则如何表示半个角度?:) )


4
同意以上内容。我还要补充一点,就是我曾经看到过一个游戏库,它使用自己的标准(基于256圆)。原因似乎是他们的trig函数使用了具有256个条目并在它们之间进行插值的查找表。如果您不这样做,而是根据其系列扩展来计算sin / cos / tan,或者在FPU上使用FSIN / FCOS指令(最典型的),那么它们都将期望以弧度为单位的输入-因此,通过保留它以弧度为单位。
DMGregory

11
“为什么不使用弧度”-我愿意打赌唯一的好答案是“因为四年级的作业将是弧度的噩梦”,这可能是我们当中甚至没有听说过学位的唯一原因。:)
肖恩·米德迪奇

5
@SeanMiddleditch四年级班级必须迁移到Tau。Tau是360的弧度版本。它简化了数学运算,专业人员也必须开始采用它。
2013年

2
圆圈的256分或圆圈的16384分意味着您可以分别使用无符号字节或16位数字,并且加/减的上/下溢是正确的事情。使用弧度时,您可能最终会使用浮点数,这意味着您的角度越接近零,您将获得更高的精度,并且随着距离的减小,精度也会越来越低,这在大多数情况下是无用/愚蠢的。
rjmunro 2013年

2
@Val:Tau不能解决度数相同的问题。度数易于测量带有整数的相对较小的角度。当学生仍要手工完成所有操作并且对分数不太满意时,尝试早期几何教学时,这一点很重要。考虑一下学生通常遇到的“钟针角度”问题,以及这些问题如何清晰地映射到度数而不是Pi / Tau弧度。这类似于学位在游戏中一度流行的原因:使用学位查询表更容易/更快(当时),并为他们的需求提供了“足够好”的分辨率。
肖恩·米德迪奇

4

内森的答案非常具体。我想提供一个更一般的看法:

在大多数处理单元中本机实现的最复杂的数学概念是浮点数,作为实数ℝ的模型。视觉几何是基于三维实向量空间ℝ³的。坐标是实数。几何量基于length,它是单位的实数倍。

由于存在实数和长度的基础,因此也可以通过实数分别模拟角度。长度。弧度是具有给定角度的单位圆弧的长度。因此,它是基于实数分别与所有其他这些单元最兼容的角度模型。长度。例如,对于较小的x值,近似值sin x〜x是单位圆上某个点的y坐标与从x轴到该点的弧之间的近似值。

人们不应忘记,角度的长度。它是由两条相交的直线创建的平面的4个部分之一。它的数量受ℝ³中平面的对称性和欧几里德度量的限制。

给定角度的值作为整转的一部分,用在端点处粘合在一起的半开间隔[0,1](或(0,1])对角度建模更为自然,度数仅为1 / 360整圈(顺便说一句:从理论上讲,这是比用于实数的十进制更好的选择。)


0

尽管我也使用弧度,但出于所有指定原因,至少有一个很好的理由偏爱度数:精度和误差累积。准确地一次旋转整个圆圈1度。一次不能旋转整个圆周2PI / 360弧度。在像素网格上执行90度旋转4次,可让您回到刚开始的位置。不能在像素网格上执行2PI / 4弧度旋转4次。


根据经验进行测试,经过四个90度旋转并以弧度为单位的单个精度浮点增量,我发现总误差为1.75E-7(小于500万分之一)。在像素网格上,旋转的对象/框架的半径必须在数百万个像素中,然后才能在外边缘(应该在距该点大于0.5线性px的点)上遇到1个像素的误差。换句话说,精度损失在实践中不太可能成为问题(特别是如果您使用double的话)。
DMGregory

从数字角度来看,您是正确的,但从视觉角度来看,如果硬边缘的一个像素突然弹出错误值,那么您就被搞砸了。
ddyer

请参阅上面的“百万像素”注释。对于典型大小的子图形(例如,宽度约为2048像素或更小),该错误将基本上小于一半像素,因此将通过像素网格本身的固有舍入消除。另外,请注意,一次旋转360/7度会累积非常相同的误差。您可以通过坚持以2的幂的和表示的增量(对指数范围有一定限制)来消除两个系统的舍入误差,但是更改为不累积许多小增量的代码可能会更容易。
DMGregory

@DMGregory这就是“ Pi固有的舍入错误”的意思。另一个选择是不使用单打/双打,而是一种将数字表示为因子的方式(因此,将2 * pi / 360表示为不是作为计算结果而是作为该公式),并且仅在需要时才计算结果。我不知道是否有任何“真正的”程序可以这样做,但是像Mathematica这样的东西总是可以将“ 1/3”表示为“ 1/3”,而不是“ 0.333333 .....”。但通过数字去后,我想你是对的,舍入误差是有,但不显着
迈克尔葡萄汁

2
1度的角度可能比弧度更容易精确地表示度,旋转对象也不是精确的,因为它需要三角函数。cos 1°的舍入误差与pi / 180一样大
Marcks Thomas

-3

让我们同意,选择并坚持使用它比使用两个定义更好,并且略微猜测其中一个对于当前函数是必需的。然后,对于正弦和余弦的实现,使用弧长更自然,这可能是cmath以此方式实现的原因。由于游戏通常是用C ++或C编写的,并且已经实现了sin和cos,因此坚持该定义是很有意义的。

[给您遗留的opengl螺丝]


这并不能真正回答问题。您是要评论另一个答案吗?
乔什
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.