360 ° = 2 * Pi, Pi = 3.141593…
Радианы определяются длиной дуги угла по окружности радиуса 1. Длина окружности составляет 2 * r * Pi, поэтомуодин полный оборот единичного круга имеет длину дуги 2 * Pi = 6,28…
Мера углов в градусах основана на том факте, что, выровняв 6 равносторонних треугольников, вы проходите полный оборот.Таким образом, у нас есть 6 треугольников, каждый из которых составляет 6-й ход, поэтому старые вавилоняне делили круг на части 1 / (6 * 6) = 1/36, и для дальнейшего уточнения он был разделен на 10. Поэтомумы закончили с 360 ° в полном круге.Это число выбирается произвольно.
Так что, если есть 2 * Пи / 360 °, это дает Пи / 180 ° = 3,141593… / 180 °, что является коэффициентом пересчета из градусов в радианы.Взаимное, 180 ° / Pi = 180 / 3.141593…
Почему на земле старая функция OpenGL glRotate и GLU в зависимости от ГЛП использовали градусы вместо радианов, которые я не могу понять.С математической точки зрения только радианы имеют смысл.Что, я думаю, наиболее красиво продемонстрировано уравнением Эйлера
e^(i*Pi) - 1 = 0
Там есть все важные числа математики в одном уравнении.Какое отношение это имеет к углам?Ну:
e^(i*alpha) = cos(alpha) + i * sin(alpha), alpha is in radians!
РЕДАКТИРОВАТЬ, в связи с измененным вопросом:
Ваши углы, будучи плавающими, в порядке.Почему вы даже думаете, что degress - целые числа, я не могу понять.Обычно вам не нужно определять PI самостоятельно, он предопределен в math.h, обычно называемом M_PI, M_2PI и M_PI2 для Pi, 2 * Pi и Pi / 2.Вы также должны изменить свой макрос, способ, которым он написан сейчас, может создавать странные эффекты.
#define DEG2RAD(d) ( (d) * M_PI/180. )
GLUT не имеет камеры вообще.GLUT - довольно тупой фреймворк OpenGL, который я рекомендую не использовать.Вы, вероятно, ссылаетесь на gluLookAt .
Эти препятствия на пути, давайте посмотрим, что вы там делаете.Помните, что тригонометрические функции работают на единичной окружности.Пусть угол 0 направлен вправо, а углы увеличиваются против часовой стрелки.Тогда sin (a) определяется как количество правых, а cos (a) и количество форвардов для достижения точки под углом a на единичной окружности.Это то, что присваивается refX
и refZ
.
refY
однако не имеет смысла записываться таким образом. tan = sin / cos , поэтому, когда мы приближаемся к n * pi / 2 (т.е. 90 °), оно расходится до +/- бесконечности.По крайней мере, это объясняет ваш циклический диапазон пи / 180 °, потому что это период tan .
Сначала я думал, что tan , возможно, использовался для нормализациивектор направления, но тоже не имеет смысла.Коэффициент был бы 1./sqrt(sin²(Pitch) + 1) Я дважды проверил: использование tan делает правильную вещь.
EDIT2: Iне вижу, где ваша проблема: Угол наклона составляет от -90 ° до + 90 °, что имеет смысл.Получите себе глобус (земли): координаты восток-запад (долгота) идут от -180 ° до + 180 °, координата юг-север (широта) идет от -90 ° до + 90 °.Подумайте об этом: любой больший диапазон координат вызовет неоднозначность.
Единственное хорошее предложение, которое я предлагаю вам, это: возьмите какой-нибудь учебник по математике и сосредоточитесь на сферических координатах! Извините, что говорю вамсюда.Все, что у вас есть, работает отлично, вам просто нужно понимать геометрию сперики.
Вы используете термины Yaw и Pitch.Они обычно используются в углах Эйлера.Теперь, к сожалению, углы Эйлера, которые вначале неотразимы, позже вызывают серьезные проблемы (например, блокировка карданного подвеса).Вы не должны использовать их вообще.Это также может быть хорошей идеей, если вы использовали некоторые карандаши / палки / что угодно, чтобы разложить вращения, которые вы намереваетесь своими руками, чтобы понять их механику.
И, между прочим:целые степениПросто прыгайте на http://maps.google.com, чтобы увидеть их в действии (просто выберите место и позвольте http://maps.google.com дать вам ссылку на него).