项目场景:
qt QMesh加载obj不显示
原因分析:
如果您在Qt中使用QMesh加载OBJ文件时遇到了显示问题,有几个可能的原因和解决方法:
-
检查文件路径:确保您提供的OBJ文件路径是正确的,并且文件存在于该位置。您可以使用绝对路径或相对路径来指定文件路径。
-
检查文件格式:确保OBJ文件的格式正确,并且文件没有损坏。您可以尝试使用其他软件或在线工具打开OBJ文件,以确保它可以正确显示。
-
检查文件内容:OBJ文件可能包含不受支持的功能或数据类型,导致无法正确加载和显示。您可以尝试使用其他OBJ文件进行测试,以确定问题是否与特定文件相关。
-
检查渲染设置:确保您的渲染设置正确配置。您可以检查是否正确设置了光照、材质和纹理等属性,以确保正确显示OBJ文件。
-
检查OpenGL版本:如果您使用的是较旧的OpenGL版本,可能会导致无法正确加载和显示OBJ文件。尝试更新您的OpenGL版本或使用兼容的OpenGL库。
-
检查错误消息:如果加载OBJ文件时发生错误,Qt可能会生成错误消息。检查错误消息以获取更多信息,并根据错误消息进行故障排除和修复。
-
检查OBJ文件路径:确保OBJ文件的路径是正确的。您可以尝试使用绝对路径来加载OBJ文件,例如file:///path/to/your/file.obj,并确保文件存在。
-
检查OBJ文件格式:确保OBJ文件的格式正确,并且文件没有损坏。您可以尝试使用其他的OBJ文件来验证加载是否正常。
-
检查模型的缩放和位置:请确保模型的缩放和位置设置正确,以便在3D视图中可见。您可以尝试调整setScale和setTranslation方法的参数来调整模型的大小和位置。
-
检查材质设置:您的代码中注释掉了设置材质的部分,如果您希望模型有颜色或纹理,请确保正确设置材质。
-
检查相机设置:请确保相机的位置和视角设置正确,以便正确观察模型。您可以尝试调整setPosition和setViewCenter方法的参数来调整相机的位置和视角。
-
检查光源设置:请确保光源设置正确,以便正确照亮模型。您可以尝试调整光源的位置和强度来调整光照效果。
解决方案:
- 先在线加载obj文件
在线加载链接: https://imagetostl.com/cn/view-obj-online
- 加载文件加入了qt资源当中
baserMesh->setSource(QUrl(“qrc:/arm/baser1.obj”));
使用qrc路径
3.注意视图的背景颜色,位置和缩放比例等等
//设置颜色
view->defaultFrameGraph()->setClearColor(QColor(QRgb(0xdcdcdc)));
- 我的模型会比较大,所以比例调的很小。以下是我的完整能显示的代码
#include "include/robotarm3d.h"
robotArm3D::robotArm3D(QWidget *parent) : QWidget(parent)
{
//创建3D视图
view = new Qt3DExtras::Qt3DWindow();
//设置颜色
view->defaultFrameGraph()->setClearColor(QColor(QRgb(0xdcdcdc)));
//一个widget 容纳3d视图
container = QWidget::createWindowContainer(view);
//获取视图的大小
QSize screenSize = view->screen()->size();
container->setMinimumSize(QSize(880, 580));//最小
container->setMaximumSize(screenSize);//最大
//界面布局水平-3D视图、垂直布局
widget = new QWidget(this);
// widget->setMinimumSize();
widget->isFullScreen();
QHBoxLayout *hLayout = new QHBoxLayout(widget);
QVBoxLayout *vLayout = new QVBoxLayout();
vLayout->setAlignment(Qt::AlignTop);
hLayout->addWidget(container, 1);
hLayout->addLayout(vLayout);
//设置标题
widget->setWindowTitle(QStringLiteral("基本图形"));
//3D场景的输入
Qt3DInput::QInputAspect *input = new Qt3DInput::QInputAspect;
view->registerAspect(input);
//根实体
Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity();
//获取3D视图的相机实体
Qt3DRender::QCamera *cameraEntity = view->camera();
//相机实体参数的设置
cameraEntity->setPosition(QVector3D(0, -400, 400)); //设置相机位置为(0, 0, 10)
cameraEntity->setViewCenter(QVector3D(0, 0, 0));//视角中心,相机观察点
cameraEntity->setFieldOfView(45.0);//相机视角45度
//光源实体->根实体
Qt3DCore::QEntity *lightEntity = new Qt3DCore::QEntity(rootEntity);
Qt3DRender::QPointLight *light = new Qt3DRender::QPointLight(lightEntity);
light->setColor("white");//设置白光
light->setIntensity(1);//光的强度
lightEntity->addComponent(light);
//变换 光的位置和相机位置一致
Qt3DCore::QTransform *lightTransform = new Qt3DCore::QTransform(lightEntity);
lightTransform->setTranslation(cameraEntity->position());
lightEntity->addComponent(lightTransform);
// For camera controls
Qt3DExtras::QFirstPersonCameraController *camController = new Qt3DExtras::QFirstPersonCameraController(rootEntity);
camController->setCamera(cameraEntity);
// ! 车身
Qt3DRender::QMesh *carbaseMesh = new Qt3DRender::QMesh();
carbaseMesh->setSource(QUrl("qrc:/arm/carbase.obj"));
carbaseMesh->setMeshName(tr("车身"));
qDebug() << carbaseMesh->status() << carbaseMesh->source() << endl;
//TorusMesh Transform
Qt3DCore::QTransform *carbaseTransform = new Qt3DCore::QTransform();
carbaseTransform->setScale(0.05f);
carbaseTransform->setRotation(QQuaternion::fromAxisAndAngle(QVector3D(0.0f, 1.0f, 0.0f), 0.0f));
carbaseTransform->setTranslation(QVector3D(0.0f, 0.0f, 0.0f));
//Material
Qt3DExtras::QPhongMaterial *carbaseMaterial = new Qt3DExtras::QPhongMaterial();
carbaseMaterial->setDiffuse(QColor(QRgb(0xbeb32b)));
//创建一个实体
Qt3DCore::QEntity *carbaseEntity = new Qt3DCore::QEntity(rootEntity);
carbaseEntity->addComponent(carbaseMesh);
carbaseEntity->addComponent(carbaseMaterial);
carbaseEntity->addComponent(carbaseTransform);
// ! 调平机构
Qt3DRender::QMesh *baserMesh = new Qt3DRender::QMesh();//Mesh
baserMesh->setSource(QUrl("qrc:/arm/baser1.obj"));
baserMesh->setMeshName(tr("箱体"));
qDebug() << baserMesh->status() << baserMesh->source() << endl;
//Mesh Transform
Qt3DCore::QTransform *baserTransform = new Qt3DCore::QTransform();
baserTransform->setScale(1.0f);
// baserTransform->setRotation(QQuaternion::fromAxisAndAngle(QVector3D(0.0f, 1.0f, 0.0f), 25.0f));
baserTransform->setTranslation(QVector3D(0.0f, 0.0f, 1429.66f));
//Material
Qt3DExtras::QPhongMaterial *baserMaterial = new Qt3DExtras::QPhongMaterial();
baserMaterial->setDiffuse(QColor(QRgb(0x00FF7F)));
//创建一个实体
Qt3DCore::QEntity *baserEntity = new Qt3DCore::QEntity(carbaseEntity);
baserEntity->addComponent(baserMesh);
baserEntity->addComponent(baserMaterial);
baserEntity->addComponent(baserTransform);
// ! 箱体
// ! 左边调平基座
Qt3DRender::QMesh *leftbr2Mesh = new Qt3DRender::QMesh();//Mesh
leftbr2Mesh->setSource(QUrl("qrc:/arm/left_br2.obj"));
leftbr2Mesh->setMeshName(tr("left_br2"));
qDebug() << leftbr2Mesh->status() << leftbr2Mesh->source() << endl;
//Mesh Transform
Qt3DCore::QTransform *leftbr2MeshTransform = new Qt3DCore::QTransform();
leftbr2MeshTransform->setScale(1.0f);
leftbr2MeshTransform->setRotation(QQuaternion::fromAxisAndAngle(QVector3D(0.0f, 0.0f, 1.0f), 180.0f));
leftbr2MeshTransform->setTranslation(QVector3D(-1150.0f, 0.0f, 300.0f));
//Material
Qt3DExtras::QPhongMaterial *leftbr2Material = new Qt3DExtras::QPhongMaterial();
leftbr2Material->setDiffuse(QColor(QRgb(0x00FF7F)));
//创建一个实体
Qt3DCore::QEntity *leftbr2Entity = new Qt3DCore::QEntity(baserMesh);
leftbr2Entity->addComponent(leftbr2Mesh);
leftbr2Entity->addComponent(leftbr2Material);
leftbr2Entity->addComponent(leftbr2MeshTransform);
// // ! j1
// Qt3DRender::QMesh *leftj1Mesh = new Qt3DRender::QMesh();//Mesh
// leftj1Mesh->setSource(QUrl("qrc:/arm/j1.obj"));
// leftj1Mesh->setMeshName(tr("leftj1"));
// qDebug() << leftj1Mesh->status() << leftj1Mesh->source() << endl;
// //Material
// Qt3DExtras::QPhongMaterial *leftj1Material = new Qt3DExtras::QPhongMaterial();
// leftj1Material->setDiffuse(QColor(QRgb(0xbeb32b)));
// //Mesh Transform
// Qt3DCore::QTransform *leftj1Transform = new Qt3DCore::QTransform();
// leftj1Transform->setScale(1.0f);
// leftj1Transform->setRotation(QQuaternion::fromAxisAndAngle(QVector3D(0.0f, 0.0f, 1.0f), 0.0f));
// leftj1Transform->setTranslation(QVector3D(250.0f, -285.0f, 78.0f));
// //创建一个实体
// Qt3DCore::QEntity *leftj1Entity = new Qt3DCore::QEntity(leftbr2Entity);
// leftj1Entity->addComponent(leftj1Mesh);
// leftj1Entity->addComponent(leftj1Material);
// leftj1Entity->addComponent(leftj1Transform);
// ! 右边调平基座
Qt3DRender::QMesh *rightbr2Mesh = new Qt3DRender::QMesh();//Mesh
rightbr2Mesh->setSource(QUrl("qrc:/arm/rig_br2.obj"));
rightbr2Mesh->setMeshName(tr("right_br2"));
qDebug() << rightbr2Mesh->status() << rightbr2Mesh->source() << endl;
//Mesh Transform
Qt3DCore::QTransform *rightbr2MeshTransform = new Qt3DCore::QTransform();
rightbr2MeshTransform->setScale(1.0f);
rightbr2MeshTransform->setRotation(QQuaternion::fromAxisAndAngle(QVector3D(0.0f, 1.0f, 0.0f), 0.0f));
rightbr2MeshTransform->setTranslation(QVector3D(1150.0f, 0.0f, 300.0f));
//Material
Qt3DExtras::QPhongMaterial *rightbr2Material = new Qt3DExtras::QPhongMaterial();
rightbr2Material->setDiffuse(QColor(QRgb(0x00FF7F)));
//创建一个实体
Qt3DCore::QEntity *rightbr2Entity = new Qt3DCore::QEntity(baserMesh);
rightbr2Entity->addComponent(rightbr2Mesh);
rightbr2Entity->addComponent(rightbr2Material);
rightbr2Entity->addComponent(rightbr2MeshTransform);
// ! j1
Qt3DRender::QMesh *j1Mesh = new Qt3DRender::QMesh();//Mesh
j1Mesh->setSource(QUrl("qrc:/arm/j1.obj"));
j1Mesh->setMeshName(tr("j1"));
qDebug() << j1Mesh->status() << j1Mesh->source() << endl;
//Material
Qt3DExtras::QPhongMaterial *j1Material = new Qt3DExtras::QPhongMaterial();
j1Material->setDiffuse(QColor(QRgb(0xbeb32b)));
//Mesh Transform
Qt3DCore::QTransform *j1Transform = new Qt3DCore::QTransform();
j1Transform->setScale(1.0f);
j1Transform->setRotation(QQuaternion::fromAxisAndAngle(QVector3D(0.0f, 1.0f, 0.0f), 0.0f));
j1Transform->setTranslation(QVector3D(250.0f, 285.0f, 78.0f));
//创建一个实体
Qt3DCore::QEntity *j1Entity = new Qt3DCore::QEntity(rightbr2Entity);
j1Entity->addComponent(j1Mesh);
j1Entity->addComponent(j1Material);
j1Entity->addComponent(j1Transform);
// ! j1
// ! j2
Qt3DRender::QMesh *j2Mesh = new Qt3DRender::QMesh();//Mesh
j2Mesh->setSource(QUrl("qrc:/arm/j2.obj"));
j2Mesh->setMeshName(tr("j2"));
qDebug() << j2Mesh->status() << j2Mesh->source() << endl;
//Material
Qt3DExtras::QPhongMaterial *j2Material = new Qt3DExtras::QPhongMaterial();
j2Material->setDiffuse(QColor(QRgb(0xbeb32b)));
//Mesh Transform
Qt3DCore::QTransform *j2Transform = new Qt3DCore::QTransform();
j2Transform->setScale(1.0f);
j2Transform->setRotation(QQuaternion::fromAxisAndAngle(QVector3D(0.0f, 1.0f, 0.0f), 0.0f));
j2Transform->setTranslation(QVector3D(-340.0f, 0.0f, 2428.0f));
//创建一个实体
Qt3DCore::QEntity *j2Entity = new Qt3DCore::QEntity(j1Entity);
j2Entity->addComponent(j2Mesh);
j2Entity->addComponent(j2Material);
j2Entity->addComponent(j2Transform);
// ! j2
// ! j3
Qt3DRender::QMesh *j3Mesh = new Qt3DRender::QMesh();//Mesh
j3Mesh->setSource(QUrl("qrc:/arm/j3.obj"));
j3Mesh->setMeshName(tr("j3"));
qDebug() << j3Mesh->status() << j3Mesh->source() << endl;
//Material
Qt3DExtras::QPhongMaterial *j3Material = new Qt3DExtras::QPhongMaterial();
j3Material->setDiffuse(QColor(QRgb(0xbeb32b)));
//Mesh Transform
Qt3DCore::QTransform *j3Transform = new Qt3DCore::QTransform();
j3Transform->setScale(1.0f);
j3Transform->setRotation(QQuaternion::fromAxisAndAngle(QVector3D(0.0f, 1.0f, 0.0f), 0.0f));
j3Transform->setTranslation(QVector3D(-546.0f, 0.0f, 183.0f));
//创建一个实体
Qt3DCore::QEntity *j3Entity = new Qt3DCore::QEntity(j2Entity);
j3Entity->addComponent(j3Mesh);
j3Entity->addComponent(j3Material);
j3Entity->addComponent(j3Transform);
// ! j3
// ! j4
Qt3DRender::QMesh *j4Mesh = new Qt3DRender::QMesh();//Mesh
j4Mesh->setSource(QUrl("qrc:/arm/j4.obj"));
j4Mesh->setMeshName(tr("j4"));
qDebug() << j4Mesh->status() << j4Mesh->source() << endl;
//Material
Qt3DExtras::QPhongMaterial *j4Material = new Qt3DExtras::QPhongMaterial();
j4Material->setDiffuse(QColor(QRgb(0xbeb32b)));
//Mesh Transform
Qt3DCore::QTransform *j4Transform = new Qt3DCore::QTransform();
j4Transform->setScale(1.0f);
j4Transform->setRotation(QQuaternion::fromAxisAndAngle(QVector3D(0.0f, 1.0f, 0.0f), 0.0f));
j4Transform->setTranslation(QVector3D(140.0f, 0.0f, 0.0f));
//创建一个实体
Qt3DCore::QEntity *j4Entity = new Qt3DCore::QEntity(j3Entity);
j4Entity->addComponent(j4Mesh);
j4Entity->addComponent(j4Material);
j4Entity->addComponent(j4Transform);
// ! j4
// ! j5
Qt3DRender::QMesh *j5mesh = new Qt3DRender::QMesh();//Mesh
j5mesh->setSource(QUrl("qrc:/arm/j5.obj"));
j5mesh->setMeshName(tr("j5"));
qDebug() << j5mesh->status() << j5mesh->source() << endl;
//Material
Qt3DExtras::QPhongMaterial *j5material = new Qt3DExtras::QPhongMaterial();
j5material->setDiffuse(QColor(QRgb(0xbeb32b)));
//Mesh Transform
Qt3DCore::QTransform *j5transform = new Qt3DCore::QTransform();
j5transform->setScale(1.0f);
j5transform->setRotation(QQuaternion::fromAxisAndAngle(QVector3D(0.0f, 1.0f, 0.0f), 0.0f));
j5transform->setTranslation(QVector3D(2297.0f, 0.0f, -159.443f));
//创建一个实体
Qt3DCore::QEntity *j5Entity = new Qt3DCore::QEntity(j4Entity);
j5Entity->addComponent(j5mesh);
j5Entity->addComponent(j5material);
j5Entity->addComponent(j5transform);
// ! j6
Qt3DRender::QMesh *j6mesh = new Qt3DRender::QMesh();//Mesh
j6mesh->setSource(QUrl("qrc:/arm/j6.obj"));
j6mesh->setMeshName(tr("j6"));
qDebug() << j6mesh->status() << j6mesh->source() << endl;
//Material
Qt3DExtras::QPhongMaterial *j6material = new Qt3DExtras::QPhongMaterial();
j6material->setDiffuse(QColor(QRgb(0xbeb32b)));
//Mesh Transform
Qt3DCore::QTransform *j6transform = new Qt3DCore::QTransform();
j6transform->setScale(1.0f);
j6transform->setRotation(QQuaternion::fromAxisAndAngle(QVector3D(0.0f, 1.0f, 0.0f), 0.0f));
j6transform->setTranslation(QVector3D(-1461.38f, 219.0f, 78.0f));
//创建一个实体
Qt3DCore::QEntity *j6Entity = new Qt3DCore::QEntity(j5Entity);
j6Entity->addComponent(j6mesh);
j6Entity->addComponent(j6material);
j6Entity->addComponent(j6transform);
// ! j7
Qt3DRender::QMesh *j7mesh = new Qt3DRender::QMesh();//Mesh
j7mesh->setSource(QUrl("qrc:/arm/j7.obj"));
j7mesh->setMeshName(tr("j7"));
qDebug() << j7mesh->status() << j7mesh->source() << endl;
//Material
Qt3DExtras::QPhongMaterial *j7material = new Qt3DExtras::QPhongMaterial();
j7material->setDiffuse(QColor(QRgb(0xbeb32b)));
//Mesh Transform
Qt3DCore::QTransform *j7transform = new Qt3DCore::QTransform();
j7transform->setScale(1.0f);
j7transform->setRotation(QQuaternion::fromAxisAndAngle(QVector3D(0.0f, 1.0f, 0.0f), 0.0f));
j7transform->setTranslation(QVector3D(100.0f, 0.0f, 0.0f));
//创建一个实体
Qt3DCore::QEntity *j7Entity = new Qt3DCore::QEntity(j6Entity);
j7Entity->addComponent(j7mesh);
j7Entity->addComponent(j7material);
j7Entity->addComponent(j7transform);
// ! j8
Qt3DRender::QMesh *j8mesh = new Qt3DRender::QMesh();//Mesh
j8mesh->setSource(QUrl("qrc:/arm/j8.obj"));
j8mesh->setMeshName(tr("j8"));
qDebug() << j8mesh->status() << j8mesh->source() << endl;
//Material
Qt3DExtras::QPhongMaterial *j8material = new Qt3DExtras::QPhongMaterial();
j8material->setDiffuse(QColor(QRgb(0xbeb32b)));
//Mesh Transform
Qt3DCore::QTransform *j8transform = new Qt3DCore::QTransform();
j8transform->setScale(1.0f);
j8transform->setRotation(QQuaternion::fromAxisAndAngle(QVector3D(0.0f, 1.0f, 0.0f), 0.0f));
j8transform->setTranslation(QVector3D(2319.0f, 0.0f, 35.0f));
//创建一个实体
Qt3DCore::QEntity *j8Entity = new Qt3DCore::QEntity(j7Entity);
j8Entity->addComponent(j8mesh);
j8Entity->addComponent(j8material);
j8Entity->addComponent(j8transform);
// ! j9
Qt3DRender::QMesh *j9mesh = new Qt3DRender::QMesh();//Mesh
j9mesh->setSource(QUrl("qrc:/arm/j9.obj"));
j9mesh->setMeshName(tr("j9"));
qDebug() << j9mesh->status() << j9mesh->source() << endl;
//Material
Qt3DExtras::QPhongMaterial *j9material = new Qt3DExtras::QPhongMaterial();
j9material->setDiffuse(QColor(QRgb(0xbeb32b)));
//Mesh Transform
Qt3DCore::QTransform *j9transform = new Qt3DCore::QTransform();
j9transform->setScale(1.0f);
j9transform->setRotation(QQuaternion::fromAxisAndAngle(QVector3D(0.0f, 1.0f, 0.0f), 0.0f));
j9transform->setTranslation(QVector3D(158.0f, 0.0f, 80.0f));
//创建一个实体
Qt3DCore::QEntity *j9Entity = new Qt3DCore::QEntity(j8Entity);
j9Entity->addComponent(j9mesh);
j9Entity->addComponent(j9material);
j9Entity->addComponent(j9transform);
// ! j10
Qt3DRender::QMesh *j10mesh = new Qt3DRender::QMesh();//Mesh
j10mesh->setSource(QUrl("qrc:/arm/j10.obj"));
j10mesh->setMeshName(tr("j10"));
qDebug() << j10mesh->status() << j10mesh->source() << endl;
//Material
Qt3DExtras::QPhongMaterial *j10material = new Qt3DExtras::QPhongMaterial();
j10material->setDiffuse(QColor(QRgb(0xbeb32b)));
//Mesh Transform
Qt3DCore::QTransform *j10transform = new Qt3DCore::QTransform();
j10transform->setScale(1.0f);
j10transform->setRotation(QQuaternion::fromAxisAndAngle(QVector3D(0.0f, 1.0f, 0.0f), 0.0f));
j10transform->setTranslation(QVector3D(30.0f, 0.0f, 50.0f));
//创建一个实体
Qt3DCore::QEntity *j10Entity = new Qt3DCore::QEntity(j9Entity);
j10Entity->addComponent(j10mesh);
j10Entity->addComponent(j10material);
j10Entity->addComponent(j10transform);
// ! j11
Qt3DRender::QMesh *j11mesh = new Qt3DRender::QMesh();//Mesh
j11mesh->setSource(QUrl("qrc:/arm/j11.obj"));
j11mesh->setMeshName(tr("j11"));
qDebug() << j11mesh->status() << j11mesh->source() << endl;
//Material
Qt3DExtras::QPhongMaterial *j11material = new Qt3DExtras::QPhongMaterial();
j11material->setDiffuse(QColor(QRgb(0xbeb32b)));
//Mesh Transform
Qt3DCore::QTransform *j11transform = new Qt3DCore::QTransform();
j11transform->setScale(1.0f);
j11transform->setRotation(QQuaternion::fromAxisAndAngle(QVector3D(0.0f, 1.0f, 0.0f), 0.0f));
j11transform->setTranslation(QVector3D(140.0f, 0.0f, 50.0f));
//创建一个实体
Qt3DCore::QEntity *j11Entity = new Qt3DCore::QEntity(j10Entity);
j11Entity->addComponent(j11mesh);
j11Entity->addComponent(j11material);
j11Entity->addComponent(j11transform);
// Set root object of the scene
view->setRootEntity(rootEntity);
}
- 效果如下