Анимация 3D модели на Python

Есть у меня приложение на PyQt и я хочу туда добавить окошко с анимацией 3D модели.

У меня есть риг этой модели, модель и её текстуры. Можете подсказать как анимировать эту модель и её риг, ну и вывести это всё в окно PyQt? (С 3D на python работаю впервые)

Код .py файла приложения:

import sys
from PyQt5.QtWidgets import *
from PyQt5.uic import loadUi

class ModelView(QWidget):
    def __init__(self):
        super(ModelView,self).__init__()
        loadUi('GUI/3DView.ui',self)
        self.setWindowTitle('Модель')
        self.playButton.clicked.connect(self.playBut)
        self.stopButton.clicked.connect(self.stopBut)
    def playBut(self):
        pass
    def stopBut(self):
        pass


app = QApplication(sys.argv)
widget = ModelView()
widget.show()
sys.exit(app.exec())

Код .ui файла:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Form</class>
 <widget class="QWidget" name="Form">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>332</width>
    <height>547</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Form</string>
  </property>
  <widget class="QOpenGLWidget" name="modelView">
   <property name="geometry">
    <rect>
     <x>10</x>
     <y>10</y>
     <width>300</width>
     <height>481</height>
    </rect>
   </property>
  </widget>
  <widget class="QPushButton" name="playButton">
   <property name="geometry">
    <rect>
     <x>10</x>
     <y>500</y>
     <width>91</width>
     <height>23</height>
    </rect>
   </property>
   <property name="text">
    <string>Воспроизвести</string>
   </property>
  </widget>
  <widget class="QPushButton" name="stopButton">
   <property name="geometry">
    <rect>
     <x>220</x>
     <y>500</y>
     <width>91</width>
     <height>23</height>
    </rect>
   </property>
   <property name="text">
    <string>Остановить</string>
   </property>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>

Модель Приложение


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

Автор решения: S. Nick

я не знаком с Blender, но если использовать VTK, это выглядит так.

VTK - это программная система с открытым исходным кодом для обработки изображений, трехмерной графики, объемного рендеринга и визуализации.

VTK включает в себя множество передовых алгоритмов (например, реконструкция поверхности, неявное моделирование, прореживание) и методов рендеринга (например, рендеринг объема с аппаратным ускорением, контроль уровня детализации).

import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QDesktopWidget
from PyQt5.QtWidgets import QFrame, QVBoxLayout

import vtk
from vtk.util.colors import tomato
from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor


class MouseInteractorStyle(vtk.vtkInteractorStyleTrackballCamera):
    def __init__(self, parent=None):
        self.AddObserver("LeftButtonPressEvent", self.leftButtonPressEvent)

    def leftButtonPressEvent(self, obj, event):
        self.OnLeftButtonDown()


class Main(QMainWindow):
    def __init__(self):
        super().__init__()

        # source
        cylinder = vtk.vtkCylinderSource()
        cylinder.SetResolution(20)

        # mapper
        mapper = vtk.vtkPolyDataMapper()
        mapper.SetInputConnection(cylinder.GetOutputPort())

        # actor
        actor = vtk.vtkActor()
        actor.SetMapper(mapper)
        actor.GetProperty().SetColor(tomato)
        actor.RotateX(30.)
        actor.RotateY(-45.)

        # renderer
        ren = vtk.vtkRenderer()
        ren.AddActor(actor)
        ren.SetBackground(0.1, 0.2, 0.4)

        # interactor
        frame = QFrame()
        inter = QVTKRenderWindowInteractor(frame)
        inter.SetInteractorStyle(MouseInteractorStyle())

        ren_win = inter.GetRenderWindow()
        ren_win.AddRenderer(ren)

        ren.ResetCamera()
        ren.GetActiveCamera().Zoom(1.5)

        ren_win.Render()
        inter.Initialize()

        layout = QVBoxLayout()
        layout.addWidget(inter)
        frame.setLayout(layout)
        self.setCentralWidget(frame)

        self.setWindowTitle("Qt VTK")
        self.resize(320, 240)
        self.centerOnScreen()
        self.show()

    def centerOnScreen(self):
        res = QDesktopWidget().screenGeometry()
        self.move((res.width()/2) - (self.frameSize().width()/2),
                  (res.height()/2) - (self.frameSize().height()/2))


if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = Main()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка