#math #vector #3d #rotation #geometry
#математика #вектор #3D #вращение #геометрия
Вопрос:
Во-первых, в этой задаче значение Z.
Контекст: 2D-игра сверху вниз с использованием 3D-объектов.
Игрок и все враги представляют собой сферы, которые могут перемещаться в любом направлении на 2D плоскости (XY). Они вращаются так, как и следовало ожидать при их перемещении. Их скорость — это трехмерный вектор в мировом пространстве, и именно так я влияю на них. Им не разрешается вращаться на месте.
Мне нужно найти формулу для определения направления, в котором должна двигаться одна из этих сфер, чтобы их ось Z (или любая ось на самом деле) указывала указанное направление в мировом пространстве.
Некоторые примеры могут быть уместны:
X
|
Z--Y
Это просто: локальные оси сфер соответствуют миру, поэтому, если я хочу, чтобы ось Z сфер была направлена вдоль 1,0,0, я могу переместить сферу вдоль 1,0,0.
То, что вызывает у меня проблемы, это:
X
|
Y--Z
Теперь я знаю, что для того, чтобы ось Z была направлена вдоль 1,0,0 в мировом пространстве, я должен сказать сфере двигаться вдоль 1,1,0, но я не знаю / понимаю, ПОЧЕМУ это так.
Я программирую уже десять лет, но я абсолютно отстой в векторной математике, поэтому предположите, что я идиот, когда пытаюсь объяснить 🙂
Комментарии:
1. Вам будет очень сложно сделать это без некоторых знаний о векторах.
2. Если это сфера, то осью z может быть любое направление.
3. Я даже не понял вопроса. Когда вы перемещаете сферу вдоль направления, ее оси не меняют своего направления, поскольку это просто перемещение. Вы ищете поворот, чтобы выровнять оси сферы в некотором направлении или что?
4. Вы имеете в виду, что эти сферы катятся по 2D плоскости?
5. @beta Для целей задачи да.
Ответ №1:
Хорошо, я думаю, я понимаю, что вы имеете в виду.
Возьмите шар — у вас должен быть такой, который валяется поблизости. Отметьте на ней точку, чтобы указать интересующую ось. Теперь выберите направление, в котором вы хотите, чтобы ось указывала. Хитрость заключается в том, чтобы вращать шар на месте, чтобы направить ось в правильном направлении — мы перейдем к вращению через минуту.
Очевидный способ — двигаться «прямо», и если вы проделаете это несколько раз, вы заметите, что ось, вокруг которой вы вращаете шар, перпендикулярна оси, которую вы пытаетесь переместить. Это как если бы точка находилась на экваторе, а вы вращались вокруг оси Север-Юг. Каждый раз, когда вы выбираете новое направление, это направление и отмеченная вами ось определяют новый экватор. Также обратите внимание (это может быть сложно), что вы можете нарисовать большой круг (это круг, который огибает сферу и делит ее на равные половины), который проходит между меткой и пунктом назначения, так что они находятся на противоположных полушариях, как зеркальные отражения. Полюса всегда находятся на этой окружности.
Теперь предположим, что вы не вольны выбирать полюса подобным образом. У вас есть отметка, у вас есть желаемое направление, так что у вас есть большой круг, и северный полюс будет где-то на окружности, но он может быть где угодно. Представьте, что кто-то другой может это выбрать. Метка по-прежнему будет поворачиваться к месту назначения, но они больше не будут находиться на экваторе, они будут на какой-то другой широте.
Теперь положите шар на пол и покатайте его — пока не беспокойтесь о метке. Обратите внимание, что она вращается вокруг горизонтальной оси, полюсов, и касается пола по окружности, экватору (который теперь вертикальный). Полюса должны находиться где-то на «талии» сферы, на полпути от пола (не называйте это экватором). Если вы выбираете полюса на этой окружности, вы выбираете направление вращения.
Теперь посмотрите на метки и нарисуйте большой круг, который их разделяет. Полюса должны находиться на этой окружности. Посмотрите, где этот круг пересекает «талию»; там должны быть ваши полюса.
Скажите мне, имеет ли это смысл, и мы сможем ввести математику.
Комментарии:
1. Да, это имеет смысл. Пришлось прочитать это несколько раз, но я думаю, что теперь у меня все получилось 🙂
2. @Rob Hale: хорошо, этого достаточно, чтобы объяснить, почему шар должен катиться в направлении (1, -1) во втором примере. Итак, вы знакомы с перекрестным произведением двух векторов?
3. Я когда-либо использовал перекрестное произведение только для получения перпендикулярного вектора в мировом пространстве. Например, мне не приходилось использовать Direction cross vect (0,0,1) для чего-то более сложного, чем это.
4. Хорошо, оказывается, решение намного проще, чем объяснение 🙂 В итоге я получил ось Z сферы и добавил к ней желаемое направление. Это дало мне направление, в котором сфера могла бы вращаться, в результате чего ее ось Z была бы направлена правильным образом.
5. @Rob Hale: Ммм … нет, это не сработает. Попробуйте свой второй пример: ось Z шара будет поворачиваться от Y к -X и обратно, но никогда к X. Нам еще предстоит пройти небольшой путь; через несколько часов у меня будет время отредактировать свой ответ в следующей части.