这是一个数学问题,我不确定该怎么办。矢量未与轴对齐,因此仅围绕x,y或z旋转90度不一定会给我其他轴。
答案 0 :(得分:17)
我可以想到你可能会问的几个不同的场景。
鉴于:预先存在的坐标系
在2D系统中,您的轴/基础始终为[1,0]
和[0,1]
- x 和 y 轴。< / p>
在3D系统中,您的轴/基础始终为[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]
给定:任意基础3D坐标系中的两个轴
为此,请找到交叉产品。
[a,b,c] x [d,e,f] = [ b*f - c*e, c*d - a*f, a*e - b*d ]
遵循以下三条准则:
给定:任意基础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
例如,如果您的原始轴是[2,3,4]
,则您将解决:
2 * d + 3 * e + 4 * f = 0
也就是说,满足这个的{em>任何值[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]
后,您可以使用[a,b,c]
和[d,e,f]
作为x,将其缩减回上一个案例(案例3)和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]
现在,如果我想要一个长度为5的同一方向r
的向量,我只需乘以r' * 5
,即[a' * 5, b' * 5, c' * 5]
。
答案 1 :(得分:3)
只有一个轴是不够的,因为仍然有无数个轴可以在垂直平面内。
如果您设法获得另一个轴,则可以使用交叉产品来查找第三个轴。
答案 2 :(得分:1)
如果你有一个向量(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²)
答案 3 :(得分:0)
您是在谈论典型的3坐标系统,例如3D引擎中使用的系统吗?
只有一个矢量,你找不到另外两个,唯一的信息就是它们所在的平面......但是如果它们与唯一的一个矢量垂直,它们也可以是任意角度有