Я занимаюсь небольшим проектом, в рамках которого пытаюсь воссоздать образовательный язык программирования Logo .
Для тех, кто этого не знает, Logo состоит из «черепахи», которая стартует с (x, y)
места (0, 0)
, а затем может двигаться вперед и назад, чтобы рисовать линии. Кроме того, черепаха может бесконечно поворачиваться вправо или влево (например, угол «заворачивается» на 360 градусов обратно к нулю при повороте по часовой стрелке и имеет то же свойство в направлении против часовой стрелки).
Затем учащиеся могут использовать такие команды, как FD
переместить черепаху вперед или RT
повернуться вправо. Так, например, программа FD 10 RT 90 FD 10 RT 90 FD 10 RT 90 FD 10 RT 90
нарисует квадрат со стороной 10 единиц длины.
У моей черепахи есть свойства и x
, и когда я указываю расстояние, которое нужно пройти, я могу легко вычислить новые значения и со следующим:y
angle
d
x
y
old_x = x
old_y = y
r = angle * (pi / 180)
# преобразовать угол (в градусах) в радианы
new_x = old_x + (d * cos(r))
new_y = old_y + (d * sin(r))
Затем я рисую линию от (old_x, old_y)
до (new_x, new_y)
. Все идет нормально. Я могу идеально двигать черепаху в двух измерениях.
Но то, что я хотел бы сделать сейчас, это добавить UT
и DT
команды в мою программу, чтобы можно было двигать нос черепахи вверх и вниз, чтобы теперь мы могли рисовать трехмерные фигуры. Например, программа FD 10 UT 90 FD 10 UT 90 FD 10 UT 90 FD 10 UT 90
все равно нарисовала бы квадрат, только теперь он стоял бы вертикально.
Я знаю, что моя графическая библиотека (OpenGL) поддерживает рисование линий в 3D, на самом деле это то, что я уже делаю, только я z
все время сохраняю нулевой размер, и, очевидно, мне нужно будет отслеживать вторую переменную угла для вверх и вниз, но я совершенно не представляю, как вычислить новые x
и значения с учетом двух углов.y
z
Кто-нибудь может помочь? Многие ТИА.
Углы быстро становятся сложными в более высоких измерениях, но есть довольно хороший способ обойти это.
Начнем с примера в 2D. Вот формула движения, которую вы дали:
atan2
). Таким образом, мы можем полностью забыть об угле и просто предположить, что у нас есть вектор направления
это единичный вектор, и формула обновления становится
и вы можете вывести формулу обновления курса, выяснив, каким будет новый заголовок внутри этой системы координат черепахи, и преобразовав его обратно в стандартные координаты.
Переходя к 3D, мы можем напрямую использовать эти идеи. Вместо этого система координат черепахи, у нас есть система координат черепахи из трех единичных векторов, где это голова черепахи, находится прямо слева от черепахи (так что, если бы черепаха была самолетом, она указывала бы в направлении вниз по левому крылу), и указывает прямо вверх с точки зрения черепахи.
The является перекрестным произведением двух других, поэтому хранить его не обязательно, но и не повредит.
Учитывая любое трехмерное вращение, записанное как матрица , формула обновления для системы координат:
Вот вам две матрицы. Первый для LT от радианы (также известные как рыскание):
Подводя итог, можно сказать, что «правильное» понятие угла в 3D — это матрица, столбцы которой представляют собой ортогональные единичные векторы, а определитель которой равен (другая возможность , но если это будет это то, что заставляет векторы образовывать систему координат, удовлетворяющую правилу правой руки). Это также известно как элемент специальной ортогональной группы , если вы хотите посмотреть его.
Другие могут предложить использовать кватернионы, но оба подхода эквивалентны. Кватернионы в основном просто позволяют вам написать это матрица, использующая только четыре числа, а не девять.
В другом ответе Potato предлагает использовать углы Эйлера, но если вы хотите, чтобы все команды выполняли повороты с точки зрения черепахи, это неверно. Его RT и LT всегда будут относительно горизонтальной плоскости.
В моей книге
Эдгар, Джеральд А. , Мера, топология и фрактальная геометрия, Тексты для бакалавров по математике. Нью-Йорк и др.: Springer-Verlag. ix, 230 стр. 58 немецких марок за час (1990 г.). ЗБЛ0727.28003 .
в главе 7 «Дополнительные темы» я предлагаю трехмерную геометрию черепахи. (Это только в первом издании книги. Во втором издании я включил различные дополнительные темы.) В дополнение к обычным поворотам (рыскание) и предлагаемым вами поворотам (тангаж) есть еще и кувырок. Вот с. 196:
Внизу код трехмерного дракона...
Вы должны следить за ориентацией носа черепахи в используя два угла (горизонтальный) и (угол возвышения от горизонтали)
Единичное направление движения черепахи вперед равно
Предположим, вы начинаете с черепахи в самолет с носом, направленным в плюс направление оси, затем начальная и начало
С использованием декременты к и приращения к . Сходным образом, приращения к и декременты к .
Затем мы движемся вперед, новая позиция