zoukankan      html  css  js  c++  java
  • VTK 坐标系统及空间变换(窗口-视图分割)

    1.坐标系统

    计算机图形学里常用的坐标系统主要有四种,分别是:Model坐标系统、World坐标系统、View坐标系统和Display坐标系统,以及两种表示坐标点的方式:以屏幕像素值为单位和归一化坐标值(各坐标轴取值都为[-1, 1])。
    Model坐标系统是定义模型时所采用的坐标系统,通常是局部的笛卡尔坐标系。例如,我们要定义一个表示球体的Actor,一般的做法是将该球体定义在一个柱坐标系统里。
    World坐标系统是放置Actor的三维空间坐标系,Actor其中的一个功能就是负责将模型从Model坐标系统变换到World坐标系统。每一个模型可以定义有自己的Model坐标系统,但World坐标系只有一个,每一个Actor必须通过放缩、旋转、平移等操作将Model坐标系变换到World坐标系。World坐标系同时也是相机和光照所在的坐标系统。
    View坐标系统表示的是相机所看见的坐标系统。X、Y、Z轴取值为[-1, 1],X、Y值表示像平面上的位置,Z值表示到相机的距离。相机负责将World坐标系变换到View坐标系。

    坐标之间的关系如下图所示:

    Display坐标系统跟View坐标系统类似,但是各坐标轴的取值不是[-1, 1],而是使用屏幕像素值。屏幕上显示的不同窗口的大小会影响View坐标系的坐标值[-1, 1]到Display坐标系的映射。可以把不同的渲染场景放在同一个窗口进行显示,例如,在一个窗口里,分为左右两个渲染场景,这左右的渲染场景(vtkRenderer)就是不同的视口(Viewport)。

    2.一个窗口分割为多个视窗

     1 /*****************************************************
     2 *Overview:窗口分割   2016-11-25 
     3 *Tsinghua Univ.  All Rights Reserved@Shenchunxu
     4 ******************************************************/
     5 #include <vtkAutoInit.h>
     6 VTK_MODULE_INIT(vtkRenderingOpenGL);
     7 #include <vtkConeSource.h>
     8 #include <vtkCubeSource.h>
     9 #include <vtkCylinderSource.h>
    10 #include <vtkSphereSource.h>
    11 #include <vtkPolyDataMapper.h>
    12 #include <vtkRenderer.h>
    13 #include <vtkRenderWindow.h>
    14 #include <vtkActor.h>
    15 #include <vtkRenderWindowInteractor.h>
    16 #include <vtkSmartPointer.h>
    17  
    18 int main()
    19 {
    20     vtkSmartPointer<vtkConeSource> cone = vtkSmartPointer<vtkConeSource>::New();
    21     vtkSmartPointer<vtkCubeSource> cube = vtkSmartPointer<vtkCubeSource>::New();
    22     vtkSmartPointer<vtkCylinderSource> cylinder = vtkSmartPointer<vtkCylinderSource>::New();
    23     vtkSmartPointer<vtkSphereSource> sphere = vtkSmartPointer<vtkSphereSource>::New();
    24  
    25     vtkSmartPointer<vtkPolyDataMapper> coneMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    26     coneMapper->SetInputConnection(cone->GetOutputPort());
    27     vtkSmartPointer<vtkPolyDataMapper> cubeMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    28     cubeMapper->SetInputConnection(cube->GetOutputPort());
    29     vtkSmartPointer<vtkPolyDataMapper> cylinderMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    30     cylinderMapper->SetInputConnection(cylinder->GetOutputPort());
    31     vtkSmartPointer<vtkPolyDataMapper> sphereMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    32     sphereMapper->SetInputConnection(sphere->GetOutputPort());
    33  
    34     vtkSmartPointer<vtkActor> coneActor = vtkSmartPointer<vtkActor>::New();
    35     coneActor->SetMapper(coneMapper);
    36     vtkSmartPointer<vtkActor> cubeActor = vtkSmartPointer<vtkActor>::New();
    37     cubeActor->SetMapper(cubeMapper);
    38     vtkSmartPointer<vtkActor> cylinderActor = vtkSmartPointer<vtkActor>::New();
    39     cylinderActor->SetMapper(cylinderMapper);
    40     vtkSmartPointer<vtkActor> sphereActor = vtkSmartPointer<vtkActor>::New();
    41     sphereActor->SetMapper(sphereMapper);
    42  
    43     vtkSmartPointer<vtkRenderer> renderer1 = vtkSmartPointer<vtkRenderer>::New();
    44     renderer1->AddActor(coneActor);
    45     renderer1->SetBackground(1.0,0.0,0.0);
    46     renderer1->SetViewport(0.0,0.0,0.5,0.5);
    47     vtkSmartPointer<vtkRenderer> renderer2 = vtkSmartPointer<vtkRenderer>::New();
    48     renderer2->AddActor(cubeActor);
    49     renderer2->SetBackground(0.0,1.0,0.0);
    50     renderer2->SetViewport(0.5,0.0,1.0,0.5);
    51     vtkSmartPointer<vtkRenderer> renderer3 = vtkSmartPointer<vtkRenderer>::New();
    52     renderer3->AddActor(cylinderActor);
    53     renderer3->SetBackground(0.0,0.0,1.0);
    54     renderer3->SetViewport(0.0,0.5,0.5,1.0);
    55     vtkSmartPointer<vtkRenderer> renderer4 = vtkSmartPointer<vtkRenderer>::New();
    56     renderer4->AddActor(sphereActor);
    57     renderer4->SetBackground(1.0,1.0,0.0);
    58     renderer4->SetViewport(0.5,0.5,1.0,1.0);
    59  
    60     vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();
    61     renWin->AddRenderer(renderer1);
    62     renWin->AddRenderer(renderer2);
    63     renWin->AddRenderer(renderer3);
    64     renWin->AddRenderer(renderer4);
    65     renWin->SetSize( 640, 480 );
    66     renWin->Render();
    67     renWin->SetWindowName("ViewPort");
    68  
    69     vtkSmartPointer<vtkRenderWindowInteractor> interactor =
    70         vtkSmartPointer<vtkRenderWindowInteractor>::New();
    71     interactor->SetRenderWindow(renWin);
    72  
    73     renWin->Render();
    74     interactor->Initialize();
    75     interactor->Start();
    76  
    77     return EXIT_SUCCESS;
    78 }
    运行结果:

    3.空间变换

    遵循几何变换,已经详细论述过,不在多谈!

    4.总结视图

    一张图可以考验之前学过的知识是否真正的理解了!

  • 相关阅读:
    一步一步写平衡二叉树(AVL树)
    sql关键字
    Remoting技术的应用
    算法:最大公约数
    算法冒泡排序
    C#编码好习惯
    利用VB.Net编程实现PC与掌上电脑PPC间的双向通信
    .Net Remoting与Server 对象详解
    算法迭代和递归
    SQL关键字系列之:minus与intersect
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/14240994.html
Copyright © 2011-2022 走看看