【QT+VTK 学习笔记】03:坐标系统及空间变换

前言

“VTK图形图像开发进阶_张晓东_罗火灵”的学习笔记。
东灵工作室 教程系列导航:http://blog.csdn.net/www_doling_net/article/details/8763686

学习资料

VTK8.2.0+QT5+VS2015 x86/x64 已编译第三方库以其测试DEMO:
https://download.csdn.net/download/qq_37373742/83350761?spm=1001.2014.3001.5503

VTK官网学习地址:https://vtk.org/doc/nightly/html/

坐标系统

计算机图形学里常用的坐标系统主要有4种,分别是Model坐标系统、World坐标系统、 View坐标系统和Display坐标系统。
两种表示坐标点的方式:以屏幕像素值为单位和归一 化坐标值(各坐标轴取值范围为[-1,1]) o它们之间的关系如下图所示。
在这里插入图片描述

不同的场景放在同一个窗口显示。
程序展示 一个窗口四个视口
在这里插入图片描述
程序源码

#include <QApplication>
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)

#include <vtkConeSource.h>
#include <vtkCubeSource.h>
#include <vtkCylinderSource.h>
#include <vtkSphereSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkActor.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkSmartPointer.h>

int main()
{
    //数据模型
    vtkSmartPointer<vtkConeSource> cone = vtkSmartPointer<vtkConeSource>::New();
    vtkSmartPointer<vtkCubeSource> cube = vtkSmartPointer<vtkCubeSource>::New();
    vtkSmartPointer<vtkCylinderSource> cylinder = vtkSmartPointer<vtkCylinderSource>::New();
    vtkSmartPointer<vtkSphereSource> sphere = vtkSmartPointer<vtkSphereSource>::New();


    //VtkPolyDataMapper:: SetInputConnection (): VTK可视化线的输入数据接口,对应的输出数据可视化管道接口为GetOutputPort ();
    vtkSmartPointer<vtkPolyDataMapper> coneMapper = 	vtkSmartPointer<vtkPolyDataMapper>::New();
    coneMapper->SetInputConnection(cone->GetOutputPort());
    vtkSmartPointer<vtkPolyDataMapper> cubeMapper = 	vtkSmartPointer<vtkPolyDataMapper>::New();
    cubeMapper->SetInputConnection(cube->GetOutputPort());
    vtkSmartPointer<vtkPolyDataMapper> cylinderMapper = 	vtkSmartPointer<vtkPolyDataMapper>::New();
    cylinderMapper->SetInputConnection(cylinder->GetOutputPort());
    vtkSmartPointer<vtkPolyDataMapper> sphereMapper = 	vtkSmartPointer<vtkPolyDataMapper>::New();
    sphereMapper->SetInputConnection(sphere->GetOutputPort());

    vtkSmartPointer<vtkActor> coneActor = vtkSmartPointer<vtkActor>::New();
    coneActor->SetMapper(coneMapper);
    vtkSmartPointer<vtkActor> cubeActor = vtkSmartPointer<vtkActor>::New();
    cubeActor->SetMapper(cubeMapper);
    vtkSmartPointer<vtkActor> cylinderActor = vtkSmartPointer<vtkActor>::New();
    cylinderActor->SetMapper(cylinderMapper);
    vtkSmartPointer<vtkActor> sphereActor = vtkSmartPointer<vtkActor>::New();
    sphereActor->SetMapper(sphereMapper);


    vtkSmartPointer<vtkRenderer> renderer1 = vtkSmartPointer<vtkRenderer>::New();
    renderer1->AddActor(coneActor);
    renderer1->SetBackground(1.0,0.0,0.0);
    renderer1->SetViewport(0.0,0.0,0.5,0.5);
    vtkSmartPointer<vtkRenderer> renderer2 = vtkSmartPointer<vtkRenderer>::New();
    renderer2->AddActor(cubeActor);
    renderer2->SetBackground(0.0,1.0,0.0);
    renderer2->SetViewport(0.5,0.0,1.0,0.5);
    vtkSmartPointer<vtkRenderer> renderer3 = vtkSmartPointer<vtkRenderer>::New();
    renderer3->AddActor(cylinderActor);
    renderer3->SetBackground(0.0,0.0,1.0);
    renderer3->SetViewport(0.0,0.5,0.5,1.0);
    vtkSmartPointer<vtkRenderer> renderer4 = vtkSmartPointer<vtkRenderer>::New();
    renderer4->AddActor(sphereActor);
    renderer4->SetBackground(1.0,1.0,0.0);
    renderer4->SetViewport(0.5,0.5,1.0,1.0);

    vtkSmartPointer<vtkRenderWindow> renWin=vtkSmartPointer<vtkRenderWindow>::New();
    renWin->AddRenderer(renderer1);
    renWin->AddRenderer(renderer2);
    renWin->AddRenderer(renderer3);
    renWin->AddRenderer(renderer4);
    renWin->SetSize( 640, 480 );
    renWin->Render();
    renWin->SetWindowName("Viewport");

    vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
    interactor->SetRenderWindow(renWin);

    renWin->Render();
    interactor->Initialize();
    interactor->Start();

    return EXIT_SUCCESS;
}

