kot
kot

Reputation: 9

A 3D model uploaded from an OBJ file is not displayed

I'm trying to load a 3D model from an OBJ file. Qt seems to load it, judging by the change in the status of the SceneLoader, but it does not display it in the scene.

In the constructor of the class My3DScene, I am trying to create a scene with a 3D model. The code is provided below.

#include "my3dscene.h"

My3DScene::My3DScene(Qt3DCore::QEntity *parent){

    this->camera = this->view.camera();
    this->mpl = new MyPointLight(parent);

    this->objectEntity = new Qt3DCore::QEntity(parent);
    this->sceneLoader = new Qt3DRender::QSceneLoader(objectEntity);
    this->mesh = new Qt3DRender::QMesh();
    this->planeMaterials = new Qt3DExtras::QPhongMaterial(objectEntity);
    this->objectTransform = new Qt3DCore::QTransform(objectEntity);
    

    this->camera->lens()->setPerspectiveProjection(
        60.0f,
        (float)view.width()/(float)view.height(),
        0.1f,
        1000.0f
        );
    this->camera->setPosition(QVector3D(0.0f, 0.0, 40.0));
    this->camera->setViewCenter(QVector3D(0.0f, 0.0f, 0.0f));
    this->view.setRootEntity(parent);

    this->sceneLoader->setSource(QUrl("pathToFileModel/plane.obj"));
    //this->mesh->setSource(QUrl::fromLocalFile("pathToFileModel/plane.obj"));
    
    this->planeMaterials->setDiffuse(QColor(0, 0, 0));
    this->objectTransform->setTranslation(QVector3D(0.0,0.0,0.0));
    this->objectTransform->setScale(0.1f);

    this->objectEntity->addComponent(this->sceneLoader);
    this->objectEntity->addComponent(this->planeMaterials);
    this->objectEntity->addComponent(this->objectTransform);


    QObject::connect(sceneLoader, &Qt3DRender::QSceneLoader::statusChanged, [](Qt3DRender::QSceneLoader::Status status) {
        switch (status) {
        case  Qt3DRender::QSceneLoader::None:
            qDebug() << "Статус: None (загрузчик не активен)";
            break;
        case  Qt3DRender::QSceneLoader::Loading:
            qDebug() << "Статус: Loading (загрузка в процессе)";
            break;
        case  Qt3DRender::QSceneLoader::Ready:
            qDebug() << "Статус: Ready (загрузка завершена успешно)";
            break;
        case  Qt3DRender::QSceneLoader::Error:
            qDebug() << "Статус: Error (ошибка при загрузке)";
            break;
        }
    });
}

My3DScene::~My3DScene(){

    delete this->sceneLoader;
    delete this->mesh;
    delete this->objectTransform;
    delete this->objectEntity;
    delete this->camera;
    delete this->mpl;
    delete this->orbitCamContr;
}

void My3DScene::viewScene(){

    this->view.show();
}

I tried using both a file that I created myself and one downloaded from the Internet. The result is the same. The situation is similar when trying to load a model via Mesh. I am using Qt version 6.8.

As a model from the internet, I used this one: https://www.cgtrader.com/free-3d-models/aircraft/private-aircraft/low-poly-plane-eba9c78a-8aa6-47b9-ae47-e56b13bd7411

Class:

my3dscene.h:

#ifndef MY3DSCENE_H
#define MY3DSCENE_H

#include <Qt3DCore>
#include <Qt3DRender>
#include <Qt3DExtras>
#include <QUrl>

#include "mypointlight.h"

class My3DScene
{
private:

    Qt3DExtras::Qt3DWindow view;
    Qt3DRender::QCamera *camera {nullptr};
    MyPointLight* mpl {nullptr};
    Qt3DExtras::QOrbitCameraController* orbitCamContr {nullptr};

    Qt3DCore::QEntity *objectEntity {nullptr};
    Qt3DRender::QSceneLoader *sceneLoader {nullptr};
    Qt3DRender::QMesh *mesh {nullptr};
    Qt3DExtras::QPhongMaterial *planeMaterials {nullptr};
    Qt3DCore::QTransform *objectTransform {nullptr};

public:
    My3DScene(Qt3DCore::QEntity *parent = nullptr);
    ~My3DScene();

    void viewScene();

};

#endif 

main.cpp:

#include <QGuiApplication>
#include "my3dscene.h"

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity;
    My3DScene scene(rootEntity);

    scene.viewScene();
    return app.exec();
}

Upvotes: 0

Views: 32

Answers (0)

Related Questions