在python中旋转一个3d对象

时间:2013-09-13 14:48:30

标签: python 3d matplotlib

我已完成2个立方体的3D绘图。但现在我希望它旋转,那么如何旋转内部的立方体?我想水平旋转90度!

enter image description here

这是代码:

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()

1 个答案:

答案 0 :(得分:6)

当您单独绘制每个顶点时,我认为您需要对每个顶点应用旋转。 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旋转矩阵后的旋转组件。在导入一些trig函数后将其应用于您的代码

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()

这给出了:

enter image description here 注意角度是以度为单位指定的trig函数需要它以弧度为单位(因此转换)。

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