VTK 中的坐标变换 | 基础

VTK基础教程(1)- vtkPolyData 介绍 目录 VTK的编译与环境搭建 VTK一般渲染流程 VTK数据类型-vtkPolyData 使用vtk自带的多边形数据 使用自己创建的数据 添加顶点颜色 添加面颜色 VTK的编译与环境搭建 这部分目前已经有了大佬做了成熟的傻瓜式配置,大家可以参考这篇文章:VTK+VS2019(或其他版本均可) 傻瓜式一站式 配置_Nancy_fairy的博客-优快云博客_vs2019 vtk VTK一般渲染流程 这部分的介绍也很多,大家可以参考这篇文章:VTK笔记-了解VTK_黑山老妖的博客. 阅读详情

VTK 中的坐标变换 | 基础

前情提要

之前提到过 VTK 的坐标系统:VTK 三维场景。

在这里插入图片描述

VTK 坐标变换的三个原则

VTK 坐标变换的三个原则:

  • 对物体(们)进行变换和对摄像机进行变换能取得相同的效果。
  • 变换的本质是矩阵运算,所有的变换都能用一个矩阵表达。
  • 变换矩阵可以拆解成最基本的变换(移动、放缩、旋转)的有序组合。

预备知识

在计算机图形学中,我们用齐次坐标系表示坐标:

在这里插入图片描述

Translation 矩阵,用于移动物体的位置:

在这里插入图片描述

Translation 变换:

在这里插入图片描述

Scaling 矩阵,用于改变物体的大小:

在这里插入图片描述

Rotation 矩阵 —— X 轴旋转:

在这里插入图片描述

Rotation 矩阵 —— Y 轴旋转:

在这里插入图片描述

Rotation 矩阵 —— Z 轴旋转:

在这里插入图片描述

Rotation 矩阵 —— 自由旋转:

在这里插入图片描述

实例 1:旋转摄像机

在这里插入图片描述

编写一个 VTK 程序,读取一个模型并显示,同时显示坐标轴:

#include "VTKCoordinateTransform.h"

#include <vtkBYUReader.h>
#include <vtkNamedColors.h>
#include <vtkProperty.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkCamera.h>
#include <vtkRenderWindow.h>

VTKCoordinateTransform::VTKCoordinateTransform(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);

    this->_pVTKWidget = new QVTKOpenGLNativeWidget();
    this->setCentralWidget(_pVTKWidget);
    // this->showMaximized();

    vtkNew<vtkRenderer> renderer;
    this->_pVTKWidget->renderWindow()->AddRenderer(renderer);
    this->_pVTKWidget->renderWindow()->Render();

    this->_widgetCamOrien = vtkCameraOrientationWidget::New();
    this->_widgetCamOrien->SetParentRenderer(renderer);
    this->_widgetCamOrien->On();

    vtkNew<vtkNamedColors> colors;

    vtkNew<vtkBYUReader> cow;
    cow->SetFileName("cow.g");

    vtkNew<vtkPolyDataMapper> mapper;
    mapper->SetInputConnection(cow->GetOutputPort());

    vtkNew<vtkActor> actor;
    actor->SetMapper(mapper);
    actor->GetProperty()->SetColor(colors->GetColor3d("Gold").GetData());

    renderer->AddActor(actor);
    renderer->SetBackground(colors->GetColor3d("DarkSlateGray").GetData());
}

VTKCoordinateTransform::~VTKCoordinateTransform()
{
    delete this->_pVTKWidget;
    this->_widgetCamOrien->Delete();
}

运行效果:

在这里插入图片描述

添加以下代码,将摄像机在水平方向上旋转 90 度:

renderer->GetActiveCamera()->Azimuth(90);
renderer->ResetCamera();

运行效果:

在这里插入图片描述

实例 2:使用 vtkTransform 对模型进行平移

#include "VTKCoordinateTransform.h"

#include <vtkBYUReader.h>
#include <vtkNamedColors.h>
#include <vtkTransform.h>
#include <vtkTransformFilter.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkCamera.h>
#include <vtkRenderWindow.h>

