I have two separate vectors of 3D data points that represent curves and I\'m plotting these as scatter data in a 3D plot with matplotlib.
Both the vectors start at t
Problem is here:
r = I + k + np.square(k) * ((1 -c)/(s**2))
np.square(k)
squares each element of the matrix. You want np.matmul(k,k)
or k @ k
which is the matrix multiplied by itself.
I'd also implement the side cases (especially s=0
) mentioned in the comments of that answer or you will end up with errors for quite a few cases.
Based on Daniel F's correction, here is a function that does what you want:
import numpy as np
def rotation_matrix_from_vectors(vec1, vec2):
""" Find the rotation matrix that aligns vec1 to vec2
:param vec1: A 3d "source" vector
:param vec2: A 3d "destination" vector
:return mat: A transform matrix (3x3) which when applied to vec1, aligns it with vec2.
"""
a, b = (vec1 / np.linalg.norm(vec1)).reshape(3), (vec2 / np.linalg.norm(vec2)).reshape(3)
v = np.cross(a, b)
c = np.dot(a, b)
s = np.linalg.norm(v)
kmat = np.array([[0, -v[2], v[1]], [v[2], 0, -v[0]], [-v[1], v[0], 0]])
rotation_matrix = np.eye(3) + kmat + kmat.dot(kmat) * ((1 - c) / (s ** 2))
return rotation_matrix
Test:
vec1 = [2, 3, 2.5]
vec2 = [-3, 1, -3.4]
mat = rotation_matrix_from_vectors(vec1, vec2)
vec1_rot = mat.dot(vec1)
assert np.allclose(vec1_rot/np.linalg.norm(vec1_rot), vec2/np.linalg.norm(vec2))
I think if you do not have rotation axis, the rotation matrix is not unique.