[Interest] Qt3D Entity tree for loaded object with SceneLoader
doe at john-online.info
doe at john-online.info
Fri May 19 17:53:43 CEST 2017
Hi,
I use Qt5.8 Qt3D2 C++ API and load a 3d file with
Qt3DRender::sceneLoader (e.g. ply or .obj).
I can see it in my view; works fine.
However, now I want to read (copy, modify) the geometry, materials etc.
that come with this loaded object.
Unfortunately, in the entity tree m_rootEntity->components()
there appears only one component with the url as referrer
There is no component with any geometry and/or material, etc.
Same happens, if I explicitly look for entities, buffers, materials,
etc by casting via
"myEntity->findChildren<QGeometryRenderer *>()" and similar.
All this works fine, when I create my own mesh via vertexBuffers and
indexBuffers attributes, add material etc.
I spent days now investigating this with loaded objects.
Also tried mesh->setSource(url) but same result, except that I even
don't get it visible in the view.
I dont know how to access the internals of the model (geometry,
material, transformations).
In the sparse docu of scene loader it is indicated that:
"Given a 3D source file, the Qt3DRender::QSceneLoader will try to
parse it and build a tree of Qt3DCore::QEntity objects with proper
Qt3DRender::QGeometryRenderer, Qt3DCore::QTransform and
Qt3DRender::QMaterial components."
=> How? Where is this tree? There have been some similar questions on
stackoverflow as well. No answer yet.
Is the tree deleted after transferring it to the graphics card?
It also does not matter whether I access the entity tree before or
after show() although it seems that reading is triggered only the time
the show() command is executed.
Here is the code snippets I use:
mainwindow.h
class MainWindow : public QMainWindow
{
Q_OBJECT
public: ...
private:
Qt3DExtras::Qt3DWindow *view = new Qt3DExtras::Qt3DWindow();
Qt3DCore::QEntity *m_meshEntity = new Qt3DCore::QEntity(nullptr);;
Qt3DCore::QEntity *m_rootEntity;
...
mainwindow.cpp
...
m_meshEntity = new Qt3DCore::QEntity();
m_rootEntity = new Qt3DCore::QEntity();
Qt3DRender::QSceneLoader *loader = new
Qt3DRender::QSceneLoader(m_meshEntity);
QString fileName = "../3dModels/globe2.obj";
QUrl url = QUrl::fromLocalFile(fileName);
QObject::connect(loader, &Qt3DRender::QSceneLoader::statusChanged,
this,
[](Qt3DRender::QSceneLoader::Status s){ qDebug() << s; return false;});
loader->setSource(url);
m_meshEntity->addComponent(loader);
m_meshEntity->setParent(m_rootEntity);
view->setRootEntity(m_rootEntity);
view->show();
Any ideas? I hope I have just missed something...
More information about the Interest
mailing list