Any insight ? On Wed, 3 Aug 2022 at 15:44, Nicholas Yue <yue.nicho...@gmail.com> wrote:
> I have the following code > > ``` > void SceneWalker::walkEntity(Qt3DCore::QEntity *e, int depth) > { > Qt3DCore::QNodeVector nodes = e->childNodes(); > for (int i = 0; i < nodes.count(); ++i) { > Qt3DCore::QNode *node = nodes[i]; > Qt3DCore::QEntity *entity = qobject_cast<Qt3DCore::QEntity > *>(node); > if (entity) { > QString indent; > indent.fill(' ', depth * 2); > qDebug().noquote() << indent << "Entity:" << entity << > "Components:" << entity->components(); > > { > // Question about BoundingVolume > qDebug() << "BoundingVolume: " << entity->objectName(); > const QList<Qt3DRender::QGeometryRenderer *> > myQGeometryRenderer = > entity->componentsOfType<Qt3DRender::QGeometryRenderer>(); > if (!myQGeometryRenderer.isEmpty()) > { > Qt3DRender::QGeometryRenderer *gr = myQGeometryRenderer[0]; > QVector3D minPoint = gr->implicitMinPoint(); > QVector3D maxPoint = gr->implicitMaxPoint(); > qDebug() << "minPoint: " << minPoint; > qDebug() << "maxPoint: " << maxPoint; > } > } > walkEntity(entity, depth + 1); > } > } > } > ``` > > But I got the (0,0,0) for both the min/max point > > ``` > Status changed: Qt3DRender::QSceneLoader::Loading > Status changed: Qt3DRender::QSceneLoader::Ready > Entity: Qt3DCore::QEntity(0x7f65dc004660, name = untitled.obj) > Components: QList(Qt3DCore::QTransform(0x7f65dc04c590)) > Entity: Qt3DCore::QEntity(0x7f65dc019220, name = Suzanne) Components: > QList(Qt3DExtras::QPhongMaterial(0x7f65dc01bf30, name = DefaultMaterial), > Qt3DRender::QGeometryRenderer(0x7f65dc00c4d0), > Qt3DCore::QTransform(0x7f65dc045800)) > BoundingVolume: "Suzanne" > minPoint: QVector3D(0, 0, 0) > maxPoint: QVector3D(0, 0, 0) > BoundingVolume: "untitled.obj" > ``` > > I am using Qt 6.2.2 on Ubuntu > > Cheers > > On Wed, 3 Aug 2022 at 01:25, Mike Krus <mike.k...@kdab.com> wrote: > >> Hi >> >> once the scene is loaded (ie, the status is Ready, keeping in mind >> loading is asynchronous), you can use >> QSceneLoader::entity() to get a loaded entity by name, and then >> QEntity::componentsOfType() to get the component. >> Loaded entities are children of the entity that the QSceneLoader >> component was assigned to, and components and >> entities are all QObjects so you can use the normal tree traversal >> techniques that work with any QObject to find >> objects by type or name. >> >> >> Mike >> >> > On 3 Aug 2022, at 00:14, Nicholas Yue <yue.nicho...@gmail.com> wrote: >> > >> > Thank you Mike. >> > >> > Follow up question: >> > >> > Given a >> > >> > ``` >> > Qt3DRender::QSceneLoader *sceneLoader; >> > ``` >> > >> > How do we get at this QGeometryRenderer object to be able to call the >> impliciteMinPoint (), impliciteMaxPoint () properties ? >> > >> > Cheers >> > >> > On Tue, 2 Aug 2022 at 05:56, Mike Krus <mike.k...@kdab.com> wrote: >> > Hi >> > >> > if you are using Qt6, then yes. >> > >> > For a specific object, QGeometryRenderer derives from QBoundingVolume >> which has impliciteMinPoint and impliciteMaxPoint properties. >> > >> > If you’re interested in the bounding volume of a portion of the scene >> graph, all a QBoundingVolume component at the root and the >> > same properties will be updated. >> > >> > In Qt5, the QGeometry node associated with each render has similar >> min/max properties (note that they only valid if the mesh uses all the >> geometry). >> > >> > Hope this helps, >> > >> > Mike >> > >> > >> > > On 1 Aug 2022, at 16:05, Nicholas Yue <yue.nicho...@gmail.com> wrote: >> > > >> > > Hi, >> > > >> > > I am diving into the geometry scene via QSceneLoader. >> > > >> > > Using the following code as a starting point, I wish to place the >> camera such that it automatically accommodates scenes of different sizes. >> > > >> > > One way I am thinking of doing is to base on the scene geometry >> bounding box. >> > > >> > > Is there a method or API which I can call to query the entire scene >> geometry bounding box ? Or do I have to walk the entire scene to build that >> up by querying the bounding box for every geometry in the scene ? >> > > >> > > Any sample code I can view to get me going ? >> > > >> > > ``` >> > > >> /**************************************************************************** >> > > ** >> > > ** Copyright (C) 2015 Klaralvdalens Datakonsult AB (KDAB). >> > > ** Contact: https://www.qt.io/licensing/ >> > > ** >> > > ** This file is part of the Qt3D module of the Qt Toolkit. >> > > ** >> > > ** $QT_BEGIN_LICENSE:BSD$ >> > > ** Commercial License Usage >> > > ** Licensees holding valid commercial Qt licenses may use this file in >> > > ** accordance with the commercial license agreement provided with the >> > > ** Software or, alternatively, in accordance with the terms contained >> in >> > > ** a written agreement between you and The Qt Company. For licensing >> terms >> > > ** and conditions see https://www.qt.io/terms-conditions. For further >> > > ** information use the contact form at https://www.qt.io/contact-us. >> > > ** >> > > ** BSD License Usage >> > > ** Alternatively, you may use this file under the terms of the BSD >> license >> > > ** as follows: >> > > ** >> > > ** "Redistribution and use in source and binary forms, with or without >> > > ** modification, are permitted provided that the following conditions >> are >> > > ** met: >> > > ** * Redistributions of source code must retain the above copyright >> > > ** notice, this list of conditions and the following disclaimer. >> > > ** * Redistributions in binary form must reproduce the above >> copyright >> > > ** notice, this list of conditions and the following disclaimer in >> > > ** the documentation and/or other materials provided with the >> > > ** distribution. >> > > ** * Neither the name of The Qt Company Ltd nor the names of its >> > > ** contributors may be used to endorse or promote products derived >> > > ** from this software without specific prior written permission. >> > > ** >> > > ** >> > > ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS >> > > ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT >> > > ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS >> FOR >> > > ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE >> COPYRIGHT >> > > ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, >> INCIDENTAL, >> > > ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT >> > > ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF >> USE, >> > > ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON >> ANY >> > > ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT >> > > ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE >> USE >> > > ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH >> DAMAGE." >> > > ** >> > > ** $QT_END_LICENSE$ >> > > ** >> > > >> ****************************************************************************/ >> > > >> > > #include <QFileDialog> >> > > #include <QApplication> >> > > >> > > #include <Qt3DRender/QCamera> >> > > #include <Qt3DCore/QEntity> >> > > #include <Qt3DCore/QAspectEngine> >> > > #include <Qt3DInput/QInputAspect> >> > > #include <Qt3DRender/QSceneLoader> >> > > #include <Qt3DRender/QRenderAspect> >> > > #include <Qt3DExtras/QForwardRenderer> >> > > #include <Qt3DExtras/qt3dwindow.h> >> > > // #include <Qt3DExtras/qfirstpersoncameracontroller.h> >> > > #include "MyCameraController.h" >> > > #include "TrackballCameraController.h" >> > > >> > > class SceneWalker : public QObject >> > > { >> > > public: >> > > SceneWalker(Qt3DRender::QSceneLoader *loader) : m_loader(loader) >> { } >> > > >> > > void onStatusChanged(); >> > > >> > > private: >> > > void walkEntity(Qt3DCore::QEntity *e, int depth = 0); >> > > >> > > Qt3DRender::QSceneLoader *m_loader; >> > > }; >> > > >> > > void SceneWalker::onStatusChanged() >> > > { >> > > qDebug() << "Status changed:" << m_loader->status(); >> > > if (m_loader->status() != Qt3DRender::QSceneLoader::Ready) >> > > return; >> > > >> > > // The QSceneLoader instance is a component of an entity. The >> loaded scene >> > > // tree is added under this entity. >> > > QVector<Qt3DCore::QEntity *> entities = m_loader->entities(); >> > > >> > > // Technically there could be multiple entities referencing the >> scene loader >> > > // but sharing is discouraged, and in our case there will be one >> anyhow. >> > > if (entities.isEmpty()) >> > > return; >> > > Qt3DCore::QEntity *root = entities[0]; >> > > // Print the tree. >> > > walkEntity(root); >> > > >> > > // To access a given node (like a named mesh in the scene), use >> QObject::findChild(). >> > > // The scene structure and names always depend on the asset. >> > > Qt3DCore::QEntity *e = root->findChild<Qt3DCore::QEntity >> *>(QStringLiteral("PlanePropeller_mesh")); // toyplane.obj >> > > if (e) >> > > qDebug() << "Found propeller node" << e << "with components" >> << e->components(); >> > > } >> > > >> > > void SceneWalker::walkEntity(Qt3DCore::QEntity *e, int depth) >> > > { >> > > Qt3DCore::QNodeVector nodes = e->childNodes(); >> > > for (int i = 0; i < nodes.count(); ++i) { >> > > Qt3DCore::QNode *node = nodes[i]; >> > > Qt3DCore::QEntity *entity = qobject_cast<Qt3DCore::QEntity >> *>(node); >> > > if (entity) { >> > > QString indent; >> > > indent.fill(' ', depth * 2); >> > > qDebug().noquote() << indent << "Entity:" << entity << >> "Components:" << entity->components(); >> > > walkEntity(entity, depth + 1); >> > > } >> > > } >> > > } >> > > >> > > int main(int ac, char **av) >> > > { >> > > QApplication app(ac, av); >> > > Qt3DExtras::Qt3DWindow view; >> > > view.defaultFrameGraph()->setClearColor(Qt::black); >> > > >> > > // Root entity >> > > Qt3DCore::QEntity *sceneRoot = new Qt3DCore::QEntity(); >> > > >> > > // Scene Camera >> > > Qt3DRender::QCamera *camera = view.camera(); >> > > >> camera->setProjectionType(Qt3DRender::QCameraLens::PerspectiveProjection); >> > > camera->setViewCenter(QVector3D(0.0f, 3.5f, 0.0f)); >> > > camera->setPosition(QVector3D(0.0f, 3.5f, 25.0f)); >> > > camera->setNearPlane(0.001f); >> > > camera->setFarPlane(10000.0f); >> > > >> > > // For camera controls >> > > // Qt3DExtras::QFirstPersonCameraController *camController = new >> Qt3DExtras::QFirstPersonCameraController(sceneRoot); >> > > TrackballCameraController *camController = new >> TrackballCameraController(sceneRoot); >> > > camController->setWindowSize(QSize(view.width(),view.height())); >> // >> https://github.com/cjmdaixi/Qt3DTrackball/issues/1#issuecomment-544183228 >> > > camController->setCamera(camera); >> > > >> > > // Scene loader >> > > Qt3DCore::QEntity *sceneLoaderEntity = new >> Qt3DCore::QEntity(sceneRoot); >> > > Qt3DRender::QSceneLoader *sceneLoader = new >> Qt3DRender::QSceneLoader(sceneLoaderEntity); >> > > SceneWalker sceneWalker(sceneLoader); >> > > QObject::connect(sceneLoader, >> &Qt3DRender::QSceneLoader::statusChanged, &sceneWalker, >> &SceneWalker::onStatusChanged); >> > > sceneLoaderEntity->addComponent(sceneLoader); >> > > >> > > QStringList args = QCoreApplication::arguments(); >> > > QUrl sourceFileName; >> > > if (args.count() <= 1) { >> > > QWidget *container = new QWidget(); >> > > QFileDialog dialog; >> > > dialog.setFileMode(QFileDialog::AnyFile); >> > > sourceFileName = dialog.getOpenFileUrl(container, >> QStringLiteral("Open a scene file")); >> > > } else { >> > > sourceFileName = QUrl::fromLocalFile(args[1]); >> > > } >> > > >> > > if (sourceFileName.isEmpty()) >> > > return 0; >> > > >> > > sceneLoader->setSource(sourceFileName); >> > > >> > > view.setRootEntity(sceneRoot); >> > > view.show(); >> > > >> > > return app.exec(); >> > > } >> > > ``` >> > > >> > > Cheers >> > > -- >> > > Nicholas Yue >> > > https://www.linkedin.com/in/nicholasyue/ >> > > _______________________________________________ >> > > Interest mailing list >> > > Interest@qt-project.org >> > > https://lists.qt-project.org/listinfo/interest >> > >> > — >> > Mike Krus | mike.k...@kdab.com | Senior Software Engineer & Teamlead >> > KDAB (UK) Ltd., a KDAB Group company >> > Tel: UK Office +44 1625 809908 Mobile +44 7833 491941 >> > KDAB - The Qt Experts, C++, OpenGL Experts >> > >> > >> > >> > >> > -- >> > Nicholas Yue >> > https://www.linkedin.com/in/nicholasyue/ >> >> — >> Mike Krus | mike.k...@kdab.com | Senior Software Engineer & Teamlead >> KDAB (UK) Ltd., a KDAB Group company >> Tel: UK Office +44 1625 809908 Mobile +44 7833 491941 >> KDAB - The Qt Experts, C++, OpenGL Experts >> >> >> > > -- > Nicholas Yue > https://www.linkedin.com/in/nicholasyue/ > -- Nicholas Yue https://www.linkedin.com/in/nicholasyue/
_______________________________________________ Interest mailing list Interest@qt-project.org https://lists.qt-project.org/listinfo/interest