По заданному вектору одной оси, как мне найти векторы двух других осей?

Это математическая задача, я не совсем уверен, как это сделать. Вектор не выровнен по оси, поэтому поворот на 90 градусов вокруг x, y или z не обязательно даст мне другие оси.

4 ответа

Решение

Я могу вспомнить пару разных сценариев, о которых вы, возможно, спрашиваете.


Дано: Существующая ранее система координат

  • В 2D-системе ваши оси / основы всегда [1,0] а также [0,1] - оси х и у.

  • В 3D-системе ваши оси / основы всегда [1,0,0], [0,1,0], а также [0,0,1] - x, y и z.


Дано: одна ось в произвольной базисной 2D системе координат

Если у вас есть одна ось в двухмерной системе координат на произвольной основе, другая ось является ортогональным вектором.

Чтобы повернуть вектор ортогонально против часовой стрелки:

[x_new, y_new] = [ -y_old, x_old]

Чтобы повернуть вектор ортогонально по часовой стрелке:

[x_new, y_new] = [ y_old, -x_old]

Подвести итоги:

Given: x-axis = [ a,  b]
Then:  y-axis = [-b,  a]

Given: y-axis = [ c,  d]
Then:  x-axis = [ d, -c]

Дано: две оси в произвольной трехмерной системе координат

Для этого найдите перекрестное произведение.

[a,b,c] x [d,e,f] = [ b*f - c*e, c*d - a*f, a*e - b*d ]

Следуя этим трем рекомендациям:

  • (ось x) x (ось y) = (ось z)
  • (ось y) x (ось z) = (ось x)
  • (ось z) x (ось x) = (ось y)

Дано: одна ось в произвольной трехмерной системе координат

Недостаточно информации, чтобы найти единственное решение этой проблемы. Это связано с тем, что если вы посмотрите на второй случай (одна ось в двухмерной системе координат с произвольной базой), вам сначала нужно найти ортогональный вектор. Однако существует бесконечное количество возможных ортогональных векторов для одной оси в трехмерном пространстве!

Однако вы можете найти одно из возможных решений.

Один из способов найти произвольный один из этих ортогональных векторов, найдя любой вектор [d,e,f] где:

[a,b,c] = original axis
[d,e,f] = arbitrary orthogonal axis (cannot be [0,0,0])

a*d + b*e + c*f = 0

Например, если ваша исходная ось [2,3,4], вы бы решили:

2 * d + 3 * e + 4 * f = 0

То есть любое значение [d,e,f] который удовлетворяет этому, является удовлетворительным ортогональным вектором (пока это не [0,0,0]). Можно выбрать, например, [3,-2,0]:

2 * 3 + 3 *-2 + 4 * 0 = 0
  6   +  -6   +   0   = 0

Как видите, одна "формула", которая работает, это [d,e,f] = [b,-a,0]... но есть много других, которые также могут работать; Есть, на самом деле, бесконечное!

Как только вы найдете свои две оси [a,b,c] а также [d,e,f], вы можете уменьшить это обратно к предыдущему случаю (случай 3), используя [a,b,c] а также [d,e,f] как ваши оси x и y (или любые другие оси, которые вам нужны, для вашей конкретной задачи).


нормализация

Обратите внимание, что, поскольку вы постоянно делаете точечные продукты и перекрестные продукты, ваши векторы будут становиться все больше и больше. В зависимости от того, что вы хотите, это может быть нежелательно. Например, вы можете захотеть, чтобы ваши базисные векторы (ваши оси координат) были одинакового размера / длины.

Для поворота любого вектора (кроме [0,0,0]) в единичный вектор (вектор длиной 1, в том же направлении, что и исходный вектор):

r  = [a,b,c]   
v  = Sqrt(a^2 + b^2 + c^2)   <-- this is the length of the original vector
r' = [ a/v , b/v , c/v ]

куда r' представляет единичный вектор r - вектор длиной 1, который указывает в том же направлении, что и r делает. Пример:

r  = [1,2,3]
v  = Sqrt(1^2 + 2^2 + 3^2) = Sqrt(13) = 3.60555  <-- this is the length of the original vector
r' = [0.27735, 0.55470, 0.83205]

Теперь, если бы я хотел, например, вектор в том же направлении r с длиной 5, я бы просто умножил r' * 5, который [a' * 5, b' * 5, c' * 5],

Недостаточно иметь только одну ось, поскольку существует еще бесконечное число осей, которые могут находиться в перпендикулярной плоскости.

Если вам удастся получить другую ось, вы можете использовать перекрестный продукт, чтобы найти третью.

Если у вас есть один вектор (x, y, z), вы можете получить к нему один перпендикулярный вектор как (y, -x, 0) (точечный продукт равен xy-y x + 0 * z = 0)

Затем вы берете перекрестное произведение обоих, чтобы получить оставшийся перпендикулярный вектор: (x,y,z) × (y,-x,0) = (0y+zx, ​​yz-0x, -x²-y²) = (zx, yz, -x²-y²)

Вы говорите о типичной 3-координатной системе, подобной той, что используется в 3D-движке?

Имея только вектор, вы не можете найти другие два, единственная информация, которую вы получите, это плоскость, на которой они лежат... но они могут быть под любым углом, даже если они перпендикулярны только одному вектору, который у вас есть.

Другие вопросы по тегам