簡體   English   中英

如何使用 qt 放大 3D 網格?

[英]How to zoom toward a 3D mesh with qt?

我正在使用 Wheelevent 在QWidget視圖中放大/縮小,在使用該事件來轉換QCamera ,是否有來自 qt api 的解決方案以移向一個點或將相機縮放到特定點? 我搜索了很多部分,但不幸的是沒有找到有用的東西。

編輯: Stefan Reinhardt 建議使用QAbstractCameraController來實現您想要做的事情。 我提供的示例是一個快速而骯臟的解決方案。 我同意使用相機控制器是 Qt3D 中的預期方式。


Qt3D API 不直接支持此功能,但您可以自己輕松實現。

這是一個最低限度的工作示例,它應該可以幫助您入門(請注意,當我想滾動經過視圖中心時,您必須調整向上向量):

main.cpp :

#include <QApplication>
#include "graphicswindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    GraphicsWindow graphicsWindow;
    graphicsWindow.show();
    return a.exec();
}

graphicswindow.h

#include <Qt3DExtras/Qt3DWindow>
#include <Qt3DCore/QEntity>

class GraphicsWindow : public Qt3DExtras::Qt3DWindow {
public:
    GraphicsWindow();
    void wheelEvent ( QWheelEvent * event ) override;

private:
    Qt3DCore::QEntity *createScene();
};

graphicswindow.cpp

#include "graphicswindow.h"
#include <QMouseEvent>
#include <QVector3D>
#include <Qt3DRender/QCamera>
#include <Qt3DRender/QMaterial>
#include <Qt3DExtras/QGoochMaterial>
#include <Qt3DExtras/QCuboidMesh>

GraphicsWindow::GraphicsWindow() : Qt3DExtras::Qt3DWindow() {
    // You could also create a dedicated setup method
    Qt3DCore::QEntity *root = createScene();
    setRootEntity(root);
    Qt3DRender::QCamera *camera = this->camera();
    camera->lens()->setPerspectiveProjection(45.0f, 16.0f/9.0f, 0.1f, 1000.0f);
    camera->setPosition(QVector3D(20.0, 20.0, 20.0f));
    camera->setViewCenter(QVector3D(0, 0, 0));
}

void GraphicsWindow::wheelEvent(QWheelEvent *event) {
    QVector3D camPos = this->camera()->position();
    camPos.normalize();
    camPos = this->camera()->position() - QVector3D(event->delta() / 300.f,
                                                event->delta() / 300.f,
                                                event->delta() / 300.f);
    this->camera()->setPosition(camPos);
}


Qt3DCore::QEntity* GraphicsWindow::createScene() {
    Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity;

    Qt3DRender::QMaterial *material = new Qt3DExtras::QGoochMaterial(rootEntity);

    //Cube
    Qt3DCore::QEntity *cubeEntity = new Qt3DCore::QEntity(rootEntity);
    Qt3DExtras::QCuboidMesh *cubeMesh = new Qt3DExtras::QCuboidMesh;

    cubeEntity->addComponent(cubeMesh);
    cubeEntity->addComponent(material);

    return rootEntity;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM