注意:我已经编辑了下面的问题,它与我的实际问题比下面的文字更相关,如果你可以跳过这个,但出于历史原因,我会把它留在这里。
看看我是否正确,float
C 中的 a 与弧度中的值相同,对吗?我的意思是,360º = 6.28318531 弧度,我刚刚在我的 OpenGL 应用程序上注意到一个完整的旋转从 0.0 到 6.28,这似乎是正确的。我只是想确保我做对了。
我正在使用从 0.0 到 360.0 的float
(让我们称之为anglePitch
)(它更容易以度数读取并且避免一直转换int
为float
),并且我在网络上看到的所有代码都使用某种DEG2RAD()
定义为DEG2RAD 3.141593f / 180
. 最后它会是这样的:
anglePitch += direction * 1; // direction will be 1 or -1
refY = tan(anglePitch * DEG2RAD);
这确实做了一个完整的旋转,但完整的旋转将是 whenanglePitch = 180
和anglePitch * DEG2RAD = 3.14
,但完整的旋转应该是 360|6.28。如果我将宏更改为以下任何一项:
#define DEG2RAD 3.141593f / 360
#define DEG2RAD 3.141593f / 2 / 180
它按预期工作,当anglePitch = 360
.
我在这里遗漏了什么,我应该用什么来正确地将角度转换为弧度/浮点数?
重要编辑(真正的问题):
我现在理解了我在网络上随处可见的关于 的代码DEG2RAD
,我只是在数学上太笨了(是的,我知道,在处理这类东西时很重要)。所以我要改写我的问题:
我现在已将此添加到我的代码中:
#define PI 3.141592654f
#define DEG2RAD(d) (d * PI / 180)
现在,当以度为单位工作俯仰/打哈欠角度时floats
,再次,为了避免一直投射,我只使用DEG2RAD
宏,度值将正确转换为弧度。这些值将被传递给 sin/cos/tan 函数,并将返回正确的值以在 GLUT 相机中使用。
现在是真正的问题,我之前真的很困惑,但无法更好地解释自己:
angleYaw += direction * ROTATE_SPEED;
refX = sin(DEG2RAD(angleYaw));
refZ = -cos(DEG2RAD(angleYaw));
当我按下 LEFT/RIGHT 键时,将执行此代码,相机将相应地沿 Y 轴旋转。一个完整的旋转从 0º 到 360º。
anglePitch += direction * ROTATE_SPEED;
refY = tan(DEG2RAD(anglePitch));
这是类似的代码,将在我按下 UP/DOWN 键时执行,相机将沿 X 轴旋转。但是在这种情况下,一个完整的旋转从 0º 到 180º 度,这让我很困惑。我确定它与切线函数有关,但我无法理解它。
有没有办法我可以使用 sin/cos(就像我在打哈欠代码中所做的那样)来实现相同的旋转?什么是正确的方法,我可以添加/修复的最简单的代码,以及创建从 0º 到 360º 的完整俯仰旋转更有意义的方法是什么?