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

news2024/11/27 8:48:08

很高兴在雪易的CSDN遇见你 

VTK技术爱好者 QQ:870202403


前言

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

感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步!

你的点赞就是我的动力(^U^)ノ~YO


1. vtkCoordinate

        在VTK的各种坐标系统中,执行坐标变换,并表示位置(Position)。也可以创建一个相互引用的vtkCoordinate对象。

        vtkCoordinate对象允许引用,即一个vtkCoordinate对象A可以引用另一个vtkCoordinate对象B,vtkCoordinate对象B也可以引用其他vtkCoordinate对象,依此类推,但是不能形成自循环。这允许你创建像vtkActor2D这样的组合组,它们的位置相对于另一个。注意,在级联序列中,每个vtkCoordinate对象可以在不同的坐标系中指定!。例如在vtkCaptionActor2D的定义中AttachmentPointCoordinate在WORLD坐标系中指定;PositionCoordinate在DISPLAY坐标系中指定。

        VTK中的坐标系统有如下几种:

DISPLAY坐标系统:表示在窗口上的x,y的像素值

        最小值:(0, 0)表示左下角的第一个像素。

        最大值:(Size,Size)表示右上角的最后一个像素

NORMALIZED DISPLAY坐标系统:表示归一化后的窗口像素值。

        最小值:(0, 0)表示左下角的第一个像素。

        最大值:(1,1)表示右上角的最后一个像素

VIEWPORT坐标系统:表示Viewport上的x,y像素值

        最小值:(0, 0)表示左下角的第一个像素。

        最大值:(Size,Size)表示右上角的最后一个像素

NORMALIZED VIEWPORT坐标系统:表示归一化后的Viewport的像素值

        最小值:(0, 0)表示左下角的第一个像素。

        最大值:(1,1)表示右上角的最后一个像素

POSE坐标系统:WORLD坐标系统相对于相机位置和View方向进行的移动和旋转坐标系统。

VIEW坐标系统:相机所看到的坐标系统,取值为【-1,1】。x,y值表示像平面上的位置,Z值表示到相机的距离。相机负责将WORLD坐标系变换到VIEW坐标系。

WORLD坐标系统:世界坐标系

USERDEFINED坐标系统:表示在用户定义的坐标系统下的值。

2. VTK中各坐标系统关系

Model坐标系统:指定义模型时所采用的坐标系统。

World坐标系统:放置Actor的三维空间系统。

vtkActor负责将模型从Model坐标系转化到World坐标系。

VTK中一个窗口可以放置多个Renderer(即ViewPort)。

renderer1->SetViewport(0.,0.,0.5,0.5);
renderer1->SetViewport(0.,0.5,0.5,1.0);
renderer1->SetViewport(0.5,0.,1.,0.5);
renderer1->SetViewport(0.5,0.5,1.0,1.0);

3. vtkCoordinate重要参数

3.1 设置/获取当前的坐标系统

  //@{
  /**
   * Set/get the coordinate system which this coordinate
   * is defined in. The options are Display, Normalized Display,
   * Viewport, Normalized Viewport, View, and World.
   */
  vtkSetMacro(CoordinateSystem, int);
  vtkGetMacro(CoordinateSystem, int);
  void SetCoordinateSystemToDisplay() { this->SetCoordinateSystem(VTK_DISPLAY); }
  void SetCoordinateSystemToNormalizedDisplay()
  {
    this->SetCoordinateSystem(VTK_NORMALIZED_DISPLAY);
  }
  void SetCoordinateSystemToViewport() { this->SetCoordinateSystem(VTK_VIEWPORT); }
  void SetCoordinateSystemToNormalizedViewport()
  {
    this->SetCoordinateSystem(VTK_NORMALIZED_VIEWPORT);
  }
  void SetCoordinateSystemToView() { this->SetCoordinateSystem(VTK_VIEW); }
  void SetCoordinateSystemToPose() { this->SetCoordinateSystem(VTK_POSE); }
  void SetCoordinateSystemToWorld() { this->SetCoordinateSystem(VTK_WORLD); }
  //@}

  const char* GetCoordinateSystemAsString();

