在python中旋转网格,使其与向量平行

2024-06-09 14:24:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个网格(称为A和B),我正在使用open3d库在python中进行交互(很高兴使用import trimesh或其他更好的东西)。网格A为曲线结构,网格B近似于更平坦的曲面

我需要旋转网格,使我感兴趣的曲面朝向摄影机。 为了识别我需要的曲面,我编写了一些函数,将网格转化为点云,并为网格A创建最适合的球体,为网格B创建最适合的平面。这些函数非常有效,可以很好地匹配对象

我需要旋转网格,并且已经被如何执行旋转所困扰

我拥有的输入数据:

对于网格A: 网格质心A坐标和其最佳拟合球体的坐标(+其半径)-我想旋转网格,使其垂直于上述数据描述的向量

对于网格B: 网格B坐标的质心和最佳拟合平面法线的向量-我想旋转网格,使其垂直于上述数据描述的向量


Tags: 数据函数import网格结构向量曲线感兴趣
2条回答

我不知道那个库,但也许您可以尝试在Matplotlib的Affine2D()类中旋转对象

具体来说,请尝试使用以下功能: mtransforms.Affine2D().rotate()

首先,您必须导入它:matplotlib.transforms as mtransforms

解决了! 创建了两个矢量作为numpy数组,即矢量1和矢量2,并找到了open3d命令以使网格居中,并在两个矢量之间应用旋转矩阵。我认为这是容易受到万向节锁,但我不能得到我的头周围四元数,它的工作足够好,为我的使用场景

#this function to create a rotation matrix was taken from https://stackoverflow.com/q/63525482/6010071
def rotation_matrix_from_vectors(vec1, 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
#to move the mesh to 0,0,0 (using open3d library)
mesh.translate(-mesh.get_center())
# to rotate the mesh to variable vector2, i set it to np.array([0,0,1]) = in line with z axis again using open3d library
mesh.rotate(rotation_matrix_from_vectors(vector1,vector2),center=(0,0,0))

相关问题 更多 >