vtkCoordinate
在VTK里,Model坐标系统用得比较少,其他三种坐标系统经常使用。它们之间的变换 则是由类vtkCoordinate进行管理的。根据坐标值的单位、取值范围等不同,可以将坐标系统 细分为如下几类。
• DISPLAY —— X、Y轴的坐标取值为渲染窗口的像素值。坐标原点位于渲染窗口的 左下角.这个对于VTK里的所有二维坐标系统都是一样的,且VTK里的坐标糸统中 是釆用右手坐标系。
• NORMALIZED DISPLAY —— X, Y轴坐标取值范围为[0, 1],跟DISPLAY—样,也是定义在渲染窗口里的。
•VIEWPORT —— X、Y的坐标值定义在视口或者渲染器(Renderer)里。
•NORMALIZED VIEWPORT——X、Y坐标值定义在视口或渲染器里,取值范围为[0,1]。
•VIEW——X、Y、Z坐标值定义在相机所在的坐标系统里,取值范围为[-1, 1], Z
停表示深度信息。
•WORLD —— X. Y. Z坐标值定义在世界坐标系统。
•USERDEFINED——用户自定义坐标系统。

vtkCoordinate可以用来表示坐标系统:其内部提供了函数接口来定义坐标系统:

SetCoordinateSystemToDispiay()
SetCoordinateSystemToNormalizedDisplay()
SetCoordinateSystemToViewport ()
SetCoordinateSystemToNormalizedViewport()
SetCoordinateSystemToView()
SetCoordinateSystemToWorld ()

另外,该类还实现这些坐标系统之间的转换,例如下述代码实现了归一化窗口坐标与窗 口坐标之间的转换:

    vtkSmartPointer<vtkCoordinate> coordinate = vtkSmartPointer<vtkCoordinate>::New();
    coordinate->SetCoordinateSystemToNormalizedDisplay(); 
    coordinate->SetValue(0.5,0.5,0);
    int* val;
    val = coordinate->GetComputedDisplayValue(renderer);

这里先调用了 SetCoordinateSystemToNormalizedDisplay。设置坐标系统为归一化窗口坐标,并设置坐标值为(0.5, 0.5,0),即屏幕的中心;然后通过函GetComputedDisplayValue()。 实现窗口坐标的转换。该类中坐标系统转换函数如下:

GctComputedWorldValue()
GetComputedViewportValue()
GetComputedDispiayValue()
GetComputedLocalDisplayValue()
GetComputedDoubleViewportValue()
GetComputedDoubleDisplayValue()
GetComputedUserDefinedValue()

空间变换

在三维空间里定义的三维模型,最后显示时都是投影到二维平面,比如在屏幕上显示。 三维到二维的投影包括透视投影(Perspective Projection)和正交投影(Orthogonal Projection)。 正交投影也叫平行投影。

VTK 里与空间变换相关的类有 vtkTransfbrm2D, vtkTransform, vtkPerspectiveTransfbrm,
vtkGeneralTransfbrm, vtkTransfbrmFiIter, vtkMatrix4X4
下面代码实现了 vtkActor对象的空间变换:

    vtkSmartPointer<vtkTransform> transform = vtkSmartPointer<vtkTransform>::New();
    transform->PostMultiply();
    transform->RotateZ(20);
    transform->Translate(100,20,100);
    cylinderActor->SetUserTransform(transform);

先定义了 vtkTransform对象,并设置使算变换矩阵。RotateZ。设置绕Z轴旋转 40° 。并使用 Translate设置平移大小为(10,0,0),最后通过 vtkActor::SetUserTransform() 方法设置户定义的变换矩阵,实现模型的空间变换。

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: QT是一个跨平台的C++图形界面应用程序框架,VTK是一个用于可视化和图形处理的开源库,而PRO脚本则是为了编写QTVTK程序而设计的脚本语言。 在使用QTVTK开发可视化应用程序时,PRO脚本可以帮助我们简化代码编写和操作。 在编写QT VTK程序时,PRO脚本可以用来管理程序的构建过程。我们可以编写一个.pro文件,其中包含编译、链接和运行程序所需的信息和指令。PRO脚本可以指定程序所依赖的库、头文件的路径和源文件的位置等等。通过简单地修改.pro文件,我们就可以非常方便地修改程序的编译和链接选项。 此外,PRO脚本还可以用来配置QTVTK程序的构建环境。我们可以通过指定不同的编译器、库和路径来定制程序的运行环境。PRO脚本可以帮助我们在不同的平台上使用相同的代码进行构建。 在QTVTK程序中,使用PRO脚本可以提高代码的可维护性和可重用性。我们可以将一些公共的编译和链接选项抽象为变量,在不同的项目中进行复用。此外,PRO脚本还可以定义自定义的构建目标,以及一些自定义的构建规则。 总之,QT VTK PRO脚本是用于编写QTVTK程序时的一种工具。它可以帮助我们管理程序的构建过程和配置环境,提高代码的可维护性和可重用性,使我们能够更方便地开发和调试可视化应用程序。 ### 回答2: Qt VTK Pro脚本是用于在Qt框架中集成VTK(Visualization Toolkit)库的一种脚本。VTK是一个用于三维可视化、图像处理和计算几何方面的开源工具包,提供了丰富的功能和算法用于处理和呈现三维数据。 Qt VTK Pro脚本主要用于简化在Qt应用程序中使用VTK库的过程。它提供了一种方便的方法来创建和管理VTK对象、渲染场景、添加交互功能等。使用该脚本,开发人员可以更轻松地将VTK功能集成到他们的Qt应用程序中。 通过Qt VTK Pro脚本,开发人员可以使用VTK库创建各种类型的3D图形,包括几何体、图像数据、曲线、体积数据等。它还提供了各种渲染技术,如体积渲染、剖面渲染、表面渲染等。 此外,Qt VTK Pro脚本还支持用户交互,允许用户与创建的3D图形进行交互。这可以通过添加鼠标事件、键盘事件等来实现。用户可以旋转、平移、缩放图形,选择对象、改变物体的属性等。 总之,Qt VTK Pro脚本为开发人员提供了一种快速、简便的方式来在他们的Qt应用程序中集成VTK库,从而使他们能够利用VTK的强大功能来处理和呈现三维数据。它使得开发3D可视化应用程序变得更加高效和灵活。 ### 回答3: Qt VTK Pro 脚本是一个用于与QtVTK和Pro软件集成的脚本。 Qt是一个跨平台的C++图形用户界面开发框架,它提供了丰富的GUI组件和工具,使开发人员能够方便地创建功能强大的应用程序。 VTK(Visualization Toolkit)是一个用于可视化和图形处理的开源软件库。它提供了许多可用于创建复杂可视化效果的算法和工具。 Pro是一种为软件项目管理而设计的构建工具。它提供了一种简单且强大的方式来构建、部署和管理软件项目。 Qt VTK Pro脚本的目的是将QtVTK和Pro集成在一起,以便更方便地开发、构建和管理应用程序。 通过使用Qt VTK Pro脚本,开发人员可以使用Qt的GUI组件来构建应用程序的用户界面。他们还可以使用VTK的算法和工具来创建复杂的可视化效果。同时,Pro工具使开发人员能够更轻松地构建、部署和管理他们的应用程序。 Qt VTK Pro脚本的使用可以在许多领域发挥作用。例如,在科学可视化中,它可以用于创建漂亮的3D可视化效果。在工程领域,它可以用于可视化和分析复杂的CAD数据。在医学图像处理中,它可以用于创建精确的医学图像可视化。 总之,Qt VTK Pro 脚本提供了一个强大的工具集,使开发人员能够更方便地将QtVTK和Pro集成在一起,从而创建出功能丰富、具有复杂可视化效果的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值