单位矢量V和D位于3D空间上.他们有相同的起点.我想将矢量V朝向矢量D旋转,但仅限角度θ.
鉴于我们知道:
我们现在想要计算向量Z,它也将是单位向量.是否可以计算向量Z的坐标,上面给出了这些信息?
你有什么想法可以解决这个问题吗?
一种方法是找到D垂直于 的分量,将其放大到等效长度,然后使用和V进行向量和:sin()cos()
D_perp = D - V * ((D . V)/(V . V))
D_perp_scaled = D_perp * (|V|/|D_perp|)
result = cos(theta) * V + sin(theta) * D_perp_scaled
Run Code Online (Sandbox Code Playgroud)
这是明确定义的,除非D与 平行V,否则会|D_perp| == 0产生除法问题。这并不奇怪:在这种情况下,你的旋转平面是不明确的——不清楚你应该旋转哪个方向!
从数学上讲,这种求垂线的方法相当于cross(cross(V,D),V)其他答案中提到的叉积方法,但可能更简单一些,并且适用于任何向量空间(例如,2-D 和 4-D 向量,而不仅仅是 3) -D)。
您需要做的是在V和D矢量的平面中定义第三个轴,使得V点在此方向上旋转90度.我将调用指向D'方向的单位向量.有了这个,你的Z向量很容易:
Z = cos(theta)*V + sin(theta)*D_tick;
Run Code Online (Sandbox Code Playgroud)
那么如何计算D'?这也很容易.首先使用叉积计算与V和D正交的矢量.称之为W:W = V×D.接下来,计算与W和V正交的矢量:D'= W×V =(V×D)×V.这指向正确的方向,但如果您的V和D是正交的,它将只是一个单位向量.因此归一化:D'= D'/ || D'||,其中|| D'|| 是矢量D'的大小.如果你有一个矢量数学包,你可以通过
D_tick = ((V.cross(D)).cross(V)).normalize();
Run Code Online (Sandbox Code Playgroud)
一个警告:如果|| D'||怎么办?是零?当且仅当您的Δφ是pi弧度(或180度)的倍数时才会发生这种情况.或者,它发生在V和D彼此平行或反平行时.在这个特殊情况下你的问题是不对的.您应该检查这个特例.
附录
My(V×D)×V和comestorm的D-V*((D·V)/(V·V))对于三维空间中的矢量是一个相同的.因为V是单位矢量,所以他的DV*((D·V)/(V·V))减小到DV(D·V).我的(V×d)×V等于d(V·V)-V(d·V)每向量三重积身份(http://mathworld.wolfram.com/VectorTripleProduct.html),并且这降低了DV(D·V),因为V是单位矢量.