首页 > 解决方案 > 在 Python 中使用欧拉角旋转 3D 对象

问题描述

看这张照片。在这种情况下,长方体必须沿着图片中标记的其他轴旋转,但它保持在同一轴 x、y、z上。所附图像给出了长方体的代码

##defining to plot the cuboid
def plot_cuboid(center, size):
    """
   Create a data array for cuboid plotting.
   ============= ================================================
   Argument      Description
   ============= ================================================
   center        center of the cuboid, triple
   size          size of the cuboid, triple, (x_length,y_width,z_height)
   :type size: tuple, numpy.array, list
   :param size: size of the cuboid, triple, (x_length,y_width,z_height)
   :type center: tuple, numpy.array, list
   :param center: center of the cuboid, triple, (x,y,z)
   """

    # suppose axis direction: x: to left; y: to inside; z: to upper
    # get the (left, outside, bottom) point
    ox, oy, oz = center
    l, w, h = size

    ##defining the points
    x = np.linspace(ox-l/2,ox+l/2,num=10)
    y = np.linspace(oy-w/2,oy+w/2,num=10)
    z = np.linspace(oz-h/2,oz+h/2,num=10)

    ## defining surfaces and extrude them
    x1, z1 = np.meshgrid(x, z)
    y11 = np.ones_like(x1)*(oy-w/2)
    y12 = np.ones_like(x1)*(oy+w/2)
    x2, y2 = np.meshgrid(x, y)
    z21 = np.ones_like(x2)*(oz-h/2)
    z22 = np.ones_like(x2)*(oz+h/2)
    y3, z3 = np.meshgrid(y, z)
    x31 = np.ones_like(y3)*(ox-l/2)
    x32 = np.ones_like(y3)*(ox+l/2)

    ax = fig.gca(projection='3d') ##plot the project cuboid

    #plot outside surface
    ax.plot_surface(x1, y11, z1, color='red', rstride=1, cstride=1, alpha=0.6)
    #plot inside surface
    ax.plot_surface(x1, y12, z1, color='white', rstride=1, cstride=1, alpha=0.6)
    #plot bottom surface
    ax.plot_surface(x2, y2, z21, color='blue', rstride=1, cstride=1, alpha=0.6)
    #plot upper surface
    ax.plot_surface(x2, y2, z22, color='black', rstride=1, cstride=1, alpha=0.6)
    #plot left surface
    ax.plot_surface(x31, y3, z3, color='green', rstride=1, cstride=1, alpha=0.6)
    #plot right surface
    ax.plot_surface(x32, y3, z3, color='pink', rstride=1, cstride=1, alpha=0.6)

    ## Add title 
    plt.title('Plot_for_PSM', fontsize=20)

    ##labelling the axes
    ax.set_xlabel('X')
    ax.set_ylabel('Y')
    ax.set_zlabel('Z')

`

我的问题是我们可以用python中的欧拉角旋转下面定义的长方体吗?

中心 =(2.1,-0.1,0.757761) 长度=0.3,宽度=0.4,高度=0.1 均以米为单位。根据附图中的代码。欧拉角为 0,0,120,例如沿 x、y、z 方向。

我制作了一些程序来用欧拉角旋转一个长方体。但是在达到欧拉角之后,如何旋转长方体是我的问题。任何人都可以建议或获得此问题的代码吗?

实际上,我有四元数,它们被转换成欧拉角,然后想根据这些欧拉角沿着它们的轴用右手定则旋转。您可以查看我所做的代码,也可以建议我做错了什么。

代码中'y'代表与x轴的夹角,'p'代表与y轴的夹角,'r'代表与z轴的夹角。预期的结果是长方体必须沿着这些欧拉角(y,p,r)相对于 x,y,z 轴旋转。

提前致谢!

标签: pythonnumpy3drotationeuler-angles

解决方案


首先计算角的位置向量(xyz 坐标),然后scipy.spatial.transform.Rotation在每个角上使用。


推荐阅读