Динамическая отрисовка 3D графика matplotlib

Мне необходимо написать программу в которой на графике нарисован куб в пространстве. Этот куб необходимо двигать и вращать с помощью слайдеров. А реализовать это надо с помощью матрицы поворотов(вращения) группы SO(3) и матрицы перемещения R(3). Возникшая проблема: При изменении значения слайдеров ничего не происходит(пока реализовал только для вращения). Но если использовать фрагмент кода и строить график не динамически, то все работает. Подскажите пожалуйста, где ошибка или в чем проблема. А также, если вдруг знакомы с группами, подскажите пожалуйста, как реализовать перемещение через них. Выполняется все в Jupyter notebook

from matplotlib.widgets import Slider, Button, RadioButtons
from IPython.display import display
from mpl_toolkits import mplot3d
import ipywidgets as widgets
import numpy as np
import matplotlib.pyplot as plt
from scipy.linalg import expm
%matplotlib notebook


fig = plt.figure(figsize=(10, 12))
ax = plt.axes(projection='3d')
plt.subplots_adjust(left=0.2, bottom=0.3)

ax.grid(axis = 'both')
axcolor = 'lightgray'

x = np.linspace(-1, 1, 10)
y = np.linspace(1,1,10)
"""
line, = plt.plot(np.linspace(-1, 1, 10), np.linspace(1,1,10), color='red')
line1, = plt.plot(np.linspace(-1, 1, 10), np.linspace(-1,-1,10), color='red')
line2, = plt.plot(np.linspace(-1, -1, 10), np.linspace(-1,1,10), color='red')
line3, = plt.plot(np.linspace(1, 1, 10), np.linspace(-1,1,10), color='red')

line = plt.plot(np.linspace(-1, 1, 10), 
                np.linspace(1,1,10), np.linspace(1,1,10),
                color='red'), plt.plot(np.linspace(-1, 1, 10), 
                                       np.linspace(-1,-1,10), np.linspace(1,1,10),
                                       color='red'),plt.plot(np.linspace(-1, -1, 10),
                                                             np.linspace(-1,1,10), np.linspace(1,1,10),
                                                             color='red'),plt.plot(np.linspace(1, 1, 10), 
                                                                                   np.linspace(-1,1,10), np.linspace(1,1,10),
                                                                                   color='red')
"""
#Вершины куба
cube_matrix = np.array([[0, 0, 0], [1, 0, 0], [1, 1, 0],[0, 1, 0],[0, 1, 1],[0, 0, 1],[1, 0, 1],[1, 1, 1]])
cube = plt.plot(cube_matrix[:,0],cube_matrix[:,1],cube_matrix[:,2], color='red')
"""
line, = plt.plot(np.linspace(-1, 1, 10), np.linspace(1,1,10),np.linspace(1,1,10), color='red')
line1, = plt.plot(np.linspace(-1, 1, 10), np.linspace(-1,-1,10),np.linspace(1,1,10), color='red')
line2, = plt.plot(np.linspace(-1, -1, 10), np.linspace(-1,1,10),np.linspace(1,1,10), color='red')
line3, = plt.plot(np.linspace(1, 1, 10), np.linspace(-1,1,10),np.linspace(1,1,10), color='red')
line4, = plt.plot(np.linspace(-1, 1, 10), np.linspace(1,1,10),np.linspace(-1,-1,10), color='red')
line5, = plt.plot(np.linspace(-1, 1, 10), np.linspace(-1,-1,10),np.linspace(-1,-1,10), color='red')
line6, = plt.plot(np.linspace(-1, -1, 10), np.linspace(-1,1,10),np.linspace(-1,-1,10), color='red')
line7, = plt.plot(np.linspace(1, 1, 10), np.linspace(-1,1,10),np.linspace(-1,-1,10), color='red')
line8, = plt.plot(np.linspace(1, 1, 10), np.linspace(1,1,10),np.linspace(-1,1,10), color='red')
line9, = plt.plot(np.linspace(1, 1, 10), np.linspace(-1,-1,10),np.linspace(-1,1,10), color='red')
line10, = plt.plot(np.linspace(-1, -1, 10), np.linspace(-1,-1,10),np.linspace(-1,1,10), color='red')
line10, = plt.plot(np.linspace(-1, -1, 10), np.linspace(1,1,10),np.linspace(-1,1,10), color='red')
"""

x_movement=0
y_movement=0
z_movement=0

x_rotation=0
y_rotation=0
z_rotation=0

x_movement_slider_chart = plt.axes([0.25, 0.25, 0.65, 0.03], facecolor=axcolor)
x_movement_slider = Slider(x_movement_slider_chart, 'X перемещения', -1, 1, valinit=x_movement)

y_movement_slider_chart = plt.axes([0.25, 0.20,0.65, 0.03], facecolor=axcolor)
y_movement_slider = Slider(y_movement_slider_chart, 'Y перемещения', -1, 1, valinit=y_movement)

z_movement_slider_chart = plt.axes([0.25, 0.15,0.65, 0.03], facecolor=axcolor)
z_movement_slider = Slider(z_movement_slider_chart, 'Z перемещения', -1, 1, valinit=z_movement)

