(13)VTK C++开发示例 --- 透视变换

发布于:2025-04-22 ⋅ 阅读:(17) ⋅ 点赞:(0)


更多精彩内容
👉内容导航 👈
👉VTK开发 👈

1. 概述

在VTK(Visualization Toolkit)中,vtkPerspectiveTransformvtkTransform 都是用于几何变换的类,但它们有着显著的区别和不同的应用场景。
模块:CommonTransforms

功能和用途

vtkTransform

  • 功能vtkTransform 是一个通用的变换类,支持线性变换(如旋转、缩放、平移)和非线性变换(如仿射变换)。
  • 用途:主要用于三维空间中的几何变换,如模型的位置调整、旋转和缩放。

vtkPerspectiveTransform

  • 功能vtkPerspectiveTransform 是一种特殊的变换,用于模拟透视投影的效果。
  • 用途:主要用于模拟相机视角下的物体变换,常用于三维场景渲染中的视图变换。

变换类型

  • vtkTransform:支持各种类型的线性变换,包括平移(Translation)、旋转(Rotation)、缩放(Scaling)等。
  • vtkPerspectiveTransform:主要进行透视投影变换,这种变换会改变物体在视觉上的大小和形状,以模拟相机观察的效果。

数学表示

  • vtkTransform:通常使用4x4的齐次坐标矩阵来表示变换。
  • vtkPerspectiveTransform:虽然也可以使用4x4矩阵表示,但其内部实现和计算方式更多地考虑了透视投影的数学特性。
环境 说明
系统 ubuntu22.04、windows11
cmake 3.22、3.25
Qt 5.14.2
编译器 g++11.4、msvc2017
VTK 9.4.1

2. CMake链接VTK

cmake_minimum_required(VERSION 3.20 FATAL_ERROR) # 设置CMake最低版本
project(vtk2) # 设置项目名称
# 查找VTK库
find_package(VTK COMPONENTS
CommonCore
CommonTransforms
) 
if(NOT VTK_FOUND)
message("VTK not found")
return()
endif()

add_executable(vtk2 main.cpp) # 添加可执行文件

target_link_libraries(vtk2 PRIVATE ${VTK_LIBRARIES}) # 链接VTK库
vtk_module_autoinit(TARGETS vtk2 MODULES ${VTK_LIBRARIES}) # 初始化VTK模块

3. main.cpp文件

/********************************************************************************
* 文件名:   main.cpp
* 创建时间: 2025-03-13 20:41:02
* 开发者:   MHF
* 邮箱:     1603291350@qq.com
* 功能:     
*********************************************************************************/
#include<iostream>
#include<vtkMatrix4x4.h>  //矩阵
#include<vtkNew.h> //智能指针
#include<vtkPerspectiveTransform.h> //透视变换
#include<vtkTransform.h> //变换
using namespace std;

int main()
{
  vtkNew<vtkMatrix4x4> m; // 创建矩阵
  // 设置矩阵元素值
  m->SetElement(0, 0, 1);
  m->SetElement(0, 1, 2);
  m->SetElement(0, 2, 3);
  m->SetElement(0, 3, 4);

  m->SetElement(1, 0, 2);
  m->SetElement(1, 1, 2);
  m->SetElement(1, 2, 3);
  m->SetElement(1, 3, 4);

  m->SetElement(2, 0, 3);
  m->SetElement(2, 1, 2);
  m->SetElement(2, 2, 3);
  m->SetElement(2, 3, 4);

  m->SetElement(3, 0, 4);
  m->SetElement(3, 1, 2);
  m->SetElement(3, 2, 3);
  m->SetElement(3, 3, 4);

  vtkNew<vtkPerspectiveTransform> pt; // 创建透视变换
  pt->SetMatrix(m); // 设置矩阵

  vtkNew<vtkTransform> t; // 创建变换
  t->SetMatrix(m); // 设置矩阵

  double p[3] = {1, 2, 3}; // 点坐标

  double p1[3]; // 变换后的点坐标
  t->TransformPoint(p, p1); // 变换点坐标
  cout << "变换后的点坐标:" << p1[0] << " " << p1[1] << " " << p1[2] << endl;

  double p2[3]; // 透视变换后的点坐标
  pt->TransformPoint(p, p2); // 透视变换点坐标
  cout << "透视变换后的点坐标:" << p2[0] << " " << p2[1] << " " << p2[2] << endl;

  return 0;
}

4. 演示效果

PS E:\Code\C++\vtk1\build\Debug> ."E:/Code/C++/vtk1/build/Debug/vtk2.exe"
变换后的点坐标:18 19 20
透视变换后的点坐标:0.857143 0.904762 0.952381



网站公告

今日签到

点亮在社区的每一天
去签到