给定一个轴的矢量,如何找到其他两个轴的矢量?

Sto*_*f81 7 math vector rotation

这是一个数学问题,我不确定该怎么办.矢量未与轴对齐,因此仅围绕x,y或z旋转90度不一定会给我其他轴.

Jus*_* L. 17

我可以想到你可能会问的几种不同的场景.


给定:预先存在的坐标系

  • 在2D系统中,您的轴/基础始终是[1,0][0,1]- XŸ轴.

  • 在3D系统,您的轴/基础始终是[1,0,0],[0,1,0][0,0,1]- X,ÿ,和ž.


给定:任意基础2D坐标系中的一个轴

如果在任意基础2D坐标系中有一个轴,则另一个轴是正交矢量.

要旋转向量垂直逆时针:

[x_new, y_new] = [ -y_old, x_old]
Run Code Online (Sandbox Code Playgroud)

顺时针旋转矢量:

[x_new, y_new] = [ y_old, -x_old]
Run Code Online (Sandbox Code Playgroud)

总结一下:

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

Given: y-axis = [ c,  d]
Then:  x-axis = [ d, -c]
Run Code Online (Sandbox Code Playgroud)

给定:任意基础3D坐标系中的两个轴

为此,请找到交叉产品.

[a,b,c] x [d,e,f] = [ b*f - c*e, c*d - a*f, a*e - b*d ]
Run Code Online (Sandbox Code Playgroud)

遵循以下三条准则:

  • (x轴)x(y轴)=(z轴)
  • (y轴)x(z轴)=(x轴)
  • (z轴)x(x轴)=(y轴)

给定:任意基础3D坐标系中的一个轴

没有足够的信息来找到这个问题独特解决方案.这是因为,如果查看第二种情况(任意基础2D坐标系中的一个轴),首先需要找到正交向量.然而,在3D空间中存在无限量的可能正交向量到单个轴!

但是,您可以找到一种可能的解决方案.

通过查找任何向量来找到这些正交向量中的任意一个的一种方法,[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
Run Code Online (Sandbox Code Playgroud)

例如,如果您的原始轴是[2,3,4],您将解决:

2 * d + 3 * e + 4 * f = 0
Run Code Online (Sandbox Code Playgroud)

也就是说,满足这个的任何[d,e,f]都是令人满意的正交矢量(只要不是[0,0,0]).例如,人们可以选择[3,-2,0]:

2 * 3 + 3 *-2 + 4 * 0 = 0
  6   +  -6   +   0   = 0
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,一个适用的"公式"是[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 ]
Run Code Online (Sandbox Code Playgroud)

其中,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]
Run Code Online (Sandbox Code Playgroud)

现在,如果我想要,例如,一个r长度为5 的同一方向的矢量,我只需乘以r' * 5,即[a' * 5, b' * 5, c' * 5].

  • 这个问题老实说很模糊= / (2认同)