x_rotation_slider_chart = plt.axes([0.25, 0.10, 0.65, 0.03], facecolor=axcolor)
x_rotation_slider = Slider(x_rotation_slider_chart, 'X вращения', 0, 360, valinit=x_rotation)

y_rotation_slider_chart = plt.axes([0.25, 0.05,0.65, 0.03], facecolor=axcolor)
y_rotation_slider = Slider(y_rotation_slider_chart, 'Y вращения', 0, 360, valinit=y_rotation)

z_rotation_slider_chart = plt.axes([0.25, 0,0.65, 0.03], facecolor=axcolor)
z_rotation_slider = Slider(z_rotation_slider_chart, 'Z вращения', 0, 360, valinit=z_rotation)

#Генераторы группы S0(3)
Lx = np.array([[0, 0, 0], [0, 0, -1], [0, 1, 0]])
Ly = np.array([[0, 0, 1], [0, 0, 0], [-1, 0, 0]])
Lz = np.array([[0, -1, 0], [1, 0, 0], [0, 0, 0]])

#Элементы группы поворотов S0(3)
"""
Rx=expm(Lx*x)
Ry=expm(Ly*y)
Rz=expm(Lz*z)
"""
Rx = np.array([[1, 0, 0], [0, np.cos(x_rotation), -np.sin(x_rotation)], [0, np.sin(x_rotation), np.cos(x_rotation)]])
Ry = np.array([[np.cos(y_rotation), 0, np.sin(y_rotation)], [0, 1, 0], [-np.sin(y_rotation), 0, np.cos(y_rotation)]])
Rz = np.array([[np.cos(z_rotation), -np.sin(z_rotation), 0], [np.sin(z_rotation), np.cos(z_rotation), 0], [0, 0, 1]])

def x_rotation_update(val):
    x_rotation = np.deg2rad(x_rotation_slider.val)
    Rx = np.array([[1, 0, 0], [0, np.cos(x_rotation), -np.sin(x_rotation)], [0, np.sin(x_rotation), np.cos(x_rotation)]])
    cube_matrix = cube_matrix.dot(Rx)
    cube.set_xdata(cube_matrix[:,0])
    cube.set_ydata(cube_matrix[:,1])
    cube.set_3d_properties(cube_matrix[:,2])
    fig.canvas.draw_idle()
    fig.canvas.flush_events()
    
    
def y_rotation_update(val):
    y_rotation = np.deg2rad(y_rotation_slider.val)
    Ry = np.array([[np.cos(y_rotation), 0, np.sin(y_rotation)], [0, 1, 0], [-np.sin(y_rotation), 0, np.cos(y_rotation)]])
    cube_matrix = cube_matrix.dot(Ry)
    cube.set_data(cube_matrix[:,0],cube_matrix[:,1],cube_matrix[:,2])
    fig.canvas.draw_idle()
    fig.canvas.flush_events()
    
    
def z_rotation_update(val):
    z_rotation = np.deg2rad(z_rotation_slider.val)
    Rz = np.array([[np.cos(z_rotation), -np.sin(z_rotation), 0], [np.sin(z_rotation), np.cos(z_rotation), 0], [0, 0, 1]])
    cube_matrix = cube_matrix.dot(Rz)
    cube.set_data(cube_matrix[:,0],cube_matrix[:,1],cube_matrix[:,2])
    fig.canvas.draw_idle()
    fig.canvas.flush_events()
    
    
x_rotation_slider.on_changed(x_rotation_update)
y_rotation_slider.on_changed(y_rotation_update)
z_rotation_slider.on_changed(z_rotation_update)
plt.show()

Как это выглядит

А вот, что происходит если отрисовать график не динамически(все работает)

from matplotlib.widgets import Slider, Button, RadioButtons
from IPython.display import display
from mpl_toolkits import mplot3d
import ipywidgets as widgets
import numpy as np
import matplotlib.pyplot as plt
from scipy.linalg import expm
%matplotlib notebook

fig = plt.figure(figsize=(10, 12))
ax = plt.axes(projection='3d')
plt.subplots_adjust(left=0.2, bottom=0.3)

ax.grid(axis = 'both')
axcolor = 'lightgray'
x_rotation = np.deg2rad(45)
cube_matrix = np.array([[0, 0, 0], [1, 0, 0], [1, 1, 0],[0, 1, 0],[0, 1, 1],[0, 0, 1],[1, 0, 1],[1, 1, 1]])
Rx = np.array([[1, 0, 0], [0, np.cos(x_rotation), -np.sin(x_rotation)], [0, np.sin(x_rotation), np.cos(x_rotation)]])
Ry = np.array([[np.cos(y_rotation), 0, np.sin(y_rotation)], [0, 1, 0], [-np.sin(y_rotation), 0, np.cos(y_rotation)]])
Rz = np.array([[np.cos(z_rotation), -np.sin(z_rotation), 0], [np.sin(z_rotation), np.cos(z_rotation), 0], [0, 0, 1]])
cube_matrix = cube_matrix.dot(Rx)
cube = plt.plot(cube_matrix[:,0],cube_matrix[:,1],cube_matrix[:,2], color='red')

Поворот куба

Подскажите пожалуйста, в чем ошибка и как это подправить. Заранее благодарю


Ответы (0 шт):