在CAD/CAM软件中,都需要旋转、平移和缩放视角,来观察操作图形。由于VTK定义的交互的类型不是很适用,所有通过定义一套自己的交互方式。

在下面代码中,鼠标左键平移,滚轮缩放,右键旋转。

先定义一个交互类型。继承自vtkInteractorStyleTrackballCamera,并且交换按键。

class Normal3DCameraStyle : public vtkInteractorStyleTrackballCamera
{
public:
static Normal3DCameraStyle* New();
vtkTypeMacro(Normal3DCameraStyle, vtkInteractorStyleTrackballCamera); virtual void OnLeftButtonDown(void);
virtual void OnLeftButtonUp(void);
virtual void OnRightButtonDown(void);
virtual void OnRightButtonUp(void);
virtual void OnMiddleButtonDown(void);
virtual void OnMiddleButtonUp(void);
virtual void OnMouseWheelForward(void);
virtual void OnMouseWheelBackward(void);
virtual void OnMouseMove(void);
}; vtkStandardNewMacro(Normal3DCameraStyle);//必须加!!!! void Normal3DCameraStyle::OnLeftButtonDown(void)
{
vtkInteractorStyleTrackballCamera::OnMiddleButtonDown();
} void Normal3DCameraStyle::OnLeftButtonUp(void)
{
vtkInteractorStyleTrackballCamera::OnMiddleButtonUp();
} void Normal3DCameraStyle::OnRightButtonDown(void)
{
vtkInteractorStyleTrackballCamera::OnLeftButtonDown();
} void Normal3DCameraStyle::OnRightButtonUp(void)
{
vtkInteractorStyleTrackballCamera::OnLeftButtonUp();
} void Normal3DCameraStyle::OnMiddleButtonDown(void)
{ } void Normal3DCameraStyle::OnMiddleButtonUp(void)
{ } void Normal3DCameraStyle::OnMouseWheelForward(void)
{
vtkInteractorStyleTrackballCamera::OnMouseWheelForward();
}; void Normal3DCameraStyle::OnMouseWheelBackward(void)
{
vtkInteractorStyleTrackballCamera::OnMouseWheelBackward();
}; void Normal3DCameraStyle::OnMouseMove(void)
{
vtkInteractorStyleTrackballCamera::OnMouseMove();
}

添加Normal3DCameraStyle到交换器中

vtkNew<Normal3DCameraStyle> style;
ui.vtk_main->interactor()->SetInteractorStyle(style);

下面是完整代码

