如何从 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));
我正在尝试使用 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));