ВНИМАНИЕ. Я отредактировал приведенный ниже вопрос, который более актуален для моей реальной проблемы, чем текст ниже. Вы можете пропустить его, но я оставлю его здесь по историческим причинам.
Чтобы увидеть, правильно ли я понял, float
в C - это то же самое, что и значение в радианах, верно? Я имею в виду, 360º = 6,28318531 радиан, и я только что заметил в своем приложении OpenGL, что полное вращение идет от 0,0 до 6,28, что, кажется, складывается правильно. Я просто хочу убедиться, что понял это правильно.
Я использую float
(назовем его anglePitch
) от 0,0 до 360,0 (его легче читать в градусах, и я избегаю преобразования int
в float
все время), и весь код, который я вижу в Интернете, использует какой-то макрос DEG2RAD()
, который определяется как DEG2RAD 3.141593f / 180
. В итоге получилось бы примерно так:
anglePitch += direction * 1; // direction will be 1 or -1
refY = tan(anglePitch * DEG2RAD);
Это действительно полное вращение, но это полное вращение будет, когда anglePitch = 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));
Этот код будет выполнен, когда я нажму клавиши ВЛЕВО / ВПРАВО, и камера будет вращаться по оси Y соответственно. Полный оборот идет от 0º до 360º.
anglePitch += direction * ROTATE_SPEED;
refY = tan(DEG2RAD(anglePitch));
Этот похожий код будет выполнен, когда я нажму клавиши ВВЕРХ / ВНИЗ и камера будет вращаться по оси X. Но в этой ситуации полный поворот идет от 0 ° до 180 °, и это меня действительно сбивает с толку. Я уверен, что это как-то связано с функцией касательной, но я не могу понять это.
Могу ли я использовать sin / cos (как в коде зевоты) для достижения такого же вращения? Каков правильный способ, самый простой код, который я могу добавить / исправить, и что имеет больше смысла для создания полного поворота по углу наклона от 0º до 360º?