这是一个数学问题,我不确定如何解决。该向量未与任何轴对齐,因此仅围绕x、y或z旋转90度并不能给出其他轴。
我可以想到您可能在问几种不同的情况。
给定: 一个预先存在的坐标系
在2D系统中,您的轴/基础始终为[1,0]
和[0,1]
--x和y轴。
在3D系统中,您的轴/基础始终为[1,0,0]
、[0,1,0]
和[0,0,1]
--x、y和z。
给定: 一个任意基础下的二维坐标系统中的一个轴
如果您在任意基础下的二维坐标系统中有一个轴,则另一个轴是正交向量。
要逆时针将向量旋转90度:
[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 ]
按照以下三条指导原则:
已知:三维坐标系中的一个轴
现有的信息不足以找到此问题的唯一解。这是因为,在第二种情况(任意基础下的二维坐标系),需要先找到一个正交向量,但是在三维空间中,单个轴有无限多个可能的正交向量!
然而,可以找到其中一个可能的解。
通过找到任何向量 [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]
。
只有一个轴是不够的,因为仍然有无限多个轴可以在垂直平面上。
如果您成功获得另一个轴,您可以使用叉积来找到第三个轴。