3.2 设置/获取坐标值

 //@{
  /**
   * Set/get the value of this coordinate. This can be thought of as
   * the position of this coordinate in its coordinate system.
   */
  vtkSetVector3Macro(Value, double);
  vtkGetVector3Macro(Value, double);
  void SetValue(double a, double b) { this->SetValue(a, b, 0.0); }
  //@}

3.3 设置/获取参考坐标系

  //@{
  /**
   * If this coordinate is relative to another coordinate,
   * then specify that coordinate as the ReferenceCoordinate.
   * If this is NULL the coordinate is assumed to be absolute.
   * 若该坐标A关联其他坐标B,则将坐标B设置为参考坐标;
   * 若参考坐标为孔,则该坐标A是绝对坐标系统下的坐标
   */
  virtual void SetReferenceCoordinate(vtkCoordinate*);
  vtkGetObjectMacro(ReferenceCoordinate, vtkCoordinate);
  //@}

3.4 设置关联的Viewport

  //@{
  /** 设置关联的viewport
   * If you want this coordinate to be relative to a specific
   * vtkViewport (vtkRenderer) then you can specify that here.
   * NOTE: this is a raw pointer, not a weak pointer nor a reference counted
   * object, to avoid reference cycle loop between rendering classes and filter
   * classes.
   */
  void SetViewport(vtkViewport* viewport);
  vtkGetObjectMacro(Viewport, vtkViewport);
  //@}

3.5 获取各坐标系下的值

  //@{
  /**
   * Return the computed value in a specified coordinate system.
   */
  double* GetComputedWorldValue(vtkViewport*) VTK_SIZEHINT(3);
  int* GetComputedViewportValue(vtkViewport*) VTK_SIZEHINT(2);
  int* GetComputedDisplayValue(vtkViewport*) VTK_SIZEHINT(2);
  int* GetComputedLocalDisplayValue(vtkViewport*) VTK_SIZEHINT(2);
  //@}

  double* GetComputedDoubleViewportValue(vtkViewport*) VTK_SIZEHINT(2);
  double* GetComputedDoubleDisplayValue(vtkViewport*) VTK_SIZEHINT(2);

  /**
   * GetComputedValue() will return either World, Viewport or
   * Display based on what has been set as the coordinate system.
   * This is good for objects like vtkLineSource, where the
   * user might want to use them as World or Viewport coordinates.
   */
  double* GetComputedValue(vtkViewport*) VTK_SIZEHINT(3);

  /**
   * GetComputedUserDefinedValue() is to be used only when
   * the coordinate system is VTK_USERDEFINED. The user
   * must subclass vtkCoordinate and override this function,
   * when set as the TransformCoordinate in 2D-Mappers, the user
   * can customize display of 2D polygons
   */
  virtual double* GetComputedUserDefinedValue(vtkViewport*) VTK_SIZEHINT(3) { return this->Value; }

4. vtkViewport进行坐标变换

上面RenderWindow的尺寸为(300,300),白色方框的Display坐标为(150,150),执行下面代码为:

  double XF = eventPos[0]; //XF = 150
  double YF = eventPos[1]; //YF = 150

  // convert to normalized viewport coordinates
  this->Renderer->DisplayToNormalizedDisplay(XF, YF); //XF = 150/300.=0.5;YF = 0.5;
  this->Renderer->NormalizedDisplayToViewport(XF, YF);//XF = 150;YF=150
  this->Renderer->ViewportToNormalizedViewport(XF, YF);//XF=0.5;YF=0.5;
void vtkViewport::DisplayToNormalizedDisplay(double& u, double& v)
{
  if (this->VTKWindow)
  {
    /* get physical window dimensions */
    const int* size = this->VTKWindow->GetSize();

    if (size && size[0] != 0 && size[1] != 0)
    {
      u = u / size[0];
      v = v / size[1];
    }
  }
}

