VTK 入门系列之二:为三维场景添加坐标轴
一、引言
在进行三维可视化开发时,我们常常希望能够清晰了解模型在空间中的位置、方向与比例关系。而最直观的辅助工具就是三维坐标轴(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)
这些变换可以用来控制 vtkAxesActor、vtkActor 等在场景中的最终位置。
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 入门系列之二:为三维场景添加坐标轴的更多相关文章
- Cordova入门系列(二)分析第一个helloworld项目 转发 https://www.cnblogs.com/lishuxue/p/6015420.html
Cordova入门系列(二)分析第一个helloworld项目 版权声明:本文为博主原创文章,转载请注明出处 上一章我们介绍了如何创建一个cordova android项目,这章我们介绍一下创建的 ...
- Disruptor 系列(二)使用场景
Disruptor 系列(二)使用场景 今天用一个订单问题来加深对 Disruptor 的理解.当系统中有订单产生时,系统首先会记录订单信息.同时也会发送消息到其他系统处理相关业务,最后才是订单的处理 ...
- Spring Boot入门系列(二十)快速打造Restful API 接口
spring boot入门系列文章已经写到第二十篇,前面我们讲了spring boot的基础入门的内容,也介绍了spring boot 整合mybatis,整合redis.整合Thymeleaf 模板 ...
- HTML和CSS 入门系列(二):文字、表单、表格、浮动、定位、框架布局、SEO
上一篇:HTML和CSS 入门系列(一):超链接.选择器.颜色.盒模式.DIV布局.图片 一.文字 1.1 属性 1.2 字体样式:font-family 1.3 字体大小:font-size 1.4 ...
- 爬虫入门系列(二):优雅的HTTP库requests
在系列文章的第一篇中介绍了 HTTP 协议,Python 提供了很多模块来基于 HTTP 协议的网络编程,urllib.urllib2.urllib3.httplib.httplib2,都是和 HTT ...
- OPEN(SAP) UI5 学习入门系列之二: 最佳实践练习(上)
这篇博文难产了很久,原来是打算一周更新一篇的,上周原计划写MVC,但是写了一半,发现带入了太多的细节,不太符合这个入门系列的主题. 当我们学习一个新的技能的时候,如果一开始就面对大量的细节,很容易陷入 ...
- SuperMap iObject入门开发系列之二地下三维管线系统介绍
本文是一位好友“托马斯”授权给我来发表的,介绍都是他的研究成果,在此,非常感谢. 上次对超图平台组件式开发进行介绍,这次介绍的是基于这个框架开发的地下三维管线系统.地下管线涉及给水.雨水.污水.燃气. ...
- Maven 项目管理工具基础入门系列(二)
一.前言 在 Maven 项目管理工具基础知识系列(一) 这篇文章中,我们已经初步了解了 Maven,也知道了使用 Maven 作为项目管理工具的好处,特别是已经知道如何快速通过 Maven 构建 W ...
- Spring Boot 入门系列(二十三)整合Mybatis,实现多数据源配置!
d之前介绍了Spring Boot 整合mybatis 使用注解方式配置的方式实现增删改查以及一些复杂自定义的sql 语句 .想必大家对spring boot 项目中,如何使用mybatis 有了一定 ...
- Spring Boot 入门系列(二十五)读取配置文件的几种方式详解!
在项目开发中经常会用到配置文件,之前介绍过Spring Boot 资源文件属性配置的方法,但是很多朋友反馈说介绍的不够详细全面.所以, 今天完整的分享Spring Boot读取配置文件的几种方式! S ...
随机推荐
- 银杏叶也是yxy
今年下半年(9月后)第一个使我震撼而狂喜的书籍,金阁寺. 翻译是林少华.他翻译这个可比村上春树好多了 一切都像梦寐一般,一切都如此完美 完美的结构,完美的心理叙述,撕心裂肺的景色描写 战后无限的虚无与 ...
- C#实现文件的压缩和解压缩
原文链接:https://www.cnblogs.com/sunyaling/archive/2009/04/13/1434602.html 在C#中实现文件的压缩和解压缩,需要使用第三方的组建完成. ...
- ABB喷涂机器人维护保养
正确规范的ABB喷涂机器人保养能够最大限度保证机器人正常运行, 保证经济效率并提高产量.因此,预防性喷涂机器人保养是一项不可或缺的工作. ABB喷涂机器人正常运行每3年或10000小时后,则需要做一次 ...
- Android应用借助LinearLayout实现垂直水平居中布局
首先说的是LinearLayout布局下的居中一般是这样的: (注意:android:layout_width="fill_parent" android:layout_heigh ...
- autMan奥特曼机器人-对插件权限的管理
为了避免某些插件在用户不知情的情况下读取使用用户隐私数据,受" 安卓手机上安装的应用需申请电话.位置.通讯录等权限 "的启发,autMan增加了数据桶读取权限设置页面. 当前受限制 ...
- thinkphp或laravel连接sql server 2014数据库
问题描述:平时使用最多为mysql数据库,目前有项目数据库为sql server 2014,列出连接全过程 首先下载安装SQLserver的odbc开放数据库链连接,下载地址:https://lear ...
- Abaqus-Steady-State-Dynamic-Analysis的求解原理
0. 总括 基于模态的谐响应分析,可以通过扫频的方式求解频率范围内结构的线性稳态响应情况.阻尼是和频率相关的,但模态叠加法只需要知道n个模态阻尼即可推广到其他频率范围(原因详见文内公式). 1. 谐响 ...
- GitFlow ⼯作流
前言 Git 是一个开源分布式版本控制系统,它可以很方便的帮我们记录文件的改动,就像下面一样: 我们可以很快的跳到文件改动的某一个版本(就像时空穿梭一样). Git 在程序开发中,作为一个源码管理系统 ...
- Django实战项目-学习任务系统-配置定时调度任务
接着上期代码内容,继续完善优化系统功能. 本次增加配置定时调度任务功能,学习任务系统定时任务管理添加的定时学习任务,需要通过配置调度任务,定时发布周期性的学习任务. 以及每天定时发送学生用户属性值,积 ...
- 堆排序(topk 问题)(NB)
博客地址:https://www.cnblogs.com/zylyehuo/ # _*_coding:utf-8_*_ # 比较排序 import random def sift(li, low, h ...