По заданному вектору одной оси, как мне найти векторы двух других осей? - PullRequest
7 голосов
/ 16 июня 2010

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

Ответы [ 4 ]

17 голосов
/ 16 июня 2010

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


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

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

  • В трехмерной системе ваши оси / основы всегда [1,0,0], [0,1,0] и [0,0,1] - x , y и г .


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

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

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

[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].

3 голосов
/ 16 июня 2010

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

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

1 голос
/ 16 июня 2010

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

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

0 голосов
/ 16 июня 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...