【问题标题】:Given vector of one axis, how do I find vectors of other two axes?给定一个轴的向量,我如何找到其他两个轴的向量?
【发布时间】:2011-03-04 05:35:04
【问题描述】:

这是一道数学题,我不知道该怎么做。该向量未与轴对齐,因此仅围绕 x、y 或 z 旋转 90 度不一定会给我其他轴。

【问题讨论】:

    标签: math vector rotation


    【解决方案1】:

    我能想到你可能会问的几个不同的场景。


    给定:预先存在的坐标系

    • 在 2D 系统中,您的轴/基准始终是 [1,0][0,1] -- xy 轴。

    • 在 3D 系统中,您的坐标轴/基础始终为 [1,0,0][0,1,0][0,0,1] -- xyz.


    给定:任意基二维坐标系中的一个轴

    如果您在任意基二维坐标系中有一个轴,则另一个轴是正交向量。

    正交旋转矢量逆时针

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

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

    为此,求叉积。

    [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轴)

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

    没有足够的信息来找到这个问题的唯一解决方案。这是因为,如果您查看第二种情况(任意基二维坐标系中的一个轴),您首先需要找到一个正交向量。但是,在 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
    

    例如,如果你的原始轴是[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]

    【讨论】:

    • 如果他正在使用模拟或游戏软件,他可能会旋转对象,这样可以很容易地找到其他两个轴。
    • 这个问题真的很模糊=/
    • 总之,贾斯汀:首先你使用两个正交向量的点积为零的点积规则,得到第二个轴。然后使用这两个轴的叉积得到第三个轴。我明白这一切。我唯一的问题是你如何得到一个向量的任意正交轴 {4.418020, -6.474061, -6.210284}
    • 您是如何选择 [3,-2,0] 作为正交轴的?
    • 好的,所以我知道你是如何得到 [b, -a, 0] 的,但这并不总是适用于任何向量,不是吗?它特定于 [2, 3, 4]
    【解决方案2】:

    只有一个轴是不够的,因为在垂直平面上仍有无数个轴。

    如果你设法得到另一个轴,你可以使用叉积来找到第三个。

    【讨论】:

    • 当你立即说有无数个合适的向量并且在你的下一段中你说如果一个合适的向量如何继续时,“只有一个轴是不够的”怎么可能是真的?找到向量了吗?
    【解决方案3】:

    如果你有一个向量 (x,y,z) 你可以得到一个垂直向量作为 (y,-x,0) (点积是 xyyx+0* z = 0)

    然后你取两者的叉积得到剩余的垂直向量: (x,y,z) × (y,-x,0) = (0y+zx, yz-0x, -x²-y²) = (zx, yz, -x²-y²)

    【讨论】:

    • 令 (x,y,z)=(0,0,1)。向量 (y,-x,0) 是 (0,0,0)。这是一个零向量。
    • @user207442:问题描述说向量未与轴对齐。如果 (x,y,z)=(0,0,1) 找到其他两个向量很简单。
    【解决方案4】:

    您指的是典型的 3 坐标系统,例如 3D 引擎中使用的系统吗?

    只有一个向量你找不到其他两个,唯一的信息就是它们所在的平面。但是如果它们与你唯一的一个向量垂直,它们也可以是任何角度有。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-18
      • 1970-01-01
      • 2017-03-28
      • 1970-01-01
      相关资源
      最近更新 更多