Qt加载OBJ或STL模型文件,支持鼠标移动、缩放、旋转Demo
Qt加载模型文件obj或者stl实例支持鼠标移动缩放旋转demo最近在捣鼓Qt的3D可视化功能发现用Qt搞个模型查看器比想象中简单。咱们先整点实际的——做个能加载obj/stl模型支持鼠标拖拽旋转、平移、缩放的demo。废话不多说直接撸代码先来初始化3D场景核心组件Qt3DExtras::Qt3DWindow *view new Qt3DExtras::Qt3DWindow; Qt3DCore::QEntity *rootEntity new Qt3DCore::QEntity; // 相机配置 Qt3DRender::QCamera *camera view-camera(); camera-lens()-setPerspectiveProjection(45.0f, 16.0f/9.0f, 0.1f, 1000.0f); camera-setPosition(QVector3D(0, 0, 40));这里Qt3DWindow相当于3D画布QEntity是场景中的实体。重点看模型加载部分Qt3DCore::QEntity *modelEntity new Qt3DCore::QEntity(rootEntity); // 加载模型文件 Qt3DRender::QMesh *mesh new Qt3DRender::QMesh; mesh-setSource(QUrl::fromLocalFile(teapot.obj)); // 换成你的模型路径 // 材质配置 Qt3DExtras::QPhongMaterial *material new Qt3DExtras::QPhongMaterial; material-setDiffuse(QColor(QRgb(0xCC8833))); // 坐标变换组件 Qt3DCore::QTransform *transform new Qt3DCore::QTransform; transform-setScale(1.0f); transform-setRotation(QQuaternion::fromAxisAndAngle(QVector3D(0, 1, 0), 0.0f)); modelEntity-addComponent(mesh); modelEntity-addComponent(material); modelEntity-addComponent(transform);QMesh组件支持obj/stl/fbx等多种格式实测发现某些stl文件需要预处理单位制。建议模型放在项目根目录避免路径问题。Qt加载模型文件obj或者stl实例支持鼠标移动缩放旋转demo接下来是重头戏——鼠标交互控制。咱们直接重写事件处理class Viewport : public Qt3DExtras::Qt3DWindow { protected: void mousePressEvent(QMouseEvent *event) override { m_lastPos event-pos(); } void mouseMoveEvent(QMouseEvent *event) override { int dx event-x() - m_lastPos.x(); int dy event-y() - m_lastPos.y(); if (event-buttons() Qt::LeftButton) { // 左键旋转 transform-setRotation(transform-rotation() * QQuaternion::fromAxisAndAngle(QVector3D(0, 1, 0), dx*0.5f) * QQuaternion::fromAxisAndAngle(QVector3D(1, 0, 0), dy*0.5f)); } else if (event-buttons() Qt::RightButton) { // 右键平移 transform-setTranslation(transform-translation() QVector3D(dx*0.05f, -dy*0.05f, 0)); } m_lastPos event-pos(); } void wheelEvent(QWheelEvent *event) override { // 滚轮缩放 float scaleFactor 1.0 event-angleDelta().y() * 0.001f; transform-setScale(transform-scale() * scaleFactor); } };这里用四元数实现累积旋转避免万向节死锁。平移时注意坐标系方向Y轴方向需要取反。缩放采用指数方式更符合直觉。最后组合所有部件int main(int argc, char *argv[]) { QApplication app(argc, argv); Viewport view; view.setRootEntity(rootEntity); view.show(); return app.exec(); }运行效果茶壶模型能跟着鼠标左键旋转起舞右键拖动平移滚轮缩放流畅。实测加载20MB的机械零件stl文件帧率稳定在60fps。遇到坑点提醒模型太大时记得调整相机near/far参数stl文件需要确认是二进制还是ASCII格式缩放时建议设置上下限防止模型消失复杂模型建议开启背面剔除Qt3DRender::QRenderSettings *renderSettings new Qt3DRender::QRenderSettings; Qt3DRender::QDepthTest *depthTest new Qt3DRender::QDepthTest; depthTest-setDepthFunction(Qt3DRender::QDepthTest::Less); renderSettings-setActiveFrameGraph(new Qt3DRender::QForwardRenderer);完整代码已放在Github假装有链接下次试试给模型加个炫酷的PBR材质
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2459748.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!