//----------------------------------------------------------------------------
void vtkViewport::NormalizedDisplayToViewport(double& u, double& v)
{
  if (this->VTKWindow)
  {
    // get the pixel value for the viewport origin
    double vpou, vpov;
    vpou = this->Viewport[0];
    vpov = this->Viewport[1];
    this->NormalizedDisplayToDisplay(vpou, vpov);

    // get the pixel value for the coordinate
    this->NormalizedDisplayToDisplay(u, v);

    // subtract the vpo
    u = u - vpou;
    v = v - vpov;
  }
}

//----------------------------------------------------------------------------
void vtkViewport::ViewportToNormalizedViewport(double& u, double& v)
{
  if (this->VTKWindow)
  {
    /* get physical window dimensions */
    /*
      double vpsizeu, vpsizev;
      const int *size = this->VTKWindow->GetSize();
      vpsizeu = size[0]*(this->Viewport[2] - this->Viewport[0]);
      vpsizev = size[1]*(this->Viewport[3] - this->Viewport[1]);

      u = u/(vpsizeu - 1.0);
      v = v/(vpsizev - 1.0);
    */
    const int* size = this->GetSize();
    if (size && size[0] != 0 && size[1] != 0)
    {
      u = u / size[0];
      v = v / size[1];
    }
  }
}

结论:

        理解坐标变换是VTK用好的基础,小伙伴一定要理解。

感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步!

你的赞赏是我的最最最最大的动力(^U^)ノ~YO

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1342508.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

折磨人的回文数

题目: 描述 若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。 例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数…

idea的pom.xml文件灰色删除线解决办法

以上是点击了移除module后就变成这样 如果再次对着已移除的module右键会发现有个delete,点击这个是真删了,要谨慎备份哦 解决方案:恢复误操作remove module的解决方法 idea最右边,有个Maven控件,找到要恢复的module&a…

【C语言深度剖析——第一节(关键字1)】《C语言深度解剖》+蛋哥分析+个人理解

你未曾见过火光,难怪甘愿漂泊寒夜 本文由睡觉待开机原创,未经允许不得转载。 本内容在csdn网站首发 欢迎各位点赞—评论—收藏 如果存在不足之处请评论留言,共同进步! 首先简单介绍一下《C语言深度解剖》: 全书特点&am…

亚信安慧AntDB MTK数据同步工具之数据稽核

数据稽核是一种用于确保表数据准确性和一致性的重要方法,它涉及到检查数据的完整性、致性、有效性和合法性,以及与预期规范的匹配程度等多个方面。随着大数据时代的到来,通过有效的数据稽核,组织可以提高决策的准确性和效率&#…

【产品应用】一体化步进伺服电机在自动稀释仪中的应用

在许多化学实验和生物实验中,稀释是一个关键步骤。为了提高稀释的准确性和效率,自动稀释仪被广泛使用。随着科技的进步,一体化步进伺服电机在自动稀释仪中的应用越来越广泛,大大提高了仪器的性能和效率。本文将详细介绍一体化步进…

2024年起重机司机(限桥式起重机)证考试题库及起重机司机(限桥式起重机)试题解析

题库来源:安全生产模拟考试一点通公众号小程序 2024年起重机司机(限桥式起重机)证考试题库及起重机司机(限桥式起重机)试题解析是安全生产模拟考试一点通结合(安监局)特种作业人员操作证考试大纲和(质检局)特种设备作…

网页设计期末 建筑博物馆首页 HTML+CSS+js 完整代码(轮播图+瀑布流)

文章目录 前言:完整代码在总结处跳转!!! 描述:结果展示:部分代码演示:(完整代码在总结处跳转)总结:(完整代码在此处跳转) 前言&#x…

ELK----filebeat日志收集工具

ELK:filebeat日志收集工具和logstash相同 filebeat是一个轻量级的日志收集工具,所使用的系统资源比logstash部署和启动时使用的资源要小的多。 filebeat可以运行在非java环境。他可以代理logstash在非java环境上收集日志 filebeat无法实现数据的过滤&…

