SETTLE约束算法中的坐标变换问题_旋转矩阵

SETTLE约束算法中的坐标变换问题_坐标变换_02

SETTLE约束算法中的坐标变换问题_旋转矩阵_03

In [1]: import numpy as np
 
In [2]: T0 = np.array([[0, 0, 1], [0, -1, 0],[0, 1, 0]], np.float32)
 
In [3]: T1 = np.array([[1, 0, 1], [0, -1, 0], [0, 1, 0]], np.float32)
 
In [4]: D0 = np.mean(T0, axis=-2)
 
In [5]: D1 = np.mean(T1, axis=-2)
 
In [6]: A0B0 = T0[1]-T0[0]
 
In [7]: A0C0 = T0[2]-T0[0]
 
In [8]: v0 = np.cross(A0B0, A0C0)
 
In [9]: v0 /= np.linalg.norm(v0)
 
In [10]: v1 = T1[0]-D1
 
In [11]: v1 /= np.linalg.norm(v1)
 
In [12]: v2 = np.cross(v0, v1)
 
In [13]: v2 /= np.linalg.norm(v2)
 
In [14]: M1 = np.vstack((v0, v1, v2))
 
In [15]: M1 = M1.T
 
In [16]: iM1 = np.linalg.inv(M1)
 
In [17]: cost = np.dot(v0, v1)/np.linalg.norm(v0)/np.linalg.norm(v1)
 
In [18]: M0 = np.array([[0, 0, 1], [0, np.sqrt(1 - cost**2), 0], [1, cost, 0]])
 
In [19]: R = np.dot(M0, iM1)
 
In [20]: R
Out[20]: 
array([[ 0.00000000e+00, -1.00000000e+00,  0.00000000e+00],
       [ 0.00000000e+00,  0.00000000e+00,  9.99999916e-01],
       [ 1.00000000e+00,  0.00000000e+00,  5.00651538e-08]])
 
In [21]: np.dot(R, v0)
Out[21]: array([0., 0., 1.])
 
In [22]: np.dot(R, v1)
Out[22]: array([0.        , 0.70710671, 0.7071068 ])
 
In [23]: np.dot(R, v2)
Out[23]: array([1., 0., 0.])
 
In [24]: np.dot(R, T1[0]-D1)
Out[24]: array([0.        , 0.66666657, 0.66666666])
 
In [25]: np.dot(R, T1[1]-D1)
Out[25]: array([ 1.        , -0.33333332, -0.33333336])
 
In [26]: np.dot(R, T1[2]-D1)
Out[26]: array([-1.        , -0.33333332, -0.33333336])

SETTLE约束算法中的坐标变换问题_旋转矩阵_04

SETTLE约束算法中的坐标变换问题_代码实现_05

作者ID:DechinPhy