class Normal3DCameraStyle : public vtkInteractorStyleTrackballCamera
{
public:
static Normal3DCameraStyle* New();
vtkTypeMacro(Normal3DCameraStyle, vtkInteractorStyleTrackballCamera); virtual void OnLeftButtonDown(void);
virtual void OnLeftButtonUp(void);
virtual void OnRightButtonDown(void);
virtual void OnRightButtonUp(void);
virtual void OnMiddleButtonDown(void);
virtual void OnMiddleButtonUp(void);
virtual void OnMouseWheelForward(void);
virtual void OnMouseWheelBackward(void);
virtual void OnMouseMove(void);
}; vtkStandardNewMacro(Normal3DCameraStyle);//必须加!!!! void Normal3DCameraStyle::OnLeftButtonDown(void)
{
vtkInteractorStyleTrackballCamera::OnMiddleButtonDown();
} void Normal3DCameraStyle::OnLeftButtonUp(void)
{
vtkInteractorStyleTrackballCamera::OnMiddleButtonUp();
} void Normal3DCameraStyle::OnRightButtonDown(void)
{
vtkInteractorStyleTrackballCamera::OnLeftButtonDown();
} void Normal3DCameraStyle::OnRightButtonUp(void)
{
vtkInteractorStyleTrackballCamera::OnLeftButtonUp();
} void Normal3DCameraStyle::OnMiddleButtonDown(void)
{ } void Normal3DCameraStyle::OnMiddleButtonUp(void)
{ } void Normal3DCameraStyle::OnMouseWheelForward(void)
{
vtkInteractorStyleTrackballCamera::OnMouseWheelForward();
}; void Normal3DCameraStyle::OnMouseWheelBackward(void)
{
vtkInteractorStyleTrackballCamera::OnMouseWheelBackward();
}; void Normal3DCameraStyle::OnMouseMove(void)
{
vtkInteractorStyleTrackballCamera::OnMouseMove();
} QtVtkTest::QtVtkTest(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this); QSurfaceFormat::setDefaultFormat(QVTKOpenGLNativeWidget::defaultFormat()); vtkNew<vtkRenderer> renderer;
vtkNew<vtkNamedColors> colors; //定义球
vtkNew<vtkSphereSource> sphereSource;
sphereSource->SetRadius(5);
sphereSource->SetCenter(5, 0, 0);
vtkNew<vtkPolyDataMapper> sphereMapper;
sphereMapper->SetInputConnection(sphereSource->GetOutputPort());
vtkNew<vtkActor> sphereActor;
sphereActor->SetMapper(sphereMapper);
sphereActor->GetProperty()->SetColor(colors->GetColor4d("Green").GetData());
sphereActor->GetProperty()->EdgeVisibilityOn(); //显示线框 renderer->AddActor(sphereActor); renderer->SetBackground(colors->GetColor3d("SteelBlue").GetData()); vtkNew<vtkGenericOpenGLRenderWindow> renderWindow;
renderWindow->AddRenderer(renderer);
renderWindow->SetWindowName("RenderWindowNoUIFile"); ui.vtk_main->setRenderWindow(renderWindow);
//
vtkNew<Normal3DCameraStyle> style;
ui.vtk_main->interactor()->SetInteractorStyle(style);
}

VTK 视角的旋转、平移、缩放的更多相关文章

  1. OpenGL中旋转平移缩放等变换的顺序对模型的影响

    l 前提: 0x01. 假设绘制顶点的语句为Draw Array,变换的语句(旋转.平移.缩放)为M,而 M0; M1; M2; Draw Array; 则称对Array先进行M2再进行M1.M0 0 ...

  2. Three.js三维模型几何体旋转、缩放和平移

    创建场景中的三维模型往往需要设置显示大小.位置.角度,three.js提供了一系列网格模型对象的几何变换方法,从WebGL的角度看,旋转.缩放.平移对应的都是模型变换矩阵,关于矩阵变换内容可以观看本人 ...

  3. 【Unity3D】简单常用的功能实现2——视角的跟随、旋转、缩放

    [视角的跟随.旋转.缩放实现] 首先,在实现这些功能之前,我们给Hierarchy面板中的主摄像机额外包装几层Empty Object,形成一个新的摄像机结构,如下图(当然这些空物体的命名大家按自己方 ...

  4. 【转载】Unity中矩阵的平移、旋转、缩放

    By:克森 简介 在这篇文章中,我们将会学到几个概念:平移矩阵.旋转矩阵.缩放矩阵.在学这几个基本概念的同时,我们会用到 Mesh(网格).数学运算.4x4矩阵的一些简单的操作.但由于克森也是新手,文 ...

  5. 二维坐标的平移,旋转,缩放及matlab实现

    本文结合matlab 软件解释二维坐标系下的平移,旋转,缩放 首先确定点在二维坐标系下的表达方法,使用一个1*3矩阵: Pt = [x,y,1] 其中x,y 分别为点的X,Y坐标,1为对二维坐标的三维 ...

  6. opencv 图像仿射变换 计算仿射变换后对应特征点的新坐标 图像旋转、缩放、平移

    常常需要最图像进行仿射变换,仿射变换后,我们可能需要将原来图像中的特征点坐标进行重新计算,获得原来图像中例如眼睛瞳孔坐标的新的位置,用于在新得到图像中继续利用瞳孔位置坐标. 仿射变换在:http:// ...

  7. WPF/Silverlight中图形的平移,缩放,旋转,倾斜变换演示

    原文:WPF/Silverlight中图形的平移,缩放,旋转,倾斜变换演示 为方便描述, 这里仅以正方形来做演示, 其他图形从略. 运行时效果图:XAML代码:// Transform.XAML< ...

  8. 使用C++实现图形的旋转、缩放、平移

    编译环境:VS2017 编译框架:MFC 实验内容:显示一个三角形,并将其绕中心进行旋转.缩放以及平移等操作 实验步骤: 1.打开VS2017,并创建MFC项目,具体方法参见:http://www.c ...

  9. 初学Direct X(7) ——位图的旋转,缩放以及平移

    初学Direct X(7) --位图的旋转,缩放以及平移 本文旨在实现通过D3DXMatrixTransformation2D函数实现位图的旋转,缩放以及平移操作,但是具体的原理部分会在后面进一步的探 ...

  10. threeJS创建mesh,创建平面,设置mesh的平移,旋转、缩放、自传、透明度、拉伸

    这个小案例是当初我在学习的时候,小的一个小案例,代码还需要进一步优化:还请谅解~~:主要用到了threeJS创建mesh,创建平面,设置mesh的平移,旋转.缩放.自传.透明度.拉伸等这些小功能: 采 ...

随机推荐

  1. P1543 [POI2004] SZP 题解

    P1543 [POI2004] SZP 题解 传送门. 题目简述 有 \(n\) 个人,每个人都会监视另一个人,要求选出尽可能多的同学,使得选出的每一名同学都必定会被监视到.且选出的同学不可再监视其他 ...

  2. 最好的文件管理器-dolphin

    WARN:windows没有,废话少说,直接开始 what's dolphin 长得好看 dolphin使用kde的主题管理,可以通过kde的主题商店配合kvantum manager 配制出一个好看 ...

  3. 当git仓库里面已经有上传好的框架时,二次上传到仓库需要的指令

    初始化仓库 1 git init git add . "提交信息"里面换成自己的需要 如"first commit" git commit -m "提 ...

  4. pinia - 为 antdv 表格添加加载状态

    前言 我们之前制作的 Vue3 + AntDesign Vue + SpringBoot 的增删改查小 Demo 的功能已经全部实现了,但是还是有一点不完美,在发送请求到后端返回数据这一段时间内前台未 ...

  5. 随心所动,厂商的CPU核管理策略介绍

    一.引文 随着CPU架构的发展,工艺的升级,带来性能提升,能效的提升(同性能下).但是由于极限性能的增加,也带来了peak功耗的增加(大部分情况下,能效比的提升无法抵消这部分),CPU功耗优化一直是广 ...

  6. AMBA总线协议(一)——一文看懂APB总线协议

    0.AMBA总线概括 AMBA(Advanced Microcontroller Bus Architecture) 总线是由ARM公司提出的一种开放性的片上总线标准,它独立于处理器和工艺技术,具有高 ...

  7. pytorch: grad can be implicitly created only for scalar outputs

    运行这段代码 import torch import numpy as np import matplotlib.pyplot as plt x = torch.ones(2,2,requires_g ...

  8. 专场直播预约 | 邀您探讨KaiwuDB 离散制造业场景解决方案

    先导语 近日,KaiwuDB 携手山东重工集团有限公司(以下简称:山东重工)  重磅发布"离散制造业解决方案".该方案以 KaiwuDB 就地运算技术专利技术为底座,搭建了&quo ...

  9. javaScript遍历对象总结

    定义对象: const obj = { name: 'zlx', id: 245, age: 25, gender: '男', } 1. 使用 for... in..循环遍历 对象的属性有2种方式可以 ...

  10. 浅析Redis

    浅析Redis 什么是Redis Redis本质上是一个Key-Value类型的内存数据库,整个数据库加载在内存当中操作,定期通过异步操作把数据库中的数据flush到硬盘上进行保存. 因为是纯内存操作 ...