查看IOS游戏FPS

摘要 本篇技术博客将介绍如何使用克魔助手工具来查看iOS游戏的帧率(FPS)。通过克魔助手,开发者可以轻松监测游戏性能,以提升用户体验和游戏质量。 引言 在iOS游戏开发过程中,了解游戏的帧率对于优化游戏性能至关重要…

顶配版SAM:由分割一切迈向感知一切

文章目录 0. 前言1. 论文地址1.1 项目&代码1.2 模型地址1.3 Demo 2. 模型介绍2.1 亮点2.2 方法 3. 量化结果、可视化展示Reference 0. 前言 现有的视觉分割基础模型,如 SAM 及其变体,集中优势在形状、边缘等初级定位感知,或依赖外部模型…

MR实战:实现数据去重

文章目录 一、实战概述二、提出任务三、完成任务(一)准备数据文件1、在虚拟机上创建文本文件2、上传文件到HDFS指定目录 (二)实现步骤1、Map阶段实现(1)创建Maven项目(2)添加相关依赖…

红警1源代码下载,编译,单步调试操作步骤

注意视频无声音: 红警1代码单步调试操作步骤_哔哩哔哩_bilibili红警1,源代码下载,编译,单步调试操作步骤。1、下载代码:https://gitee.com/r77683962/CnC_Remastered_Collection/repository/archive/master.zip这里边…

Jackson ImmunoResearch纳米二抗(Nano Secondary Antibodies)

驼科,如羊驼和美洲驼,会产生一类独特的仅由重链组成的抗体。而抗原结合片段(Fab),也称为仅可变重链片段抗体(Variable Heavy-Chain only fragment antibodies,VHH片段),或纳米抗体,是一种新型抗体形式。凭借…

【MCAL】TC397+EB-tresos之MCU配置实战 - 芯片时钟

本篇文章介绍了在TC397平台使用EB-treso对MCU驱动模块进行配置的实战过程,主要介绍了后续基本每个外设模块都要涉及的芯片时钟部分,帮助读者了解TC397芯片的时钟树结构,在后续计算配置不同外设模块诸如通信速率,定时器周期等&…

rabbitmq使用总结

1、进入rabbitmq的sbin目录,进入CMD 2、输入./rabbitmq-plugins enable rabbitmq_management启用管理服务。 3、输入./rabbitmqctl start_app启动服务。 查看是否启动成功 1、浏览器访问http://localhost:15672/ 下载erlang 地址如下: http://erla…

三张表看懂POE POE+ POE++ 三个协议的相关参数

Hqst华强盛(盈盛电子)导读:三张表看懂POE POE POE 三个协议的相关参数。 一 ̖ POE协议区分: 802.3af(PoE) 百兆网络变压器H81621S 二 ̖ POE协议与受电设备(PD)工作功率分级 802.3at&#xf…

使用MySQL进行数据库表的基本操作

参考文章 http://www.ksqn.cn/news/1325.html 1. 创建表 语法: CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎;说明: field 表示列名datatype 表示列的类…

图片水印怎么去除?推荐三个去水印的方法

在我们搜集和整理图片素材的过程中,总会遇到一个让人头疼的问题——水印。这些水印不仅破坏了图片的整体美感,还极大地限制了图片的使用范围。然而,好消息是,我们并非束手无策,有多种方法可以帮助我们去除这些水印&…

Android 理解Context

文章目录 Android 理解ContextContext是什么Activity能直接new吗? Context结构和源码一个程序有几个ContextContext的作用Context作用域获取ContextgetApplication()和getApplicationContext()区别Context引起的内存泄露错误的单例模式View持有Activity应用正确使用…

OpenCV-Python(29):图像特征

目录 目标 背景介绍 常用特征 应用场景 目标 理解什么是图像特征 为什么图像特征很重要 为什么角点很重要 背景介绍 相信大多数人都玩过拼图游戏吧。首先你们拿到一张图片的一堆碎片,你要做的就是把这些碎片以正确的方式排列起来从而重建这幅图像。问题是&…