qml_puthon_user
3 декабря 2019 г. 12:36

Как в QML форму добавить 3D объект.

Всем доброго времени суток!
Я пишу интерфейс для пользователя и в него мне нужно добавить вращающийся 3д объект.
Как я понял, на python ещё нет QtQuick3D, поэтому пользовался Qt3D.
Для примера написал код из видео.
Qt3D QML Tutorial 1. Шаблон проекта / Project template

Написал код:

  1. import QtQuick 2.12
  2. import QtQuick.Controls 2.12
  3. import QtQuick.Layouts 1.3
  4. import Qt3D.Core 2.0
  5. import Qt3D.Input 2.0
  6. import Qt3D.Render 2.0
  7. import Qt3D.Logic 2.0
  8. import Qt3D.Extras 2.0
  9.  
  10. ApplicationWindow{
  11. id:general_win
  12. visible: true
  13. width: 1680
  14. height: 920
  15. title: qsTr("Test title")
  16.  
  17. Rectangle
  18. {
  19. id: mainwindow
  20. width: 640
  21. height: 480
  22. color: "green"
  23.  
  24. Entity
  25. {
  26. id: rootEntity
  27.  
  28. Camera
  29. {
  30. id: mainCamera
  31. projectionType: CameraLens.PerspectiveProjection
  32. fieldOfView: 60.0
  33. aspectRatio: 16.0 / 9.0
  34. nearPlane: 0.1
  35. farPlane: 1000.0
  36. position: Qt.vector3d(0.0, 0.0, 40.0)
  37. upVector: Qt.vector3d(0.0, 1.0, 0.0)
  38. viewCenter: Qt.vector3d(0.0, 0.0, 0.0)
  39. }
  40.  
  41. TorusMesh
  42. {
  43. id: torusMesh
  44. radius: 15.0
  45. minorRadius: 6.0
  46. slices: 16
  47. rings: 32
  48. }
  49.  
  50. PhongMaterial
  51. {
  52. id: torusMaterial
  53. }
  54.  
  55. Transform
  56. {
  57. id: torusTransform
  58. translation: Qt.vector3d(0.0, 0.0, 0.0)
  59. }
  60.  
  61. components:
  62. [
  63. RenderSettings
  64. {
  65. activeFrameGraph: ForwardRenderer
  66. {
  67. clearColor: Qt.rgba(1, 1, 1, 1)
  68. camera: mainCamera
  69. }
  70. },
  71. InputSettings {}
  72. ]
  73.  
  74. Entity
  75. {
  76. id: torusEntity
  77. components: [torusMesh, torusMaterial, torusTransform]
  78. }
  79. }
  80. }
  81. }

Скрипт python который вызывает форму:

  1. from PyQt5.QtGui import QGuiApplication
  2. from PyQt5.QtQml import QQmlApplicationEngine
  3. from PyQt5.QtCore import QObject, pyqtSignal, pyqtSlot
  4.  
  5. if __name__ == "__main__":
  6. import sys
  7.  
  8. # создаём экземпляр приложения
  9. app = QGuiApplication(sys.argv)
  10. # создаём QML движок
  11. engine = QQmlApplicationEngine()
  12.  
  13. # загружаем файл qml в движок
  14. engine.load("Interface_vr_eyes.qml")
  15.  
  16. engine.quit.connect(app.quit)
  17. sys.exit(app.exec_())
  18.  

В конечном итоге, окно приложения отображается, зелёный прямоугольник отображается в нём, а вот 3д объект, который создаётся из видео-урока не появляется на экране. Подскажите, в чём может быть проблема?
P.S. а точно ли нет QtQuick3D для питона? Если есть, подскажите.
P.S.S ещё хотел бы знать, как загрузить свою модель сделанную в КОМПАС-3D/Blender3D. На этот вопрос ответ увидел, да, загружать модель из Blender3d в расширении obj можно.

