一、引言

在进行三维可视化开发时,我们常常希望能够清晰了解模型在空间中的位置、方向与比例关系。而最直观的辅助工具就是三维坐标轴(Axes)。在 VTK 中,vtkAxesActor 提供了一种开箱即用的方式来将 X、Y、Z 三个方向的坐标轴渲染到场景中,增强空间感知。

本篇我们将通过一个完整的 C++ 示例,逐步分析如何使用 VTK 构建一个包含:

  • 一个球体模型;
  • 一组平移后的三维坐标轴;
  • 基本的摄像机旋转与视图设置;

    的基础渲染场景。

二、工程代码一览

以下是完整的 C++ 示例代码,使用 VTK 官方推荐的 vtkNew<> 智能指针风格:

#include <vtkActor.h>
#include <vtkAxesActor.h>
#include <vtkCamera.h>
#include <vtkCaptionActor2D.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPolyDataMapper.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkSphereSource.h>
#include <vtkTextProperty.h>
#include <vtkTransform.h>

主函数部分:

int main()
{
// 1. 配色工具
vtkNew<vtkNamedColors> colors; // 2. 球体模型源
vtkNew<vtkSphereSource> sphereSource;
sphereSource->SetRadius(0.5);
sphereSource->SetCenter(0.0, 0.0, 0.0); // 3. 几何映射器
vtkNew<vtkPolyDataMapper> sphereMapper;
sphereMapper->SetInputConnection(sphereSource->GetOutputPort()); // 4. 渲染实体(Actor)
vtkNew<vtkActor> sphereActor;
sphereActor->SetMapper(sphereMapper); // 5. 渲染器设置
vtkNew<vtkRenderer> renderer; // 6. 渲染窗口
vtkNew<vtkRenderWindow> renderWindow;
renderWindow->SetWindowName("Axes");
renderWindow->AddRenderer(renderer);
renderWindow->SetSize(600, 600); // 7. 交互器
vtkNew<vtkRenderWindowInteractor> renderWindowInteractor;
renderWindowInteractor->SetRenderWindow(renderWindow); // 8. 添加球体到场景
renderer->AddActor(sphereActor);
renderer->SetBackground(colors->GetColor3d("CadetBlue").GetData()); // 9. 添加三维坐标轴 + 位移
vtkNew<vtkTransform> transform;
transform->Translate(1.0, 0.0, 0.0); // 坐标轴右移 1 个单位 vtkNew<vtkAxesActor> axes;
axes->SetUserTransform(transform); // 应用变换
renderer->AddActor(axes); // 10. 调整相机角度
renderer->GetActiveCamera()->Azimuth(50);
renderer->GetActiveCamera()->Elevation(-30);
renderer->ResetCamera(); // 11. 启动渲染
renderWindow->Render();
renderWindowInteractor->Start(); return 0;
}

三、关键组件详解

1️⃣ vtkSphereSource:几何体数据源

vtkSphereSource 用于生成球体模型,它是 VTK 所有可视化的起点之一,输出一个标准的 vtkPolyData 数据集。

  • SetRadius(double) 设置球的半径;
  • SetCenter(x, y, z) 设置球心位置。
sphereSource->SetRadius(0.5);
sphereSource->SetCenter(0.0, 0.0, 0.0);

2️⃣ vtkAxesActor:三维坐标轴

vtkAxesActor 是 VTK 中专门用于展示三维坐标轴的 Actor,它默认显示:

  • 红色 X 轴、绿色 Y 轴、蓝色 Z 轴;
  • 带箭头;
  • 自动加粗与缩放;
  • 显示 X/Y/Z 标签。
vtkNew<vtkAxesActor> axes;
axes->SetUserTransform(transform); // 应用平移变换

如果不使用 SetUserTransform(),坐标轴将默认出现在场景原点。

可选配置项包括:

axes->SetTotalLength(1.0, 1.0, 1.0);     // 设置轴长
axes->SetShaftTypeToCylinder(); // 轴样式:Cylinder / Line / Tube
axes->SetAxisLabels(1); // 是否显示 X/Y/Z 标签
axes->SetCylinderRadius(0.02); // 粗细设置

