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)