如何使用qt缩放三维网格
How to zoom toward a 3D mesh with qt?
我使用Wheelevent在QWidget
视图中放大/缩小,在使用事件翻译QCamera
时,qtapi是否有解决方案可以移动到某个点或使用相机缩放到特定点?我搜索了很多部分,但遗憾的是没有找到有用的东西。
编辑: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;
}
相关文章:
- 如何将三维尺寸不固定的三维阵列展平为一维阵列
- 多维数组存储三种不同的数据类型?
- C++中的多维数据集:从 std::vector 的 2D 数据到 std::vector 的 2D 网格的最干净方法?
- 如何使用qt缩放三维网格
- 为什么我需要三个嵌套的大括号来调用赋值运算符,将const引用到二维数组
- 三维数组中的C/C++DWORD到BYTE和BYTE到DWORD的转换
- 使用vtkImageReslice重新切片三维原始图像
- 特征:创建一个具有函数的三维阵列
- 扩充矩阵的行缩减-三维样条曲线计算
- 使用pcl transformcloud将三维点平移并旋转到原点
- 用C++从三维矢量中删除元素
- 如何创建一个具有空值、递减编号系统和.txt文件输入值的二维阵列网格
- 如何累积三维三角形网格的边?用c语言计算网格边的算法
- 使用std::set实现稀疏三维网格时出错
- 在创建三维网格时,嵌套的for()循环上的OpenMP
- 将三维阵列(矢量)转换为vtk非结构化网格
- 高效地执行文件I/O,以便对大型三维网格进行非顺序访问
- 如何增量组合三维网格
- 像素文本到三维网格的转换库
- 哪些库适用于三维曲面网格