为什么OpenGL使用度数而不是弧度?
OpenGL的devise者从来不害怕math,线性代数的知识对于所有人来说都是必不可less的,除了最简单的OpenGL应用程序。 我认为可以安全地假定OpenGL程序员熟悉弧度angular度。
在math上,弧度在每个方面比度更优雅。 他们也有实际的好处:
- C标准库使用弧度。
- 几乎任何其他库也使用弧度。
- 在一些计算中,弧度更方便,例如圆弧的长度。
那么为什么OpenGLdevise者决定指定像glRotatef
和gluPerspective
这样的glRotatef
来使用度?
(我知道这没有什么实际意义,而且也不会改变,我只是好奇,在OpenGL.org上我找不到答案)。
因为普通人更习惯于计算度数 – OpenGL意味着使用简单。 请注意,所有对度进行操作的函数都是“高级”函数。
对于OpenGL本身来说,接收弧度还是度是没有区别的 – 无论如何它们在内部被转换为变换matrix,所以没有使用其中一个或另一个的计算收益。
那么,为什么如果你允许他们使用学位,那为什么还要让人变得复杂? 任何在OpenGL中认真编码的人都会提供他们自己的从四元数计算出来的matrix。
本着同样的精神,我们可以问,为什么glRotatef
和gluPerspective
无论如何,因为matrix在每个方面更优雅,并允许更高的控制等级。
逐点:
- 优雅 – matrix在各个方面都更加优雅
- C库 – 由于计算原因,C库使用它们,GL函数的angular度并不意味着用于计算繁重的任务(直接使用matrix),并且可能实现有一个度数查找表。
- 任何其他库 – 跟Cib出于同样的原因C库之后 – 也是不真实的 – 许多C ++库允许select,有些则使用后者
- 计算的方便性 – 无所谓 – 内部表示是matrix,如果要高效地使用查找表进行计算 – 在angular度上没有直接的操作,所以表示并不重要
另外请注意 :所有使用度的函数都在当前的标准(3.2)中被弃用。 glRotatef
是获取度数的唯一函数,或者事实上是一个angular度。 glu是不适合重型部署的实用程序库,因此它是针对可读性量身定做的,而gluPerspective(... 60.0f..)
在提供FOV方面比gluPerspective( ... M_PI / 3.0f ... )
更具可读性和“标准” gluPerspective( ... M_PI / 3.0f ... )
会。
最后说明:
我想说的是,由于OpenGL是为最终用户devise的,所以使用度数是因为可以用整数指定重要的angular度( 270
…),所以不需要浮点GL_PI
常量。
我认为这是因为你应该能够得到一个确切的旋转matrix,如90或180度的某些angular度。 像其他人在这里指定的那样,如果使用pi / 2而不是90度,舍入误差可能会导致一个转换matrix, 几乎执行90度的旋转。
代码更容易阅读,它简化了新手的学习曲线,并允许快速黑客攻击。
正如已经指出的 – 度有优势 – 人类更适合度,比较:0.78539816339744830961566084581988 …以45度为例:/。
对于OpenGL的高级应用,无论如何都要提供自己的matrix。
那么,在大多数情况下会发生什么情况是,您使用math库将弧度转换为度数并转换回弧度。 我同意以前令人敬畏的海报所说的大部分内容。
这是更可读的。