如何从 Qt 5.9 中的任何目录渲染 .obj 文件

How to render .obj files from any directory in Qt 5.9

我正在尝试使用 Qt3D 库将 .obj 文件加载到 Qt 中。到目前为止,我的这段代码主要是从以下示例之一复制而来的:

Qt3DCore::QEntity *createScene()
{
    // Root entity
    Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity;

    // Material
    Qt3DRender::QMaterial *material = new Qt3DExtras::QPhongMaterial(rootEntity);

    // Chest Entity
    Qt3DCore::QEntity *chestEntity = new Qt3DCore::QEntity(rootEntity);
    Qt3DRender::QMesh *chestMesh = new Qt3DRender::QMesh(rootEntity);
    chestMesh->setSource(QUrl("qrc:/PT18E.obj"));

    chestEntity->addComponent(chestMesh);
    chestEntity->addComponent(material);

    return rootEntity;
}

int main(int argc, char* argv[])
{
    QGuiApplication app(argc, argv);
    Qt3DExtras::Qt3DWindow view;

    Qt3DCore::QEntity *scene = createScene();

    // Camera
    Qt3DRender::QCamera *camera = view.camera();
    camera->lens()->setPerspectiveProjection(45.0f, 16.0f/9.0f, 0.1f, 1000.0f);
    camera->setPosition(QVector3D(0, 0, 1));
    camera->setViewCenter(QVector3D(0, 0, 0));

    // For camera controls
    Qt3DExtras::QOrbitCameraController *camController = new Qt3DExtras::QOrbitCameraController(scene);
    camController->setLinearSpeed( 10.0f );
    camController->setLookSpeed( 180.0f );
    camController->setCamera(camera);

    view.setRootEntity(scene);
    view.show();

    return app.exec();
}

至此,应用程序可以渲染并显示对象。但是,我必须将 .obj 文件附加到 qrc 文件,以便它能够找到并呈现它。当我尝试使用来自任何目录的绝对路径设置 chestMesh 的源代码时,例如

chestMesh->setSource(QURL(C:/Users/username/Documents/Qt/simple-cpp/PT18E.obj))

它不起作用。什么都没有呈现,我在控制台中看到错误

QFSFileEngine::open: No file name specified

我已经尝试将完全相同的路径添加到 QFile 对象并使用 exists 函数查看路径是否正确,果然如此。但出于某种原因,网格无法使用不在 qrc 文件中的源。

如何在 Qt 中加载和渲染文件系统中的任何 .obj 文件(无需将其放入 qrc 中)?

为了编写指向文件的正确 url,我们可以尝试静态调用 QUrl::fromLocalFile。或者给出上面的代码:

chestMesh->setSource(QUrl::fromLocalFile(winPath2ObjFile));