Вопрос или проблема
Я пытаюсь загрузить 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.