mindsponge.common.rots_from_two_vecs

mindsponge.common.rots_from_two_vecs(e0_unnormalized, e1_unnormalized)[源代码]

输入两个向量 \(\vec a\)\(\vec b\) ,计算由这两个向量所构成的x-y平面所在坐标系与原始坐标系之间的旋转矩阵。

\(\vec a = (a_x, a_y, a_z)\)\(\vec b = (b_x, b_y, b_z)\)

首先计算 \(\vec a\) 的单位向量 \(\vec e_0 = \frac{\vec a}{|\vec a|}\) 作为该坐标系的x轴单位向量。

之后计算 \(\vec b\) 在a轴上的投影长度 \(c = |\vec b| \cos\theta = \vec b \cdot \frac{\vec a}{|\vec a|}\)

那么 \(\vec b\) 向量在a轴上的投影向量为 \(c\vec e_0\),与a轴垂直的向量即为 \(\vec e_1' = \vec b - c\vec e_0\)

计算 \(\vec e_1'\) 的单位向量 \(\vec e_1 = \frac{\vec e_1'}{|\vec e_1'|}\)\(\vec e_1\) 即为该坐标系的y轴单位向量。

最后通过计算 \(\vec e_1\)\(\vec e_0\) 的外积得到 \(\vec e_2\) ,即为该坐标系的z轴单位向量。

最后返回的旋转矩阵为 \((e_{0x}, e_{1x}, e_{2x}, e_{0y}, e_{1y}, e_{2y}, e_{0z}, e_{1z}, e_{2z})\)

参数:
  • e0_unnormalized (tuple) - 作为该坐标系x轴的向量,长度为3,数据类型为标量或者shape相同的Tensor。

  • e1_unnormalized (tuple) - 构成X-Y平面的另一个向量,长度为3,数据类型为标量或者shape相同的Tensor。

返回:

tuple,两个向量的旋转矩阵 \((e_{0x}, e_{1x}, e_{2x}, e_{0y}, e_{1y}, e_{2y}, e_{0z}, e_{1z}, e_{2z})\) ,数据类型为标量或者shape相同的Tensor。

支持平台:

Ascend GPU

样例:

>>> import mindsponge
>>> v1 = (1, 2, 3)
>>> v2 = (3, 4, 5)
>>> ans = mindsponge.common.rots_from_two_vecs(v1, v2)
>>> print(ans)
(0.4242640686695021, -0.808290367995452, 0.40824828617045156, 0.5656854248926695,
-0.1154700520346678, -0.8164965723409039, 0.7071067811158369, 0.5773502639261153,
0.4082482861704521)