对于三维空间中的模型,它是投射到二维平面显示,很多时候,我们需要知道它在坐标系的位置或者相对于另一个模型的位置,又或者是它的法向量等,这时候借助显示坐标系就很有必要,下面的方法可能会帮助到你。

方法一

借助vtkLineSource来画三条线,分别是X, Y, Z轴,再给三条轴设置不同的color加以区分。

vtkSmartPointer<vtkLineSource> lineSourceX = vtkSmartPointer<vtkLineSource>::New();
lineSourceX->SetPoint1(0, 0, 0);
lineSourceX->SetPoint2(LINE_LEN, 0, 0);
lineSourceX->Update();
vtkSmartPointer<vtkLineSource> lineSourceY = vtkSmartPointer<vtkLineSource>::New();
lineSourceY->SetPoint1(0, 0, 0);
lineSourceY->SetPoint2(0, LINE_LEN, 0);
lineSourceY->Update();
vtkSmartPointer<vtkLineSource> lineSourceZ = vtkSmartPointer<vtkLineSource>::New();
lineSourceZ->SetPoint1(0, 0, 0);
lineSourceZ->SetPoint2(0, 0, LINE_LEN);
lineSourceZ->Update();
//--------------------------------------------
actor1[0]->GetProperty()->SetColor(1, 0, 0);
actor1[1]->GetProperty()->SetColor(0, 1, 0);
actor1[2]->GetProperty()->SetColor(0, 0, 1);

方法二

直接使用vtkAxesActor来显示坐标系,这也是比较推荐的方法

vtkSmartPointer<vtkAxesActor> actor2 = vtkSmartPointer<vtkAxesActor>::New();
actor2->SetPosition(0, 0, 0);
actor2->SetTotalLength(AXIS_LEN, AXIS_LEN, AXIS_LEN);
actor2->SetShaftType(0);
actor2->SetAxisLabels(0);
actor2->SetCylinderRadius(0.02);

效果如下图所示,Red, Green, Blue分别对应X,Y,Z三条轴:

示例代码

