Учитывая вектор одной оси, как я нахожу векторы других двух осей?

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

7
задан Beta 16 June 2010 в 00:57
поделиться

4 ответа

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


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

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

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


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

Если у вас есть одна ось в 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 axis) = ( y axis)

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

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

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

Один из способов найти произвольный один из этих ортогональных векторов, найдя любой вектор [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] .

17
ответ дан 6 December 2019 в 08:41
поделиться

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

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

3
ответ дан 6 December 2019 в 08:41
поделиться

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

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

0
ответ дан 6 December 2019 в 08:41
поделиться

Если у вас есть один вектор (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²)

1
ответ дан 6 December 2019 в 08:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: