在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. Mininet安装记录

    安装环境: Ubuntu虚拟机版本:14.04 Mininet版本:2.3.1b1 1.更改软件镜像源 在设置中进行如下操作: 选择国内的镜像站点,如阿里云. 点击关闭后,在弹出的窗口中点击重新载入, ...

  2. JDK,JRE和JVM的区别和联系

    一.JDK,JRE和JVM的区别和联系 JDK JDK:Java Development Kit,是java开发工具包,是程序员使用java语言编写java程序所需的开发工具包. JDK:普通用户只需 ...

  3. hive操作 -- zeppelin安装及配置

    当时写hive用的是zeppelin,这个工具可以直接在页面上写sql语句,操作服务器上的hive库,还挺方便的 通过zeppelin实现hive的查询结果的可视化 启动过程中会报错:User: to ...

  4. 【赵渝强老师】Weblogic域和域的组成

    一.什么是Weblogic WebLogic是美国Oracle公司出品的一个application server,确切的说是一个基于Java EE架构的中间件,WebLogic是用于开发.集成.部署和 ...

  5. 一些git使用命令,误删本地分支,如何找回

    1.新建仓库 git init 2.如果要本地更改文件,需要更新到远端. git status # 查看当前文件状态 git add -A # "git add -A" 命令用于将 ...

  6. 共124篇!墨天轮“高可用架构”干货文档分享(含Oracle、MySQL、PG)

    大家期待的高可用篇来啦!在上期<墨天轮高分技术文档分享-Oracle升级迁移篇>中大家对数据库高可用架构相关文档呼声较高,这不就来啦! 数据库的高可用架构能够在发生宕机或意外中断等故障时起 ...

  7. 【Treatment-Rec 论文阅读】Data-driven Automatic Treatment Regimen Development and Recommendation

    Data-driven Automatic Treatment Regimen Development and Recommendation Authors: Leilei Sun, Chuanren ...

  8. 云原生周刊:2023 年 Java 开发人员可以学习的 25 大技术技能

    文章推荐 2023 年 Java 开发人员可以学习的 25 大技术技能 这篇文章为 Java 开发人员提供了 2023 年需要学习的一些重要技能,这些技能涵盖了现代 Java 开发.大数据和人工智能. ...

  9. JS 通过后台接口返回的URL地址下载文件并保存到本地(已在项目中使用,保存音视频文件)

    今天做antdV表格勾选下载操作时,因为粗心大意碰到了下载问题,特此记录~ 一.单个文件下载逻辑代码如下: const exportFile = (data, fileName, _this)=> ...

  10. PLSQL安装配置与汉化

    一.下载安装 1.官方安装包下载链接:https://www.allroundautomations.com/plsqldev.html 如下图所示,可自行选择32位或者64位 2.下载后双击安装至指 ...