#include <vtkLineSource.h>
#include <vtkPolyData.h>
#include <vtkSmartPointer.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkProperty.h>
#include <vtkAxesActor.h>
#include <vtkConeSource.h>int main(int, char *[])
{vtkSmartPointer<vtkConeSource> sphereSource =vtkSmartPointer<vtkConeSource>::New();sphereSource->SetRadius(.5);sphereSource->SetCenter(0, 0, 0);vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();mapper->SetInputConnection(sphereSource->GetOutputPort());vtkSmartPointer<vtkActor> actor =vtkSmartPointer<vtkActor>::New();actor->SetMapper(mapper);
#define LINE_LEN 2.// #Method1vtkSmartPointer<vtkLineSource> lineSourceX = vtkSmartPointer<vtkLineSource>::New();lineSourceX->SetPoint1(0, 0, 0);lineSourceX->SetPoint2(LINE_LEN, 0, 0);lineSourceX->Update();vtkSmartPointer<vtkLineSource> lineSourceY = vtkSmartPointer<vtkLineSource>::New();lineSourceY->SetPoint1(0, 0, 0);lineSourceY->SetPoint2(0, LINE_LEN, 0);lineSourceY->Update();vtkSmartPointer<vtkLineSource> lineSourceZ = vtkSmartPointer<vtkLineSource>::New();lineSourceZ->SetPoint1(0, 0, 0);lineSourceZ->SetPoint2(0, 0, LINE_LEN);lineSourceZ->Update();vtkSmartPointer<vtkPolyDataMapper> MapperX = vtkSmartPointer<vtkPolyDataMapper>::New();MapperX->SetInputConnection(lineSourceX->GetOutputPort());vtkSmartPointer<vtkPolyDataMapper> MapperY = vtkSmartPointer<vtkPolyDataMapper>::New();MapperY->SetInputConnection(lineSourceY->GetOutputPort());vtkSmartPointer<vtkPolyDataMapper> MapperZ = vtkSmartPointer<vtkPolyDataMapper>::New();MapperZ->SetInputConnection(lineSourceZ->GetOutputPort());vtkSmartPointer<vtkActor> actor1[3];for (int i = 0; i < 3; i++){actor1[i] = vtkSmartPointer<vtkActor>::New();}actor1[0]->SetMapper(MapperX);actor1[1]->SetMapper(MapperY);actor1[2]->SetMapper(MapperZ);actor1[0]->GetProperty()->SetColor(1, 0, 0);actor1[1]->GetProperty()->SetColor(0, 1, 0);actor1[2]->GetProperty()->SetColor(0, 0, 1);actor1[0]->SetPosition(0, 0, 0);actor1[1]->SetPosition(0, 0, 0);actor1[2]->SetPosition(0, 0, 0);// #Method2vtkSmartPointer<vtkAxesActor> actor2 =vtkSmartPointer<vtkAxesActor>::New();actor2->SetPosition(0, 0, 0);actor2->SetTotalLength(LINE_LEN, LINE_LEN, LINE_LEN);actor2->SetShaftType(0);actor2->SetAxisLabels(0);actor2->SetCylinderRadius(0.02);vtkSmartPointer<vtkRenderer> renderer1 =vtkSmartPointer<vtkRenderer>::New();vtkSmartPointer<vtkRenderer> renderer2 =vtkSmartPointer<vtkRenderer>::New();vtkSmartPointer<vtkRenderWindow> renderWindow =vtkSmartPointer<vtkRenderWindow>::New();renderWindow->SetSize(800, 400);renderWindow->AddRenderer(renderer1);renderWindow->AddRenderer(renderer2);vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =vtkSmartPointer<vtkRenderWindowInteractor>::New();renderWindowInteractor->SetRenderWindow(renderWindow);double leftViewport[] = { 0.0, 0.0, 0.5, 1.0 };double rightViewport[] = { 0.5, 0.0, 1.0, 1.0 };for (int i = 0; i < 3; i++){renderer1->AddActor(actor1[i]);}renderer1->AddActor(actor);renderer2->AddActor(actor2);renderer2->AddActor(actor);renderer1->SetBackground(.3, .3, .5);renderer2->SetBackground(.2, .4, .5); renderer1->SetViewport(leftViewport);renderer2->SetViewport(rightViewport);renderWindow->Render();renderWindowInteractor->Start();return EXIT_SUCCESS;
}

Reference

shows how to display the coordinate axes in the render window

shows how to position an AxesActor in 3D

VTK笔记——如何显示三维坐标系相关推荐

  1. Unity学习笔记 球形全景图平面像素坐标与三维坐标系上的坐标之间的转换

    前言 本文将讲解如何通过球形全景图上的二维坐标通过换算得到三维坐标系上的三维坐标.具体场景就是,已知道一张全景图上某个点的像素位置(px,py),最终可以算出该点对应在球体上的三维坐标(X,Y,Z). ...

  2. matlab鼠标三维坐标点,请问如何用matlab画三维点,已知x,y,z的坐标,在三维坐标系上显示...

    点击查看请问如何用matlab画三维点,已知x,y,z的坐标,在三维坐标系上显示具体信息 答:例如 : X=1,Y=2,Z=3; 代码就是: plot3(1,2,3,'*') grid on%加网格 ...

  3. (c++)已知空间三维两个点坐标,得到直线方程以及两点之间所有的点,使用VTK进行绘制显示

    直线参数方程 如果是在二维坐标系下,已知两个点p1(x1, y1), p2(x2, y2), 很容易求得两点之间的斜率,然后使用y = kx + b计算出k,b值得到直线方程.同理在三维空间下仍然可以 ...

  4. 视觉SLAM笔记(6) 坐标系

    视觉SLAM笔记(6) 坐标系 1. 点和向量 2. 坐标系 2.1. 内积 2.2. 外积 1. 点和向量 日常生活的空间是三维的,因此生来就习惯于三维空间的运动 三维空间由三个轴组成,所以一个空间 ...

  5. MATLAB学习笔记——二维和三维绘图

    MATLAB学习笔记--二维和三维绘图 近期练习matlab的二维和三维绘图,整理一下,以防忘记. 文章目录 MATLAB学习笔记--二维和三维绘图 一.二维绘图 1.plot命令 2.fplot 命 ...

  6. WEB端显示三维地形模型

    注:正常在WEB上显示三维地形首选Cesium,本文内容仅作为研究,展示文章用DEM制作通用三维地形模型中制作的局部三维地形模型 Cesium是可以很容易的实现在WEB端三维地形的,下面的图是分别是使 ...

  7. matlab 三维y轴平面图,#如何在excel中绘制三维坐标系?#excel怎么画图平面坐标图...

    用excel绘制曲线图时如何进行坐标轴转换 点"插入"->"图表"->"XY图","子图表类型"选择&quo ...

  8. Python笔记:matplotlib 三维图表绘制方法简介

    Python笔记:三维图表绘制方法简介 1. python三维图表绘制方法简介 2. 实例说明 1. 三维曲线图绘制 2. 三维散点图绘制 3. 三维曲面图绘制 3. 参考链接 1. python三维 ...

  9. osgEarth使用笔记1——显示一个数字地球

    文章目录 1. 概述 2. 实现 2.1. 三维显示 2.2. 二维显示 1. 概述 osgEarth支持.earth格式的文件,里面保存了数字地球相关信息的配置XML,只需要读取这个配置文件,就可以 ...

最新文章

  1. Vue 2.5中将迎来有关TypeScript的改进!
  2. java list移除所有元素,从List中移除指定 List 中包含的其所有元素(可选操作)。...
  3. 三种SQLServer分页查询语句笔记
  4. 基础的shell编程问题(二)
  5. jqurey ajax 的动态添加二级联动下拉菜单
  6. 使用ASP.NET Core、JavaScript和Angular防止CSRF攻击
  7. oracle下tmp后缀文件怎么打开,什么是TMP文件,怎么打开?(图文)
  8. 【java与智能设备】CH11 Android中常见数据格式解析
  9. html工资计算页面模板,工资计算表Excel模板
  10. wowza 降低延迟
  11. 八个经验处理开关电源PCBLayout
  12. python发outlook邮件_通过Python发送Outlook电子邮件?
  13. 《Robust Consistent Video Depth Estimation》论文笔记
  14. centos查询 硬盘序列号查询_CentOS查看主板型号、CPU、显卡、硬盘等信息
  15. python中numpy.random.gamma()函数
  16. Apollo搭建使用
  17. IoC容器和 Dependency Injection模式 Inversion of Control Containers and the Dependency Injection pattern
  18. HTML+CSS+JS——动漫风二次元论坛(2页) HTML5网页设计成品_学生DW静态网页设计代做_web课程设计网页制作
  19. 钢铁企业以撮合模式切入B2B平台,汇聚势能实现价值最大化
  20. char 与Unicode编码

热门文章

  1. 分布式学习笔记---分布式系统的回顾与简介
  2. mysql注入 无回显_XML外部实体注入2:无回显的XXE
  3. 泡泡玛特启示录:如何让大众消费者染上收藏癖?【姜太公公】
  4. 微信小程序开发分销制度济南_微信小程序分销规则你清楚吗?
  5. 如何关闭建设银行信息服务器,建设银行用的什么云服务器
  6. 破坏之王-DDoS攻击与防范深度剖析
  7. 支付宝退款接口(即时到帐无密退款)
  8. 关于人工智能的一些想法
  9. android在Fragment做轮播图,Android Fragment沉浸式轮播图
  10. web网页大作业:基于html设计与实现的茶文化网站12页(带psd)