3️⃣ vtkTransform:变换控制

VTK 中通过 vtkTransform 控制 Actor 的位置、旋转与缩放。它支持:

  • 平移:Translate(x, y, z)
  • 旋转:RotateX(angle) / RotateY(angle) / RotateZ(angle)
  • 缩放:Scale(x, y, z)

这些变换可以用来控制 vtkAxesActorvtkActor 等在场景中的最终位置。


4️⃣ 渲染管线简介

这是一个典型的 VTK 可视化管线结构:

[数据源] → [Mapper] → [Actor] → [Renderer] → [RenderWindow]

在本例中:

  • vtkSphereSource 是数据源;
  • vtkPolyDataMapper 负责几何数据 → 图元 → GPU;
  • vtkActor 作为场景中的实体节点;
  • vtkRenderer 管理场景和相机;
  • vtkRenderWindow 是输出窗口;
  • vtkRenderWindowInteractor 提供交互能力。

四、运行效果示意图(概念图)

你将在窗口中看到一个淡蓝背景下的球体和一组 RGB 三维坐标轴,坐标轴出现在球体右侧,并有箭头和字母标识方向。


五、进阶拓展建议

功能 类名 简介
显示多个模型 vtkAppendPolyData 合并多个几何对象
场景交互标尺 vtkOrientationMarkerWidget 显示一个固定角落坐标轴
精细轴控制 vtkAnnotatedCubeActor 创建可标注的方向方块
GUI 集成 Qt + VTK 可嵌入 Qt 窗口构建完整应用

六、总结

在本文中,我们构建了一个基础的 VTK 可视化程序,展示了以下核心技能:

  • 使用 vtkSphereSource 构建几何体;
  • 使用 vtkAxesActor 添加坐标轴辅助信息;
  • 使用 vtkTransform 控制坐标轴位置;
  • 使用摄像机控制展示角度;
  • 构建完整的 VTK 渲染管线。

坐标轴是三维场景中不可或缺的空间参考工具,也是后续可视化操作(如配准、交互、测量)的基础。


VTK 入门系列之二:为三维场景添加坐标轴的更多相关文章

  1. Cordova入门系列(二)分析第一个helloworld项目 转发 https://www.cnblogs.com/lishuxue/p/6015420.html

    Cordova入门系列(二)分析第一个helloworld项目   版权声明:本文为博主原创文章,转载请注明出处 上一章我们介绍了如何创建一个cordova android项目,这章我们介绍一下创建的 ...

  2. Disruptor 系列(二)使用场景

    Disruptor 系列(二)使用场景 今天用一个订单问题来加深对 Disruptor 的理解.当系统中有订单产生时,系统首先会记录订单信息.同时也会发送消息到其他系统处理相关业务,最后才是订单的处理 ...

  3. Spring Boot入门系列(二十)快速打造Restful API 接口

    spring boot入门系列文章已经写到第二十篇,前面我们讲了spring boot的基础入门的内容,也介绍了spring boot 整合mybatis,整合redis.整合Thymeleaf 模板 ...

  4. HTML和CSS 入门系列(二):文字、表单、表格、浮动、定位、框架布局、SEO

    上一篇:HTML和CSS 入门系列(一):超链接.选择器.颜色.盒模式.DIV布局.图片 一.文字 1.1 属性 1.2 字体样式:font-family 1.3 字体大小:font-size 1.4 ...

  5. 爬虫入门系列(二):优雅的HTTP库requests

    在系列文章的第一篇中介绍了 HTTP 协议,Python 提供了很多模块来基于 HTTP 协议的网络编程,urllib.urllib2.urllib3.httplib.httplib2,都是和 HTT ...

  6. OPEN(SAP) UI5 学习入门系列之二: 最佳实践练习(上)

    这篇博文难产了很久,原来是打算一周更新一篇的,上周原计划写MVC,但是写了一半,发现带入了太多的细节,不太符合这个入门系列的主题. 当我们学习一个新的技能的时候,如果一开始就面对大量的细节,很容易陷入 ...

  7. SuperMap iObject入门开发系列之二地下三维管线系统介绍

    本文是一位好友“托马斯”授权给我来发表的,介绍都是他的研究成果,在此,非常感谢. 上次对超图平台组件式开发进行介绍,这次介绍的是基于这个框架开发的地下三维管线系统.地下管线涉及给水.雨水.污水.燃气. ...

  8. Maven 项目管理工具基础入门系列(二)

    一.前言 在 Maven 项目管理工具基础知识系列(一) 这篇文章中,我们已经初步了解了 Maven,也知道了使用 Maven 作为项目管理工具的好处,特别是已经知道如何快速通过 Maven 构建 W ...

  9. Spring Boot 入门系列(二十三)整合Mybatis,实现多数据源配置!

    d之前介绍了Spring Boot 整合mybatis 使用注解方式配置的方式实现增删改查以及一些复杂自定义的sql 语句 .想必大家对spring boot 项目中,如何使用mybatis 有了一定 ...

  10. Spring Boot 入门系列(二十五)读取配置文件的几种方式详解!

    在项目开发中经常会用到配置文件,之前介绍过Spring Boot 资源文件属性配置的方法,但是很多朋友反馈说介绍的不够详细全面.所以, 今天完整的分享Spring Boot读取配置文件的几种方式! S ...

