如何在不使用 QML 的情况下使用 Qt3D 设置多个视口
How do I set up multiple viewports using Qt3D without having to use QML
我想设置类似于 https://doc.qt.io/archives/qt-5.10/qt3d-multiviewport-example.html 的多视口场景
无需使用 QML。
目前我有一个视图可以使用:
Qt3DExtras::Qt3DWindow* createView ( Qt3DCore::QEntity* rootEntity ) {
Qt3DExtras::Qt3DWindow* view = new Qt3DExtras::Qt3DWindow();
Qt3DRender::QCamera* camera = view->camera();
camera->lens()->setPerspectiveProjection ( 45.0f, 16.0f / 9.0f, 0.1f, 1000.0f );
camera->setPosition ( QVector3D ( 0, 0, 10.0f ) );
camera->setViewCenter ( QVector3D ( 0, 0, 0 ) );
Qt3DExtras::QOrbitCameraController* manipulator = new Qt3DExtras::QOrbitCameraController ( rootEntity );
manipulator->setLinearSpeed ( 5.0f );
manipulator->setLookSpeed ( 180.f );
manipulator->setZoomInLimit ( 5.0f );
manipulator->setCamera ( camera );
return view;
}
本质上,问题是如何将示例中提供的 QML 代码转换为 C++。
您必须使用 QViewport
class 和 setNormalizedRect
函数来指定 [0.0, 0.0, 1.0, 1.0].
类似下面的内容。
//DECLARE A FRAME GRAPH
Qt3DRender::QFrameGraph *frameGraph = new Qt3DRender::QFrameGraph();
Qt3DRender::QTechniqueFilter *techniqueFilter = new Qt3DRender::QTechniqueFilter();
Qt3DRender::QViewport *viewport1 = new Qt3DRender::QViewport(techniqueFilter);
Qt3DRender::QViewport *viewport2 = new Qt3DRender::QViewport(techniqueFilter);
Qt3DRender::QViewport *viewport3 = new Qt3DRender::QViewport(techniqueFilter);
Qt3DRender::QViewport *viewport4 = new Qt3DRender::QViewport(techniqueFilter);
viewport1->setNormalizedRect(QRectF(0, 0, 0.5, 0.5));
viewport2->setNormalizedRect(QRectF(0.5, 0, 0.5, 0.5));
viewport3->setNormalizedRect(QRectF(0, 0.5, 0.5, 0.5));
viewport4->setNormalizedRect(QRectF(0.5, 0.5, 0.5, 0.5));
//SET ACTIVE FRAME GRAPH NODE TO YOUR WINDOW
your_qt3d_wndObject->setActiveFrameGraph(frameGraph->activeFrameGraph());
https://doc-snapshots.qt.io/qt5-5.9/qt3drender-qviewport.html
我想设置类似于 https://doc.qt.io/archives/qt-5.10/qt3d-multiviewport-example.html 的多视口场景 无需使用 QML。
目前我有一个视图可以使用:
Qt3DExtras::Qt3DWindow* createView ( Qt3DCore::QEntity* rootEntity ) {
Qt3DExtras::Qt3DWindow* view = new Qt3DExtras::Qt3DWindow();
Qt3DRender::QCamera* camera = view->camera();
camera->lens()->setPerspectiveProjection ( 45.0f, 16.0f / 9.0f, 0.1f, 1000.0f );
camera->setPosition ( QVector3D ( 0, 0, 10.0f ) );
camera->setViewCenter ( QVector3D ( 0, 0, 0 ) );
Qt3DExtras::QOrbitCameraController* manipulator = new Qt3DExtras::QOrbitCameraController ( rootEntity );
manipulator->setLinearSpeed ( 5.0f );
manipulator->setLookSpeed ( 180.f );
manipulator->setZoomInLimit ( 5.0f );
manipulator->setCamera ( camera );
return view;
}
本质上,问题是如何将示例中提供的 QML 代码转换为 C++。
您必须使用 QViewport
class 和 setNormalizedRect
函数来指定 [0.0, 0.0, 1.0, 1.0].
类似下面的内容。
//DECLARE A FRAME GRAPH
Qt3DRender::QFrameGraph *frameGraph = new Qt3DRender::QFrameGraph();
Qt3DRender::QTechniqueFilter *techniqueFilter = new Qt3DRender::QTechniqueFilter();
Qt3DRender::QViewport *viewport1 = new Qt3DRender::QViewport(techniqueFilter);
Qt3DRender::QViewport *viewport2 = new Qt3DRender::QViewport(techniqueFilter);
Qt3DRender::QViewport *viewport3 = new Qt3DRender::QViewport(techniqueFilter);
Qt3DRender::QViewport *viewport4 = new Qt3DRender::QViewport(techniqueFilter);
viewport1->setNormalizedRect(QRectF(0, 0, 0.5, 0.5));
viewport2->setNormalizedRect(QRectF(0.5, 0, 0.5, 0.5));
viewport3->setNormalizedRect(QRectF(0, 0.5, 0.5, 0.5));
viewport4->setNormalizedRect(QRectF(0.5, 0.5, 0.5, 0.5));
//SET ACTIVE FRAME GRAPH NODE TO YOUR WINDOW
your_qt3d_wndObject->setActiveFrameGraph(frameGraph->activeFrameGraph());
https://doc-snapshots.qt.io/qt5-5.9/qt3drender-qviewport.html