Увидел в видео, что код вызова qml файла тоже немного переписан... Там создаётся уже как бы сцена для 3д объекта, а мне нужно вставить 3д обект в главную форму получается...
Что-то типа...

  1. import QtQuick 2.12
  2. import ... (т.д.)
  3.  
  4. //главное окно программы
  5. ApplicationWindow
  6. {
  7. id:general_win
  8. visible: true
  9. width: 1680
  10. height: 920
  11. title: qsTr("Test title")
  12.  
  13. //label
  14. //button
  15. //image
  16. //и т.д.
  17.  
  18. //блок с вращающейся 3д моделью
  19. Rectangle
  20. {
  21. id: mainwindow
  22. width: 640
  23. height: 480
  24. color: "green"
  25.  
  26. //описание видимости 3д модели
  27. }
  28.  
  29. }

Спасибо!

2

Вам это нравится? Поделитесь в социальных сетях!

11
Evgenii Legotckoi
  • 3 декабря 2019 г. 16:50

Так там не используется QML, но могу предположить, что у вас не установлен PyQt5.Qt3DCore и остальные соответствующие библиотеки

    qml_puthon_user
    • 3 декабря 2019 г. 17:04

    Установлено

    Устанавливал через pip3 install pyqt3d

      qml_puthon_user
      • 3 декабря 2019 г. 17:06
      • (ред.)

      Да, в примере не используется QML, подумал, что от туда хоть как-то можно оттолкнуться.
      Если из видео, в первом сообщении, пример рабочий для python. То проблема стоит в том, что я не могу вызвать qml файл из python.

        qml_puthon_user
        • 3 декабря 2019 г. 19:01
        • (ред.)

        У меня даже нет предложения о "setSource", как в видео...

        setSource наблюдаю пока что только в QSceneLoader()

          qml_puthon_user
          • 3 декабря 2019 г. 19:54

          Реализация безнадёжна? :)

            Evgenii Legotckoi
            • 3 декабря 2019 г. 19:57
            • (ред.)

            У нас с вами разница во времени скорее всего достаточно большая, поскольку я в Праге проживаю. Так что не кипишуйте. Мне сегодня ещё долго работать. Да и тут узнал, что вечером корпоратив, даты которого я перепутал. Так что наберитесь терпения )))

              qml_puthon_user
              • 3 декабря 2019 г. 20:06

              Пардон.) Буду ждать и экспериментировать.)

                qml_puthon_user
                • 3 декабря 2019 г. 23:18

                Полазил я по файлам Qt Design Studio, нашёл там библиотеку QtQuick3D и остальные. Сверил с файлами, которые есть у самого питона в site-packages и увидел, что да, у питона нет папки QtQuick3D. Как я понял, для вызова этой библиотеки нужен файл питона с расширением .pyd, который может называться QtQuick3D.pyd(почему так? решил из того, что есть файл QtQuick.pyd :)).

                Я не смог осилить написать зависимости, чтобы на питоне запустить QtQuick3D. Если хотите, можете попробовать. :) А так, остаётся ждать от разработчика Riverbank.
                Riverbank | Software | PyQt | What is PyQt?

                  Evgenii Legotckoi
                  • 5 декабря 2019 г. 2:38
                  • Ответ был помечен как решение.

                  Я посмотрел то видео, и сравнил с вашим кодом. У вас не запускается 3D потому, что вы не используете Qt3DQuickWindow, а используете обычный QML engine. В этом проблема, чтобы вообще 3D заработало. Но вашем случае это не получится запустить потому, что Qt3DQuickWindow отсутствует в PyQt5. Так что нужно изучать C++ ;-)

                    qml_puthon_user
                    • 5 декабря 2019 г. 9:07

                    Спасибо за помощь! :) Я попытаю надежды в ожидании QtQuick3D от Riverbank'a. :)

                      Комментарии

                      Только авторизованные пользователи могут публиковать комментарии.
                      Пожалуйста, авторизуйтесь или зарегистрируйтесь