随机推荐

  1. .NET中优雅使用Patch: JsonPatch

    引言 在现代 Web API 开发中,我们经常需要对资源进行部分更新(Partial Update).传统的 PUT 请求会要求发送整个对象,而 PATCH 请求可以仅发送需要更新的字段.ASP.NE ...

  2. LangChain基础篇 (04)

    LangChain 核心模块:Data Conneciton - Document Loaders 使用文档加载器从源中加载数据作为文档.一个文档是一段文字和相关的元数据. 如,有用于加载简单 .tx ...

  3. Maven配置代理

    Maven配置代理 找到settings.xml文件: 通常位于Maven安装目录下的conf文件夹中.或者位于用户目录下的.m2文件夹中(例如:$HOME/.m2/settings.xml). 编辑 ...

  4. P3306 [SDOI2013] 随机数生成器 题解

    传送门 题解 思路 由题目中可知: \[\large x_i \equiv ax_{i-1}+b\pmod{p} \] 可以得出: \[\large t=x_{n+1} \equiv a^nx_1+b ...

  5. 低代码 + DeepSeek:赋能开发者,效率飞跃新高度

    活字格接入 DeepSeek 前段时间,小编陆续发布了关于葡萄城旗下产品 Wyn 和 SpreadJS 成功接入DeepSeek的技术文章,分享了两款产品与 DeepSeek 集成后的功能优势和应用场 ...

  6. 机器学习 | 强化学习(1) | 马尔科夫决策过程(MDP)概论

    最近在搞强化学习(Reinforcement Learning),打算把之前写的笔记整理一下 本文基于大卫 希尔维(David Silver)教授的强化学习概论课程,视频中所采用的样例学生马尔科夫链( ...

  7. ABC392E翻译

    AT_abc392_e [ABC392E] Cables and Servers 题目描述 有编号从 \(1\) 到 \(N\) 的 \(N\) 台服务器和编号从 \(1\) 到 \(M\) 的 \( ...

  8. ABAQUS弹塑性分析

    1. 弹塑性分析的主要问题 1.1 elastic-plastic deform behavior abaqus 默认的塑性表现行为是金属材料经典塑性理论,采用mises屈服面定义各向同性屈服. 一般 ...

  9. 考勤运行提示‘Length of values (115) does not match length of index (116) >>> ’

    源码 df['餐补'] = money_list 解决思路: 1.分别打印输出两个字段长度 本来以为是每个月的文件格式不一致导致有的文件好用有的文件不好用 经过耐心查看代码 前面的算法统计有一个本应该 ...

  10. stat() "/root/xxx/index.html" failed (13: Permission denied)

    前言 在 nginx 上部署静态网页报502,于是查看 nginx 错误日志 error_log /var/log/nginx/error.log;,却没有看到任何错误信息:访问 nginx活动日志 ...