zoukankan      html  css  js  c++  java
  • vtk类之vtkTransform 和 vtkTransformFilter:对可视化管线中的点坐标进行齐次坐标转换

    vtkTransform 

    描述通过一个 4 × 4 矩阵的线性变换
    VtkTransform 可以用于描述线性的完整范围 (也称为仿射) 坐标转换在三个维度,内部表示为 4 x 4 齐次变换矩阵。当您创建新的 vtkTransform 时,它总是初始化为标识转换。
    SetInput() 方法允许您设置另一种转换,替换身份转换。有一个管道机制来确保当修改输入,则当前转换将相应更新。这种管道机制也支持由 Concatenate() 方法。
    在 PostMultiply 模式下,额外的转换将由当前矩阵表示任何转换之后发生。
    此类执行所有业务在右手坐标系中用右手旋转。剩下的一些图形库使用左手坐标系统和旋转。
     
    vtkTransformFilter 是一个筛选器来变换的点的坐标和关联的点法线向量。其他点数据被通过筛选器。
    一种替代方法是使用 vtkActor 的方法来缩放、 旋转和平移对象。这两种方法之间的区别是 vtkActor 的转换只是影响那里呈现对象的 (通过图形管线),而 vtkTransformFilter 实际修改可视化管线中的点坐标。这是必要的需要作为输入的点的坐标的某些对象 (例如,vtkProbeFilter)。
     
    基本方法:
    Identity()  把vtkTransform重置成标准状态。
       Elements:
          1 0 0 0 
          0 1 0 0 
          0 0 1 0 
          0 0 0 1

    GetPosition ()从该矩阵中,返回位置点 如原始矩阵RotateY(90),得到位置(0.0, 0.0, 0.0) 

    GetOrientationWXYZ ()从矩阵中,返回角度+ 方向量 如原始矩阵RotateY(90),(90.0, 0.0, 1.0, 0.0)

    RotateX,RotateY,RotateZ 该方法,分别围绕X,y,z 轴,顺时针旋转一定角度。如 RotateZ(30) 则,GetOrientationWXYZ() == (29.999999999999993, 0.0, 0.0, 1.0)

    Translate (double x, double y, double z)平移矩阵。

        tf.Translate(3, 4, 5)
        tf.RotateZ(90)

        print tf.GetPosition (), tf.GetOrientation(),tf.GetOrientationWXYZ()

        结果:(3.0, 4.0, 5.0)  (90.0, 0.0, 0.0, 1.0) 

      

     
    例子:
    #-*- coding: UTF-8 -*-
    #-------------------------------------------------------------------------------
    # Name:        模块2
    # Purpose:
    #
    # Author:      ankier
    #
    # Created:     18-12-2012
    # Copyright:   (c) Administrator 2012
    # Licence:     <your licence>
    #-------------------------------------------------------------------------------
    
    from ActorFactory import ActorFactory
    
    from vtk import *
    ## @detal 地球类
    class TransformActorFactory(ActorFactory):
        def __init__(self):
            ActorFactory.__init__(self)        
            self.__ElevationFilter = vtkElevationFilter()   
            
            self.__ElevationFilter.SetLowPoint(0, 0, -0.5)
            self.__ElevationFilter.SetHighPoint(0, 0, 0.5)     
            
        def _MakeActors(self):
            sphere = vtkSphereSource()
            sphere.SetThetaResolution(8)
            sphere.SetPhiResolution(8)
            sphere.SetRadius(20)
            transform = vtkTransform()
            transform.Scale(0.5, 1.5, 2.0)
            transformFilter = vtkTransformFilter()
            transformFilter.SetInput(sphere.GetOutput())
            transformFilter.SetTransform(transform)
            
            self.__ElevationFilter.SetInput(transformFilter.GetOutput())
            
            polyDataMapper = vtkPolyDataMapper()
            polyDataMapper.SetInput(self.__ElevationFilter.GetOutput())
            actor = self._NewActor()
            actor.SetMapper(polyDataMapper)
            #actor.GetProperty().SetColor((0.5, 0.7, 0.2))
            
            return [actor]
        
        def __del__(self):
            del self.__EarthSource
            

    运行结果:

     
  • 相关阅读:
    创建网络数据集
    [虚拟机]Virtual Box的使用--共享文件夹
    MapControl图层删除或添加触发监听事件
    Dev控件GridView单元格绑定控件
    Log4net中换行符
    没有为 COM 互操作注册程序集 请使用 regasm.exe /tlb 注册该程序集——解决办法
    加载dll过程中assembly失败
    Spring Boot 自带缓存及结合 Redis 使用
    Spring Boot + Redis 初体验
    在 Windows 中使用 C# 启动其他程序
  • 原文地址:https://www.cnblogs.com/ankier/p/2824056.html
Copyright © 2011-2022 走看看