VTKCoordinateTransform::VTKCoordinateTransform(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);

    this->_pVTKWidget = new QVTKOpenGLNativeWidget();
    this->setCentralWidget(_pVTKWidget);
    // this->showMaximized();

    vtkNew<vtkRenderer> renderer;
    this->_pVTKWidget->renderWindow()->AddRenderer(renderer);
    this->_pVTKWidget->renderWindow()->Render();

    this->_widgetCamOrien = vtkCameraOrientationWidget::New();
    this->_widgetCamOrien->SetParentRenderer(renderer);
    this->_widgetCamOrien->On();

    vtkNew<vtkNamedColors> colors;

    vtkNew<vtkBYUReader> cow;
    cow->SetFileName("cow.g");

    vtkNew<vtkPolyDataMapper> mapper;
    mapper->SetInputConnection(cow->GetOutputPort());

    vtkNew<vtkActor> actor;
    actor->SetMapper(mapper);
    actor->GetProperty()->SetColor(colors->GetColor3d("Gold").GetData());

    renderer->AddActor(actor);
    renderer->SetBackground(colors->GetColor3d("DarkSlateGray").GetData());

    vtkNew<vtkTransform> transform;
    transform->Translate(10, 0, 0);

    vtkNew<vtkTransformFilter> transFilter;
    transFilter->SetInputConnection(cow->GetOutputPort());
    transFilter->SetTransform(transform);

    vtkNew<vtkPolyDataMapper> transMapper;
    transMapper->SetInputConnection(transFilter->GetOutputPort());

    vtkNew<vtkActor> transActor;
    transActor->SetMapper(transMapper);
    transActor->GetProperty()->SetColor(colors->GetColor3d("Silver").GetData());

    renderer->AddActor(transActor);
}

VTKCoordinateTransform::~VTKCoordinateTransform()
{
    delete this->_pVTKWidget;
    this->_widgetCamOrien->Delete();
}

运行效果:

在这里插入图片描述

实例 3:使用 vtkTransform 对模型进行旋转

注释掉:

transform->Translate(10, 0, 0);

换成:

transform->RotateY(90);

运行效果:

在这里插入图片描述

或者换成:

transform->Translate(10, 0, 0);
transform->RotateY(90);
transform->Translate(-10, 0, 0);

运行效果:

在这里插入图片描述

其实,对 vtkActor 也可以直接旋转,仅推荐在做简单变换时使用:

actor->RotateY(45);
VTK使用指南:介绍 本章讨论了开发大型和/或复杂软件系统的一些问题,并描述了面向对象设计如何解决其中的许多问题。本章定义了面向对象建模和设计中使用的关键术语,并通过一个真实世界的例子进行了工作。本章最后简要介绍了一些面向对象的语言以及与面向对象可视化相关的一些问题。 阅读详情

相关推荐

