在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. Canvas简历编辑器-Monorepo+Rspack工程实践

    Canvas简历编辑器-Monorepo+Rspack工程实践 在之前我们围绕Canvas聊了很多代码设计层面的东西,在这里我们聊一下工程实践.在之前的文中我也提到过,因为是本着学习的态度以及对技术的 ...

  2. 嵌入式Linux ubi文件系统制作、分区设置、只读文件系统,uboot启动参数root

    当前平台, 基于君正的X10000平台的嵌入式Linux 系统 0  目的 我要设置根文件系统为可读写, 设置data分区上的文件系统为只读 1 设置各文件系统的读写属性 /bin/mount -o ...

  3. 标准库之 random 模块

    一.介绍random模块 1.1.random模块简介 random模块是Python标准库中用于生成伪随机数的模块,伪随机数是通过算法生成的数列,在一定范围内表现出随机性,虽然这些数列在一定程度上是 ...

  4. HDU-ACM 2024 Day2

    T1004 a*b problem(HDU 7448) 不会. T1005 小塔的养成游戏之梦(HDU 7449) 不会. T1009 强攻计策(HDU 7453) 容易发现初始速度是多少对答案没有影 ...

  5. KubeSphere 社区双周报 | OpenFunction v1.2.0 发布 | 2023.09.15-09.28

    KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...

  6. 凌晨 12 点突发 istio 生产事故!一顿操作猛如虎解决了

    事故起因 业务上新集群,本来以为"洒洒水",11 点切,12 点就能在家睡觉了.流量切过来后,在验证过程中,发现网页能够正常打开,在登录时返回了 502,当场懵逼.在相关的容器日志 ...

  7. 分享一个大模型在请求api接口上的巧用

    前言 自从Chatgpt横空出世以来,各种智能工具层出不穷,聊天.绘画.视频等各种工具帮助很多人高效的工作.作为一个开发者,目前常用应用包括代码自动填充,聊天助手等. 这些是工具层面的使用,有没有将大 ...

  8. Chapter 1 内容梳理

    目录 程序的编译与执行 编译环境 程序的编译 程序的执行 标准输入与标准输出 例程导入 标准输入与输出对象 输入与输出符号详解 函数角度理解[用函数的副作用] 运算符角度理解 定位符号(scope o ...

  9. kubernetes组件大全

    master节点组件 控制平面的组件我们会找一台单独的机器来部署,我们习惯上把部署控制平面组件的机器称为master节点,以下都会用master节点来代替控制平面这个概念,master节点的组件能够对 ...

  10. 基于Java+SpringBoot+Mysql实现的快递柜寄取快递系统功能实现五

    一.前言介绍: 1.1 项目摘要 随着电子商务的迅猛发展和城市化进程的加快,快递业务量呈现出爆炸式增长的趋势.传统的快递寄取方式,如人工配送和定点领取,已经无法满足现代社会的快速.便捷需求.这些问题不 ...