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.總結視圖

一張圖可以考驗之前學過的知識是否真正的理解了!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM