{"id":11713,"date":"2025-03-03T14:45:22","date_gmt":"2025-03-03T13:45:22","guid":{"rendered":"https:\/\/www.basyskom.de\/?p=11713"},"modified":"2025-03-03T14:46:38","modified_gmt":"2025-03-03T13:46:38","slug":"3d-rendering-solutions-in-qt-an-overview","status":"publish","type":"post","link":"https:\/\/www.basyskom.de\/en\/3d-rendering-solutions-in-qt-an-overview\/","title":{"rendered":"3D Rendering Solutions in Qt &#8211; an Overview"},"content":{"rendered":"<div data-elementor-type=\"wp-post\" data-elementor-id=\"11713\" class=\"elementor elementor-11713\" data-elementor-post-type=\"post\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b4c3c21 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"b4c3c21\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-1b7c080 elementor-widget elementor-widget-text-editor\" data-id=\"1b7c080\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Qt&#8217;s 3D offering is changing, so we decided to look at different options for rendering 3D content in Qt.<\/p>\n<p>Qt itself offers not one, but two 3D rendering engines: <a href=\"https:\/\/doc.qt.io\/qt-6\/qt3d-index.html\" target=\"_blank\" rel=\"noopener\">Qt 3D<\/a> from our friends at KDAB\u00a0and <a href=\"https:\/\/doc.qt.io\/qt-6\/qtquick3d-index.html\" target=\"_blank\" rel=\"noopener\">Qt Quick 3D<\/a>. While the former has been <a href=\"https:\/\/lists.qt-project.org\/pipermail\/development\/2024-March\/045127.html\" target=\"_blank\" rel=\"noopener\">removed as an official part of Qt<\/a> 6.9 onwards, the latter is only available under GPL and commercial licenses. Additionally, Qt Quick 3D is, as the name suggests, restricted to QML applications. If your application is based on QWidget, you have no choice but to look elsewhere.<\/p>\n<p>So we decided to test different 3D rendering solutions and how they integrate into the Qt world. To give a spoiler: There is no single perfect solution. The choice of framework always depends on the specific use case.<\/p>\n<p>Here, we investigate Coin 3D, Ogre, BGFX and Threepp. All of them are licensed permissively: Coin 3D and BGFX are licensed under BSD, Ogre and Threepp under MIT.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-7133a7e e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"7133a7e\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6819552 elementor-widget elementor-widget-heading\" data-id=\"6819552\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Coin 3D<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-f0fedf9 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"f0fedf9\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-33c2f1c elementor-widget elementor-widget-text-editor\" data-id=\"33c2f1c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><a href=\"https:\/\/www.coin3d.org\/\" target=\"_blank\" rel=\"noopener\">Coin 3D<\/a> is a graphics API with the stated goal of being fully compatible with Open Inventor &#8211; a toolkit that has its roots in the early 1990s when Silicon Graphics Inc. (SGI) designed it to offer an abstraction layer on top of OpenGL.<\/p>\n<p>Open Inventor, and therefore Coin 3D, manages all scene objects &#8211; primitives, but also lights, materials, transforms, the camera &#8211; in a scene graph object. The scene descriptions can be loaded from *.iv files. Coin 3D even comes with not one but two Qt integration APIs: SoQt and Quarter, where the latter is more current and the one that the developers recommend to use.<\/p>\n<p>The following is a minimal example that renders a simple coin object inside a Quarter QWidget.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-9e2e885 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"9e2e885\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d5a1ab1 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"d5a1ab1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre data-no-translation=\"\"><code class='language-cpp' data-no-translation=\"\">\/\/ https:\/\/www.coin3d.org\/quarter\/\n \n#include &lt;QApplication&gt;\n \n#include &lt;Inventor\/nodes\/SoCone.h&gt;\n#include &lt;Inventor\/nodes\/SoSphere.h&gt;\n#include &lt;Inventor\/nodes\/SoCube.h&gt;\n \n#include &lt;Inventor\/nodes\/SoSeparator.h&gt;\n#include &lt;Inventor\/nodes\/SoGroup.h&gt;\n \n#include &lt;Inventor\/nodes\/SoMaterial.h&gt;\n#include &lt;Inventor\/nodes\/SoPerspectiveCamera.h&gt;\n#include &lt;Inventor\/nodes\/SoDirectionalLight.h&gt;\n \n#include &lt;Inventor\/nodes\/SoTranslation.h&gt;\n#include &lt;Inventor\/nodes\/SoTransform.h&gt;\n#include &lt;Inventor\/nodes\/SoRotationXYZ.h&gt;\n \n#include &lt;Quarter\/Quarter.h&gt;\n#include &lt;Quarter\/QuarterWidget.h&gt;\n \nusing namespace Qt::StringLiterals;\nusing namespace SIM::Coin3D::Quarter;\n \nSoNode* createObjects()\n{\n \n    auto root = new SoSeparator;\n    root-&gt;ref();\n \n    auto camera = new SoPerspectiveCamera;\n \n \n    root-&gt;ref();\n    root-&gt;addChild(camera);\n    root-&gt;addChild(new SoDirectionalLight);\n \n    auto objGroup = new SoGroup();\n \n    auto coneMaterial = new SoMaterial;\n    coneMaterial-&gt;diffuseColor.setValue(0.5, 0.5, 0.0);\n    objGroup-&gt;addChild(coneMaterial);\n    objGroup-&gt;addChild(new SoCone());\n \n    auto sphereMaterial = new SoMaterial;\n    sphereMaterial-&gt;diffuseColor.setValue(0.7, 0.1, 0.1);\n    objGroup-&gt;addChild(sphereMaterial);\n    auto sphereTranslation = new SoTranslation;\n    sphereTranslation-&gt;translation.setValue(-3.0, 0.0, 0.0);\n    objGroup-&gt;addChild(sphereTranslation);\n    objGroup-&gt;addChild(new SoSphere());\n \n    auto boxMaterial = new SoMaterial;\n    boxMaterial-&gt;diffuseColor.setValue(0.1, 0.1, 0.75);\n    objGroup-&gt;addChild(boxMaterial);\n    auto boxTranslation = new SoTranslation;\n    boxTranslation-&gt;translation.setValue(3.0 * 2.0, 0.0, 0.0);\n    objGroup-&gt;addChild(boxTranslation);\n    objGroup-&gt;addChild(new SoCube());\n \n    SoRotationXYZ *yRotation = new SoRotationXYZ;\n    yRotation-&gt;axis = SoRotationXYZ::Y;\n    yRotation-&gt;angle = M_PI \/ 4.0;\n \n    SoRotationXYZ *xRotation = new SoRotationXYZ;\n    xRotation-&gt;axis = SoRotationXYZ::X;\n    xRotation-&gt;angle = M_PI \/ 8.0;\n \n    root-&gt;addChild(yRotation);\n    root-&gt;addChild(xRotation);\n \n    root-&gt;addChild(objGroup);\n \n    return root;\n}\n \nint main(int argc, char ** argv)\n{\n  QApplication app(argc, argv);\n \n  \/\/ Quater is Coins connection to Qt\n  Quarter::init();\n \n  auto rootNode = createObjects();\n  QuarterWidget * viewer = new QuarterWidget;\n  viewer-&gt;setSceneGraph(rootNode);\n  \/\/ Add some basic user interaction\n  viewer-&gt;setNavigationModeFile(QUrl(u&quot;coin:\/\/\/scxml\/navigation\/examiner.xml&quot;_s));\n \n  viewer-&gt;show();\n  app.exec();\n \n  \/\/ Clean\n  rootNode-&gt;unref();\n  delete viewer;\n  \n  Quarter::clean();\n  \n  return 0;\n} <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/www.basyskom.de\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-529c037 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"529c037\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-897c171 elementor-widget elementor-widget-image\" data-id=\"897c171\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"642\" height=\"509\" src=\"https:\/\/www.basyskom.de\/wp-content\/uploads\/2025\/03\/Coin_3D_Example_1.png\" class=\"attachment-large size-large wp-image-11716\" alt=\"basysKom, HMI Dienstleistung, Qt, Cloud, Azure\" srcset=\"https:\/\/www.basyskom.de\/wp-content\/uploads\/2025\/03\/Coin_3D_Example_1.png 642w, https:\/\/www.basyskom.de\/wp-content\/uploads\/2025\/03\/Coin_3D_Example_1-300x238.png 300w, https:\/\/www.basyskom.de\/wp-content\/uploads\/2025\/03\/Coin_3D_Example_1-15x12.png 15w, https:\/\/www.basyskom.de\/wp-content\/uploads\/2025\/03\/Coin_3D_Example_1-560x444.png 560w\" sizes=\"(max-width: 642px) 100vw, 642px\">\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-777cdc6 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"777cdc6\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a56b2d3 elementor-widget elementor-widget-text-editor\" data-id=\"a56b2d3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Coin 3D might be the right choice if you already have some knowledge of Open Inventor and if you are able to structure a scene by organizing multiple objects. Unfortunately, the <a href=\"https:\/\/github.com\/coin3d\/ivexamples\" target=\"_blank\" rel=\"noopener\">available examples<\/a> feel a bit outdated and, while possible, there is no clear path to loading meshes or tuning materials to achieve a nice-looking result. Also, rendering is always done via OpenGL, which is not state of the art.<\/p>\n<p>Nevertheless, Coin 3D is used in production: For an example of Coin 3D in use, you may want to have a look at the open source software FreeCAD (which, by t<span class=\"inline-comment-marker\" data-ref=\"35907dfd-5bc0-4938-956f-26099115f266\">he way, also uses Qt for its user interface.<\/span><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-ef88559 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"ef88559\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d80c7c8 elementor-widget elementor-widget-heading\" data-id=\"d80c7c8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Ogre 3D<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-9317ea6 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"9317ea6\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-fa1b2e1 elementor-widget elementor-widget-text-editor\" data-id=\"fa1b2e1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><a href=\"https:\/\/www.ogre3d.org\/\" target=\"_blank\" rel=\"noopener\">Ogre 3D<\/a> is a rendering engine generally used in games, but there are also examples for <a href=\"https:\/\/gazebosim.org\/showcase\" target=\"_blank\" rel=\"noopener\">robotic visualization<\/a> or <a href=\"https:\/\/github.com\/IRCAD\/sight#applications\" target=\"_blank\" rel=\"noopener\">medical applications<\/a>. It is plugin-driven: You can load backends for different graphics APIs like OpenGL (ES), Direct3D or Vulkan. Like Coin 3D, Ogre 3D relies on a scene graph structure. The actual implementation of the scene graph\u2019s data structure &#8211; whether the scene is organized in an Octree, a BSP tree or something else &#8211; is also managed through plugins. Ogre was initially released in 2005. Since then the graphics world has changed fundamentally, leading to a rewrite of Ogre 3D called Ogre Next to better fit the needs of modern graphics pipelines (minimize the driver overhead). Both the original Ogre 3D and Ogre Next are actively developed. You can find a comparison <a href=\"https:\/\/www.ogre3d.org\/about\/what-version-to-choose\" target=\"_blank\" rel=\"noopener\">here<\/a>.<\/p>\n<p>The original Ogre 3D has the advantage that, albeit sparsely documented, it comes with Qt integration. We provide an example of how to load and render a mesh in a QWidget using OgreBites::ApplicationContextQt.<\/p>\n<p>The header file:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-2a2320e e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"2a2320e\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-542f3f0 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"542f3f0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre data-no-translation=\"\"><code class='language-cpp' data-no-translation=\"\">#pragma once\n \n#include &lt;QWidget&gt;\n#include &lt;QPaintEvent&gt;\n \n#include &lt;Ogre.h&gt;\n#include &lt;OgreApplicationContextQt.h&gt;\n \nclass OgreWidget : public QWidget {\n    Q_OBJECT\n \npublic:\n    explicit OgreWidget(QWidget* parent = nullptr);\n    ~OgreWidget();\n \nprotected:\n    void paintEvent(QPaintEvent* e) override;\n \nprivate:\n    OgreBites::ApplicationContextQt m_ogreCtx;\n    Ogre::SceneManager* m_sceneManager;\n    Ogre::Viewport* m_viewport;\n    Ogre::Camera* m_camera;\n    Ogre::SceneNode* m_cameraNode;\n \n    void initialize();\n \n}; <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/www.basyskom.de\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-db36428 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"db36428\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-740c60c elementor-widget elementor-widget-text-editor\" data-id=\"740c60c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>And the source file:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-f80610a e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"f80610a\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7f40699 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"7f40699\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre data-no-translation=\"\"><code class='language-cpp' data-no-translation=\"\">#include &quot;OgreWidget.h&quot;\n \n#include &lt;QDir&gt;\n \nusing namespace Qt::StringLiterals;\n \nOgreWidget::OgreWidget(QWidget* parent)\n    : QWidget(parent)\n    , m_ogreCtx(&quot;QtOgreExample&quot;)\n{\n    setAttribute(Qt::WA_OpaquePaintEvent);\n    setAttribute(Qt::WA_NativeWindow);\n}\n \nOgreWidget::~OgreWidget()\n{\n \n}\n \nvoid OgreWidget::paintEvent(QPaintEvent* e)\n{\n    if(!m_ogreCtx.getRoot()) {\n        m_ogreCtx.injectMainWindow(windowHandle());\n        m_ogreCtx.useQtEventLoop(true);\n        m_ogreCtx.initApp();\n \n        initialize();\n \n        show();\n    }\n \n    m_ogreCtx.getRoot()-&gt;renderOneFrame();\n}\n \nvoid OgreWidget::initialize()\n{\n    \/\/ initialise Ogres resource system\n    Ogre::ResourceGroupManager::getSingleton().addResourceLocation(\n        QString(u&quot;\/%1\/assets&quot;_s).arg(QDir::currentPath()).toStdString(), &quot;FileSystem&quot;, &quot;General&quot;\n    );\n    Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();\n \n    \/\/ set Render system to GL\n    auto root = m_ogreCtx.getRoot();\n    Q_ASSERT(root);\n    const auto renderPlugin = QString(&quot;%1\/%2&quot;).arg(OGRE_DIR, u&quot;\/lib\/OGRE\/RenderSystem_GL.so&quot;_s);\n    root-&gt;loadPlugin(renderPlugin.toStdString());\n \n    m_sceneManager = root-&gt;createSceneManager(Ogre::SMT_DEFAULT);\n    m_camera = m_sceneManager-&gt;createCamera(&quot;mainCamera&quot;);\n    m_camera-&gt;setNearClipDistance(5.0);\n    m_camera-&gt;setFarClipDistance(1000.0);\n    m_camera-&gt;setAutoAspectRatio(true);\n \n    m_cameraNode = m_sceneManager-&gt;getRootSceneNode()-&gt;createChildSceneNode();\n    m_cameraNode-&gt;attachObject(m_camera);\n    m_cameraNode-&gt;setPosition(0.0, 0.0, 100.0);\n \n    auto shadergen = Ogre::RTShader::ShaderGenerator::getSingletonPtr();\n    shadergen-&gt;addSceneManager(m_sceneManager);\n \n    m_sceneManager-&gt;setAmbientLight(Ogre::ColourValue(0.5, 0.5, 0.5));\n \n    auto light = m_sceneManager-&gt;createLight(&quot;MainLight&quot;);\n    auto lightNode = m_sceneManager-&gt;getRootSceneNode()-&gt;createChildSceneNode();\n    lightNode-&gt;attachObject(light);\n    lightNode-&gt;setPosition(20, 80, 50);\n \n    auto mesh = m_sceneManager-&gt;createEntity(&quot;penguin.mesh&quot;);\n    auto meshNode = m_sceneManager-&gt;getRootSceneNode()-&gt;createChildSceneNode((Ogre::Vector3(0, 0, 0)));\n    meshNode-&gt;attachObject(mesh);\n \n    m_viewport = m_ogreCtx.getRenderWindow()-&gt;addViewport(m_camera);\n    m_viewport-&gt;setBackgroundColour(Ogre::ColourValue(0.0, 0.0, 0.0));\n    m_viewport-&gt;setClearEveryFrame(true);\n} <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/www.basyskom.de\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-b217614 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"b217614\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-dea9da6 elementor-widget elementor-widget-image\" data-id=\"dea9da6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"790\" height=\"634\" src=\"https:\/\/www.basyskom.de\/wp-content\/uploads\/2025\/03\/Ogre_Example_1.png\" class=\"attachment-large size-large wp-image-11715\" alt=\"basysKom, HMI Dienstleistung, Qt, Cloud, Azure\" srcset=\"https:\/\/www.basyskom.de\/wp-content\/uploads\/2025\/03\/Ogre_Example_1.png 790w, https:\/\/www.basyskom.de\/wp-content\/uploads\/2025\/03\/Ogre_Example_1-300x241.png 300w, https:\/\/www.basyskom.de\/wp-content\/uploads\/2025\/03\/Ogre_Example_1-768x616.png 768w, https:\/\/www.basyskom.de\/wp-content\/uploads\/2025\/03\/Ogre_Example_1-15x12.png 15w, https:\/\/www.basyskom.de\/wp-content\/uploads\/2025\/03\/Ogre_Example_1-560x449.png 560w\" sizes=\"(max-width: 790px) 100vw, 790px\">\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-68d76b3 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"68d76b3\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-3bb12de elementor-widget elementor-widget-text-editor\" data-id=\"3bb12de\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Mesh loading is more straightforward in Ogre than in Coin 3D. Since Ogre comes with its own mesh format (*.mesh), objects must either be converted first or developers have to come up with their own loading routines.\u00a0 Ogre is a framework that brings its own paradigms, its own resource system and a powerful language to define materials and compositing steps &#8211; therefore, it may feel a bit like leaving classical Qt standards (like Qt&#8217;s own internal way to load resources) behind. On the plus side, there are many examples and tutorials on the Internet &#8211;\u00a0 at least for the original Ogre 3D. For me it was a bit confusing to navigate having two incompatible Ogre versions. The reimplementation Ogre Next (or Ogre 2) brings modern rendering but omits the default way to integrate Qt.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-49df017 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"49df017\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a01a8af elementor-widget elementor-widget-heading\" data-id=\"a01a8af\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">BGFX<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-e2ea681 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"e2ea681\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-83db0b8 elementor-widget elementor-widget-text-editor\" data-id=\"83db0b8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>While Coin 3D and Ogre 3D\/Ogre Next are scene graph APIs, <a href=\"https:\/\/github.com\/bkaradzic\/bgfx\" target=\"_blank\" rel=\"noopener\">BGFX<\/a> is more low-level. It is not a rendering engine per se; its goal is to provide a wrapper around the most important modern graphics APIs like OpenGL (ES), DirectX11\/12, Vulkan, Metal and even WebGL via Wasm\/Emscripten. You must implement everything yourself: This includes setting up buffers and the graphics pipeline, defining shaders, loading textures etc. Speaking of shaders: Shaders in BGFX are written in a shader language which is based on GLSL and <a href=\"https:\/\/bkaradzic.github.io\/bgfx\/tools.html#shader-compiler-shaderc\" target=\"_blank\" rel=\"noopener\">compiled at build time<\/a>.<\/p>\n<p>With <a href=\"https:\/\/doc.qt.io\/qt-6\/qrhi.html\" target=\"_blank\" rel=\"noopener\">RHI<\/a> (Rendering Hardware Interface), Qt has a similar concept of wrapping platform-specific graphics APIs. So, you may ask why you should consider BGFX. RHI is even more low-level than BGFX. If you need full control and are not interested in high-level scene graph management but don&#8217;t want to wire <em>everything<\/em> yourself, BGFX might be something to look into.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-f30ed3e e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"f30ed3e\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4bb81d6 elementor-widget elementor-widget-heading\" data-id=\"4bb81d6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Threepp<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-2c3a9de e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"2c3a9de\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0c372b6 elementor-widget elementor-widget-text-editor\" data-id=\"0c372b6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>I have to confess that I really like the JavaScript library <a href=\"https:\/\/threejs.org\/\" target=\"_blank\" rel=\"noopener\">Three.js<\/a> which lets you quickly define 3D scenes. The good news is that <a href=\"https:\/\/github.com\/markaren\/threepp\" target=\"_blank\" rel=\"noopener\">Threepp<\/a> makes the API available for C++ developers. Since the rendering backend depends on OpenGL and embedding the api requires C++20, this may unfortunately be a showstopper for some. There is no official integration path with Qt, but it&#8217;s easy to render using a QOpenGLWidget as demonstrated in the following example.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-bcc0bda e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"bcc0bda\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a5e0a62 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"a5e0a62\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre data-no-translation=\"\"><code class='language-cpp' data-no-translation=\"\">#include &quot;ThreeppWidget.h&quot;\n \n#include &lt;QOpenGLContext&gt;\n \n#include &lt;QDir&gt;\n \nusing namespace Qt::StringLiterals;\n \nThreeppWidget::ThreeppWidget(QWidget* parent)\n    : QOpenGLWidget(parent)\n{\n \n}\n \nThreeppWidget::~ThreeppWidget()\n{\n \n}\n \nvoid ThreeppWidget::paintEvent(QPaintEvent* e)\n{\n    paintThreeppScene();\n}\n \nvoid ThreeppWidget::paintGL()\n{\n    paintThreeppScene();\n}\n \n void ThreeppWidget::resizeGL(int w, int h)\n{\n     if (!m_initialized) {\n        return;\n     }\n \n     auto aspect = w \/ h;\n \n     m_camera-&gt;aspect = aspect;\n     m_camera-&gt;updateProjectionMatrix();\n     m_renderer-&gt;setSize(std::make_pair( w, h));\n}\n \nvoid ThreeppWidget::initializeGL()\n{\n \n    if (m_initialized) {\n        return;\n    }\n \n    initializeOpenGLFunctions();\n \n    auto widgetSize = std::make_pair( width(), height());\n    auto aspect = width() \/ height();\n    m_renderer = std::make_shared&lt;threepp::GLRenderer&gt;(widgetSize);\n \n    m_scene = threepp::Scene::create();\n    m_camera = threepp::PerspectiveCamera::create(75, aspect, 0.1f, 1000);\n    m_camera-&gt;position.z = 5;\n \n    \/\/ create box\n    const auto boxGeometry = threepp::BoxGeometry::create();\n    const auto boxMaterial = threepp::MeshBasicMaterial::create();\n    boxMaterial-&gt;color.setRGB(1, 1, 0);\n    boxMaterial-&gt;opacity = 0.1f;\n    auto box = threepp::Mesh::create(boxGeometry, boxMaterial);\n    m_scene-&gt;add(box);\n \n    m_initialized = true;\n \n}\n \nvoid ThreeppWidget::paintThreeppScene()\n{\n    if (!m_initialized) {\n        qWarning() &lt;&lt; &quot;Cannot render scene: Not initialized&quot;;\n    }\n \n    makeCurrent();\n    glClearColor(0.5, 0.1, 0.2, 1);\n    m_renderer-&gt;clear();\n    m_renderer-&gt;render(*m_scene, *m_camera);\n} <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/www.basyskom.de\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-c3d6f8f e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"c3d6f8f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f316bd4 elementor-widget elementor-widget-text-editor\" data-id=\"f316bd4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\tCompared to the other libraries, Threepp is smaller in scope. While in recent years Three.js has grown to be a de-facto standard in the JavaScript world, Threepp has a smaller community. Qt integration has to be done with the help of QOpenGLWidget, as shown above. Still, due to its easy-to-use API and plenty of included examples, it might be a reasonable choice for demo applications.\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-feeee58 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"feeee58\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-94199f3 elementor-widget elementor-widget-heading\" data-id=\"94199f3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">What about RHI?<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-11f1258 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"11f1258\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4f66ded elementor-widget elementor-widget-text-editor\" data-id=\"4f66ded\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\tIf you need full control about the graphic stack and would like to stay in the Qt world, you may want to try RHI. Be warned, RHI has a steep <span class=\"inline-comment-marker\" data-ref=\"0129dfb2-5149-4c9c-92ef-3b82cb345364\">learning curve.<\/span> You have to write a lot of boilerplate code to even get a triangle on the screen. We have published a blog post how to get started <a href=\"https:\/\/www.basyskom.de\/en\/hello-rhi-how-to-get-started-with-qt-rhi\/\">here<\/a>.\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-402c18d e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"402c18d\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b767532 elementor-widget elementor-widget-heading\" data-id=\"b767532\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Guidance<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-62fe0eb e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"62fe0eb\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-580383e elementor-widget elementor-widget-text-editor\" data-id=\"580383e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>So you might ask, which library is the best for your needs. To conclude the blog post, we would like to give you a small guidance:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-4d3f994 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"4d3f994\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-de99805 elementor-widget elementor-widget-text-editor\" data-id=\"de99805\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><strong>I only need OpenGL. I have some 3D meshes I have to render in a CAD like setting, and I already used Open Inventor in the past:<\/strong> Coin 3D<\/p><p><strong>I have complex scenes and I would like to script the appearance of my 3D objects in a detailed fashion: <\/strong>Ogre 3D<\/p><p><strong>I have volume data (like in medical application): <\/strong>Ogre Next, (Coin 3D with extensions) or VTK (not covered in this post)<\/p><p><strong>I must load complex animations: <\/strong>Ogre 3D<\/p><p><strong>I want to create a quick demo application: <\/strong>Threepp<\/p><p><strong>I need full control over rendering, but RHI might be too low-level:<\/strong> BGFX<\/p><p><strong>I need full control, want to stay in the Qt ecosystem and I don&#8217;t mind about the steep learning curve:<\/strong> RHI<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-71b6f61 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"71b6f61\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c08b0f9 elementor-widget elementor-widget-text-editor\" data-id=\"c08b0f9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>If you have more questions, please feel free to contact us.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-8c5ae24 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"8c5ae24\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4578a48 elementor-widget elementor-widget-heading\" data-id=\"4578a48\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Conclusion<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-8489b4a e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"8489b4a\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-15782c6 elementor-widget elementor-widget-text-editor\" data-id=\"15782c6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>In this post, we have shown that there are plenty of 3D libraries outside the Qt world that can be easily integrated into Qt applications. The guidance in the last section gives an idea which library might fit into your application. Have you tried one of these libraries or have you worked with some other 3D rendering library together with Qt? Please let us know in the comments.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>Qt\u2019s 3D offering is changing, so we decided to look at different options for rendering 3D content in Qt.<\/p>","protected":false},"author":16,"featured_media":4011,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1,2,8],"tags":[],"class_list":["post-11713","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-allgemein","category-blog","category-qt"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.basyskom.de\/en\/wp-json\/wp\/v2\/posts\/11713","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.basyskom.de\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.basyskom.de\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.basyskom.de\/en\/wp-json\/wp\/v2\/users\/16"}],"replies":[{"embeddable":true,"href":"https:\/\/www.basyskom.de\/en\/wp-json\/wp\/v2\/comments?post=11713"}],"version-history":[{"count":10,"href":"https:\/\/www.basyskom.de\/en\/wp-json\/wp\/v2\/posts\/11713\/revisions"}],"predecessor-version":[{"id":11728,"href":"https:\/\/www.basyskom.de\/en\/wp-json\/wp\/v2\/posts\/11713\/revisions\/11728"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.basyskom.de\/en\/wp-json\/wp\/v2\/media\/4011"}],"wp:attachment":[{"href":"https:\/\/www.basyskom.de\/en\/wp-json\/wp\/v2\/media?parent=11713"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.basyskom.de\/en\/wp-json\/wp\/v2\/categories?post=11713"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.basyskom.de\/en\/wp-json\/wp\/v2\/tags?post=11713"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}