ActiViz(VTK的C#库)学习使用心得之六:空间系统和坐标变换

1. 坐标系统 计算机三维图形学中,常用的坐标系统有:Model坐标,World坐标,View坐标和Display坐标。 (1)Model坐标,定义一个具体三维模型时所采用的坐标系,是一个局部笛卡尔坐标系。在VTK中,可以认为每一个"角色Act...

2009

VTK笔记——空间几何变换(Transform),平移、旋转和缩放

先看一张图,下图是一个三维的Cow, 试想在使用中,是否会遇到如下场景? 1.将Cow移动到某个位置 2.旋转Cow到背面 3.想看清楚Cow面部的细节,改变它大小等等 可能你会说,这还不简单,通过操作相机就好了。操作相机,使得相机的空间位置发生了变化,但对三维物体的空间位置并没有改变,要想改变模型的空间位置,就需要对模形本身做空间变换。 空间变换的基础知识 变换矩阵(Trans...

Andy的专栏 3万+

vtkTransform 空间变换

图像处理与VTK/ITK文章列表 VTK笔记——空间几何变换(Transform),平移、旋转和缩放 其中注意,在进行旋转和缩放操作时,都需要先将该polydata整体平移回它的中心位置,然后再进行旋转和缩放操作,最后再将其移回到原来的位置处。 vtkSmartPointer<vtkTransform> transform = vtkSmartPointer<vtkTra...

C++ 爱好者 make_it_simple888 2665

vtkTransform的一点理解

vtkAbstractTransform是所有几何变换类的基类, 提供了管线机制。基类中包括几个主要的变换函数如下图所示,用来对点、点的法向量、点的向量进行变换。

ljy338的博客 1100

vtk坐标变换:由UI鼠标位置得到一个像素的像素值

获取鼠标位置 //QVTKInteractor* m_interactor; int eventPosition[2]; m_interactor->GetEventPosition(eventPosition); 从鼠标位置得到世界坐标位置 //vtkSmartPointer<vtkRenderer> m_renderer; vtkNew<vtkCoordi...

C++ 爱好者 make_it_simple888 2409

VTK中的坐标变换(从图像坐标系到世界坐标系)

计算机图像学里广泛应用的坐标系统有四种,分别是:模型坐标系统(model),世界坐标系统(world),视图坐标系统(view)和显示坐标系统(display)①模型坐标系统:定义模型时所用的坐标系统,通常就是笛卡尔坐标系统,以inches或meters为单位。之前我们定义一个vtkConeSource,其实就是一个模型坐标系统里的模型。②世界坐标系统:三维空间中放置actors的坐标系统,actor的其中一个责任就是负责转换模型坐标系统中的坐标到世界坐标系统中去。

如果想成为中心,那么就到中心去吧。 334

VTK 中的坐标变换 | 进阶

VTK 中的坐标变换 | 进阶

ProgramNovice的博客 593

3.6 点云可视化——vtk可视化

本文介绍了VTK可视化管线的基本原理及其在点云可视化中的应用。VTK可视化管线由数据对象、处理对象(数据源、过滤器和映射器)和数据流方向三个要素构成,形成一个数据加工流水线。文章详细阐述了点云可视化流程,包括从文件读取数据、去噪处理、映射到图形元素并渲染显示的全过程。同时讲解了坐标变换、光照计算和投影等关键渲染原理。通过Python代码示例(包括基础可视化和进阶颜色映射技巧)展示了如何实现点云可视化,并介绍了VTK与PyQt5的GUI集成方法。这些技术可帮助开发者高效实现科学数据的可视化呈现。

qq625924821的博客 183

VTK生成网格平面全解析:管线架构、坐标变换与显示技巧

三维可视化开发中,结构化网格数据的构建与渲染是基础环节。VTK通过Source-Filter-Mapper-Actor的管线架构,将几何数据与显示逻辑解耦,使得网格平面的生成与变换更为灵活。理解vtkPolyData的拓扑结构、法向量方向与坐标变换原理,是避免模型发黑、网格线不显示或导出格式错误等常见问题的关键。本文从vtkPlaneSource的核心参数出发,结合线框/Surface显示模式切换、手动构建四边形网格、地形起伏与OBJ/STL导出等实践场景,系统梳理了网格平面从生成到落地的完整链路,为三维模

weixin_30785057的博客 187

【VTK-Rendering::Core】vtkCoordinate坐标系统

本文分享vtkCoordinate源码解析,并对VTK中的各种坐标变换进行分析,希望对各位小伙伴有所帮助!

qq_40041064的博客 1480

Python自动化车载测试:5分钟搞定CANoe COM接口调用(附完整代码)

本文详细介绍了如何使用Python快速实现CANoe COM接口调用,完成车载测试自动化。通过实战案例展示ECU信号测试框架搭建,包括环境配置、核心架构解析、信号读写封装及多线程安全方案,帮助开发者5分钟内掌握高效测试技巧。

vv45678的博客 1133

VTK坐标变换实战:从图像坐标系到世界坐标系的配置与验证

VTK坐标变换实战:用vtkTransform构建索引到世界坐标的4x4矩阵,配合vtkImageReslice与settings.json配置骨架,一步验证像素坐标映射是否准确。文中给出单点映射与vtkCoordinate交叉校验方法,并通过TaoToken统一API通道调用模型核对变换顺序,官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 可创建Key。

weixin_36238982的博客 6

【物理模拟】PBD算法详解

参考MatthiaMuller的十分钟物理(他就是PBD算法的发明者)

beidou111的博客 9499

VTK可交互三维坐标轴

因为实习工作需要制作一个可拖动的三维坐标系,制作这个坐标系,首先需要创建一些三维图形,接着需要熟悉交互模块和鼠标进行交互,最后将它们封装成一个`vtkWidget`类

Zz_er的博客 5734

利用HTML+CSS设计PPT:html-to-pptx实现自动化转换与可编辑输出

在办公自动化和前端开发领域,将网页技术应用于文档生成是一个重要的技术方向。其核心原理在于通过解析HTML/CSS的结构与样式,将其映射为目标文档的原生对象模型。这项技术的价值在于,它能够将Web技术栈强大的布局与样式能力(如Flexbox、CSS Grid)与办公软件(如Microsoft PowerPoint)的广泛兼容性和可编辑性相结合。在实际应用场景中,这种技术特别适合需要快速生成兼具设计感与实用性的演示文稿,例如数据报告、产品发布和营销材料。本文探讨的html-to-pptx项目正是这一思路的工程实

weixin_30652491的博客 487

【simulink模型】独立悬架振动模型,七自由度整车simulink模型

车辆悬架系统的设计对提升车辆行驶平顺性和操纵稳定性具有重要意义。本文构建了独立悬架的振动仿真模型以及七自由度整车动力学模型,基于 Simulink 平台实现对模型的动态响应仿真。通过对比不同工况下的车辆振动响应,验证了模型的准确性与实用性。研究结果为车辆悬架系统的优化设计提供了有力支持。

2401_84610415的博客 1584

VTK中获取STL模型点的坐标以及对其进行变换

  VTK是一个基于面向对象的开源三维绘图软件包,和其它的的三维绘图引擎如OSG、OGRE不同之处在于,VTK可视化对象主要是各种数据,更加注重对数据分析处理后的可视化,可视化的内容是人们无法直接感受到的东西,如地质构造、地层分布、矿床分布、三维空间应力场的状态变化等等,而OSG、OGRE是基于场景的可视化,更强调视觉感官的感受,所以OSG主要应用于虚拟现实领域,而VTK主要应用于科学计算可视化领...

weixin_30791095的博客 1705

如何利用DeepSeek自动生成PLC程序?

在工业自动化领域,PLC是核心控制设备,其编程效率和质量直接影响生产线的运行效果。 然而,传统PLC编程依赖工程师手动编写代码,不仅耗时耗力,还容易出错。通过自动生成PLC程序,DeepSeek不仅大幅提升了编程效率,还优化了代码质量。 那么DeepSeek到底能否自动生成PLC程序呢? 有位电气工程师就尝试让DeepSeek设计一套五层电梯控制系统的PLC程序,下面就让我们看看吧。 技术原理:DeepSeek如何实现自动编程DeepSeek利用自然语言处理技术,将工程师输入的文本指令转换为PLC代码。例

Qinmingyue13的博客 6179

VTK学习笔记(十五)vtk中的有些概念

VTK学习笔记(十五)vtk中的有些概念1、ijkras矩阵 1、ijkras矩阵 上面是一个spacing = 3mm, direction为 -1,-1,1的图像的ijk2ras矩阵。 原点是(235.5, 235.5, -618.5),可以理解为世界坐标系到RAS坐标系的一个变换Transform。 -3 0 0 235.5 0 -3 0 235.5 0 0 3 -618.5 0 0 0 1 ...

juluwangriyue的博客 773

Dify之八添加各种在线大模型

Dify之八添加各种在线大模型

yilvyangguang520的博客 941

2026年华为OD机试真题 新系统【点亮战争迷雾】

华为OD机试真题 8月18号 新系统【点亮战争迷雾】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【点亮战争迷雾】多语言题解。

qq_45776114的博客 495

VTK笔记-变换矩阵-vtkMatrix4x4类

vtkMatrix4x4   vtkMatrix4x4是一个用来表示和操作4阶矩阵的类。具体地说,它被设计用于使用4x4变换矩阵表示进行三维渲染时的齐次坐标[x y z w]。多数情况下采用行向量格式的16个double数组。注意,OpenGL以列向量格式存储矩阵,因此在OpenGL和VTK之间移动矩阵内容时,必须对矩阵内容进行转置。 接口   vtkMatrix4x4类中使用了一个public的double类型的二维数据的成员变量Element,记录了44个值;对应了一个44的齐次线性变换矩阵,第一列表

黑山老妖的博客 8181

HFSS实战项目——微带一分四功分器

呕心沥血保姆级教程!!!!手把手教会你做功分器,史上最详细步骤!!!

2401_87464239的博客 2674

vtk光照、颜色、相机、坐标系统及空间变换

vtkLight常的方法有: SetColor() — 设置光照的颜色,以RGB的形式指定颜色。 SetPosition() — 设置光照位置。 SetFocalPoint() — 设置光照焦点。 SetIntensity() — 设置光照的强度。 SetSwitch() / SwitchOn()/ SwitchOff()— 打开或关闭对应的光照。 确定相机实际

kateyabc的博客 6713

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

VTK教程(1):VTK基础知识

VTK(Visualization Toolkit)是一个功能强大的开源图形和可视化库,用于处理和可视化各种类型的数据,包括几何数据、图像、体数据、矢量场等。交互器包括鼠标交互器、键盘交互器和可视化交互器等,使用户能够与数据进行交互、旋转、缩放等操作。渲染器和可视化: VTK支持多种可视化技术,包括几何可视化、体数据和矢量场的可视化、表面重建、体积渲染等。渲染器用于将数据可视化并呈现在屏幕上。坐标系和变换: 了解VTK中的坐标系和变换是很重要的,特别是当需要在不同坐标系之间进行数据转换和可视化操作时。

qq_49149369的博客 6607

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

VTK 学习----VTK对象-算法类-vtkPointSetAlgorithm

4.5.5 vtkPointSetAlgorithm vtkAppendDataSets 将一个或多个数据集一起追加到单个输出vtkPointSet中。 vtkAppendDataSets是一个过滤器,它将一个或多个数据集附加到单个输出点集中。使用OutputDataSetType选项设置输出的类型。只有可以转换为选定输出数据集类型的输入才会附加到输出中。默认情况下,输出为vtkUnstruc...

charce_you的专栏 850

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

上一篇: Leetcode 第 134 场双周赛题解
下一篇: VTK 中的坐标变换 | 进阶
UestcXiye
博客等级 码龄8年 9030粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值