【问题标题】:Rotate a 3d object in python在python中旋转一个3d对象
【发布时间】:2013-09-18 07:31:31
【问题描述】:

我已经完成了这个 2 个立方体的 3D 图。但是现在我想让它旋转,那么我怎样才能旋转里面的立方体呢?我想水平旋转最多 90º 度!

这是代码:

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
from itertools import product, combinations
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.set_aspect("auto")
ax.set_autoscale_on(True)


#dibujar cubo
r = [-10, 10]
 for s, e in combinations(np.array(list(product(r,r,r))), 2):
    if np.sum(np.abs(s-e)) == r[1]-r[0]:
        ax.plot3D(*zip(s,e), color="b")


#dibujar punto
#ax.scatter([0],[0],[0],color="g",s=100)

d = [-2, 2]
for s, e in combinations(np.array(list(product(d,d,d))), 2):
    if np.sum(np.abs(s-e)) == d[1]-d[0]:
        ax.plot3D(*zip(s,e), color="g")

plt.show()

【问题讨论】:

    标签: python 3d matplotlib


    【解决方案1】:

    当您单独绘制每个顶点时,我认为您需要对每个顶点应用旋转。 3D 旋转可能会令人困惑,定义这种旋转的方法有很多种,具体取决于您要如何旋转,这取决于您将选择哪一种。

    你声明你想要旋转它水平,在这样的 3d 图片中不清楚这是什么意思,所以如果我假设你想旋转它说错了,请原谅我z 轴有一个角度theta

    要旋转长度为 3 的向量p,我们保持第三个分量不变,并对其他两个分量进行旋转。这最好通过矩阵乘法来理解,但我将把解释留给Wolfram pages

    p_rotated_x = p_x * sin(theta) - p_y * sin(theta)
    p_rotated_y = p_x * sin(theta) + p_y * cos(theta)
    p_rotate_z = p_z
    

    这是在上面的链接中应用 R_z 旋转矩阵后的旋转组件。在导入一些三角函数后将其应用于您的代码

    from numpy import sin, cos
    theta = np.radians(30)
    for s, e in combinations(np.array(list(product(d,d,d))), 2):
        if np.sum(np.abs(s-e)) == d[1]-d[0]:
            s_rotated = [s[0] * cos(theta) - s[1] * sin(theta), 
                         s[0] * sin(theta) + s[1] * cos(theta),
                         s[2]]
            e_rotated = [e[0] * cos(theta) - e[1] * sin(theta), 
                         e[0] * sin(theta) + e[1] * cos(theta),
                         e[2]]      
            ax.plot3D(*zip(s_rotated,e_rotated), color="g")
    
    plt.show()
    

    这给出了:

    请注意,角度由 trig 函数以度数指定,需要以弧度为单位(因此转换)。

    这是一个相当简单的旋转,实现起来有些简单。我承认这可以改进,但基本思想就在那里。如果你想用更复杂的方法旋转它,我建议阅读Euler angles,这是一种(至少对我来说)理解 3d 旋转的直观方法。

    【讨论】:

    • 您好!现在我想从立方体的每个面上画出箭头,知道我怎样才能做到这一点吗?
    • 您需要打开另一个问题,我建议您先尝试一下,当您遇到困难时,请说明您卡住的方式/位置。如果您have a read of this post,我认为您可以毫无问题地做到这一点
    猜你喜欢
    • 1970-01-01
    • 2018-11-04
    • 2019-10-13
    • 2018-02-17
    • 2020-07-04
    • 1970-01-01
    • 2015-09-14
    • 2010-11-22
    • 1970-01-01
    相关资源
    最近更新 更多