【发布时间】:2011-03-04 05:35:04
【问题描述】:
这是一道数学题,我不知道该怎么做。该向量未与轴对齐,因此仅围绕 x、y 或 z 旋转 90 度不一定会给我其他轴。
【问题讨论】:
这是一道数学题,我不知道该怎么做。该向量未与轴对齐,因此仅围绕 x、y 或 z 旋转 90 度不一定会给我其他轴。
【问题讨论】:
我能想到你可能会问的几个不同的场景。
给定:预先存在的坐标系
在 2D 系统中,您的轴/基准始终是 [1,0] 和 [0,1] -- x 和 y 轴。
在 3D 系统中,您的坐标轴/基础始终为 [1,0,0]、[0,1,0] 和 [0,0,1] -- x、y 和z.
给定:任意基二维坐标系中的一个轴
如果您在任意基二维坐标系中有一个轴,则另一个轴是正交向量。
正交旋转矢量逆时针:
[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 ]
遵循这三个准则:
给定:任意基 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]。
【讨论】:
只有一个轴是不够的,因为在垂直平面上仍有无数个轴。
如果你设法得到另一个轴,你可以使用叉积来找到第三个。
【讨论】:
如果你有一个向量 (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²)
【讨论】:
您指的是典型的 3 坐标系统,例如 3D 引擎中使用的系统吗?
只有一个向量你找不到其他两个,唯一的信息就是它们所在的平面。但是如果它们与你唯一的一个向量垂直,它们也可以是任何角度有。
【讨论】: