Перемещение сферы так, чтобы ее ось Z была обращена в определенном направлении

#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. Нам еще предстоит пройти небольшой путь; через несколько часов у меня будет время отредактировать свой ответ в следующей части.