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)
遵循以下三条准则:
给定:任意基础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].