Это - проблема математики, я не абсолютно уверен, как сделать. Вектор не выровненный к оси, поэтому просто повернув 90 градусов вокруг x, y, или z не обязательно даст мне другие оси.
Я могу придумать несколько различных сценариев, о которых вы могли бы спросить.
Дано: Существующая ранее система координат
В 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 ]
Следуя этим трем рекомендациям:
Дано: Одна ось в трехмерной системе координат с произвольной базой
Недостаточно информации, чтобы найти единственное решение Эта проблема. Это потому, что, если вы посмотрите на второй случай (одна ось в произвольной 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]
.
Одной оси недостаточно, поскольку существует бесконечное количество осей, которые могут находиться в перпендикулярной плоскости.
Если вам удастся получить еще одну ось, вы можете использовать кросс-произведение, чтобы найти третью.
Вы говорите о типичной трехкоординатной системе, подобной той, что используется в 3D-движке?
Имея только вектор, вы не можете найти два других, единственная информация, которая у вас будет - это плоскость, на которой они лежат... но они могут быть под любым углом, если они перпендикулярны единственному вектору, который у вас есть.
Если у вас есть один вектор (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²)