3D-модель, загруженная из файла OBJ, не отображается.

Вопрос или проблема

Я пытаюсь загрузить 3D модель из файла OBJ. Похоже, что Qt загружает его, судя по изменению статуса SceneLoader, но он не отображается на сцене.

В конструкторе класса My3DScene я пытаюсь создать сцену с 3D моделью. Код представлен ниже.

#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();
}

Я пробовал использовать как файл, который я создал сам, так и файл, загруженный из Интернета. Результат одинаковый. Ситуация аналогична при попытке загрузить модель через Mesh. Я использую версию Qt 6.8.

В качестве модели из интернета я использовал следующую: https://www.cgtrader.com/free-3d-models/aircraft/private-aircraft/low-poly-plane-eba9c78a-8aa6-47b9-ae47-e56b13bd7411

Класс:

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();
}

Ответ или решение

Чтобы разобраться с проблемой отображения 3D модели из файла OBJ в проекте на основе Qt3D, необходимо исследовать несколько ключевых аспектов вашего кода и конфигурации. Рассмотрим шаги, которые могут помочь решить данную проблему и обеспечить корректную загрузку и отображение модели.

1. Проверка пути к файлу

Первая и наиболее очевидная причина, по которой модель может не отображаться, это неправильный путь к файлу. Убедитесь, что QUrl("pathToFileModel/plane.obj") указывает на правильное местоположение файла. Возможно, вам нужно использовать QUrl::fromLocalFile, чтобы указать абсолютный путь, например:

this->sceneLoader->setSource(QUrl::fromLocalFile("C:/путь/к/вашему/файлу/plane.obj"));

2. Проверка статуса загрузчика

Ваш код правильно включает обработчик изменений статуса загрузчика:

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;
    }
});

Обратите внимание на вывод в консоль. Если статус загрузчика показывает ошибку, необходимо исправить ошибки в самом файле OBJ или убедиться, что все необходимые текстуры и материалы также доступны и корректно настроены.

3. Проблемы масштабирования и положения

Вы устанавливаете трансформации для объекта, уменьшив масштаб, что может привести к тому, что объект будет слишком мал, чтобы быть заметным:

this->objectTransform->setScale(0.1f);

Попробуйте временно изменить масштаб на 1.0 и убедитесь, что объект действительно находится в пределах видимости камеры. Также проверьте позицию:

this->objectTransform->setTranslation(QVector3D(0.0, 0.0, 0.0));

Попробуйте сдвинуть объект немного вперед, установив более положительное значение по оси Z.

4. Параметры камеры

Вы правильно настраиваете параметры камеры, однако, убедитесь, что камера корректно инициализирована и действительно прикреплена к вашей сцене:

this->camera->setPosition(QVector3D(0.0f, 0.0f, 40.0));
this->camera->setViewCenter(QVector3D(0.0f, 0.0f, 0.0f));

Проверьте, что камера имеет правильную настройку, а объект находится в её поле зрения.

5. Использование материала

Вы также добавляете материал к модели. Убедитесь, что материал правильно настроен и соответствует загружаемому объекту. Можно временно попробовать использовать более простой материал для исключения проблем с текстурированием.

Заключение

Если вы следовали всем перечисленным рекомендациям, но 3D модель все еще не отображается, рекомендуется изучить файл OBJ на предмет ошибок, а также протестировать его в других 3D приложениях на предмет корректности. Кроме того, может быть полезно просмотреть логи или сообщения от Qt на предмет ошибок или предупреждений, связанных с загрузкой модели.

Таким образом, корректировав путь, параметры камеры и трансформации, а также изучив вывод статуса загрузки, вы сможете выявить и исправить причины неотображения 3D модели в вашем проекте на Qt3D.

Оцените материал
Добавить комментарий

Капча загружается...