計算機圖像學里廣泛應用的坐標系統有四種,分別是:模型坐標系統(model),世界坐標系統(world),視圖坐標系統(view)和顯示坐標系統(display)。
模型坐標系統就是定義模型時所用的坐標系統,通常就是笛卡爾坐標系統,以inches或meters為單位。
世界坐標系統就是三維空間中放置actors的坐標系統,actor的其中一個責任就是負責轉換模型坐標系統中的坐標到世界坐標系統中去。每一個模型都有其自己的模型坐標系統,但是它們只有一個共同的世界坐標系統。世界坐標系統也是放置和定位照相機(camera)和光源(light)的坐標系統。
視圖坐標系統表示照相機可見的一個系統,由x,y值組成,范圍位於(-1,1),z值表示深度坐標。x,y值指定物體在圖像平面的位置,而z值表示的是離照相機的距離。照相機的位置信息是由一個4*4的矩陣來表示的,這個矩陣用於把世界坐標變換為視圖坐標。顯示坐標系統以像素為單位,屏幕上顯示的窗體的大小決定了如何把范圍為(-1,1)的視圖坐標系統映射到以像素為單位的顯示坐標系統。這就涉及到視口的概念,我們可以渲染四個不同的場景,然后把這四個不同的場景放置在同一個窗口當中(看程序操作)。視口的x,y取值為(0,1),顯示坐標系統里的z值也表示深度信息。
參考代碼如下:
1 #include <vtkAutoInit.h> 2 VTK_MODULE_INIT(vtkRenderingOpenGL2); 3 VTK_MODULE_INIT(vtkInteractionStyle); 4 #include <vtkConeSource.h> 5 #include <vtkCubeSource.h> 6 #include <vtkCylinderSource.h> 7 #include <vtkSphereSource.h> 8 #include <vtkPolyDataMapper.h> 9 #include <vtkRenderer.h> 10 #include <vtkRenderWindow.h> 11 #include <vtkActor.h> 12 #include <vtkRenderWindowInteractor.h> 13 #include <vtkSmartPointer.h> 14 15 int main() 16 { 17 vtkSmartPointer<vtkConeSource> cone = vtkSmartPointer<vtkConeSource>::New(); 18 vtkSmartPointer<vtkCubeSource> cube = vtkSmartPointer<vtkCubeSource>::New(); 19 vtkSmartPointer<vtkCylinderSource> cylinder = vtkSmartPointer<vtkCylinderSource>::New(); 20 vtkSmartPointer<vtkSphereSource> sphere = vtkSmartPointer<vtkSphereSource>::New(); 21 22 vtkSmartPointer<vtkPolyDataMapper> coneMapper = vtkSmartPointer<vtkPolyDataMapper>::New(); 23 coneMapper->SetInputConnection(cone->GetOutputPort()); 24 vtkSmartPointer<vtkPolyDataMapper> cubeMapper = vtkSmartPointer<vtkPolyDataMapper>::New(); 25 cubeMapper->SetInputConnection(cube->GetOutputPort()); 26 vtkSmartPointer<vtkPolyDataMapper> cylinderMapper = vtkSmartPointer<vtkPolyDataMapper>::New(); 27 cylinderMapper->SetInputConnection(cylinder->GetOutputPort()); 28 vtkSmartPointer<vtkPolyDataMapper> sphereMapper = vtkSmartPointer<vtkPolyDataMapper>::New(); 29 sphereMapper->SetInputConnection(sphere->GetOutputPort()); 30 31 vtkSmartPointer<vtkActor> coneActor = vtkSmartPointer<vtkActor>::New(); 32 coneActor->SetMapper(coneMapper); 33 vtkSmartPointer<vtkActor> cubeActor = vtkSmartPointer<vtkActor>::New(); 34 cubeActor->SetMapper(cubeMapper); 35 vtkSmartPointer<vtkActor> cylinderActor = vtkSmartPointer<vtkActor>::New(); 36 cylinderActor->SetMapper(cylinderMapper); 37 vtkSmartPointer<vtkActor> sphereActor = vtkSmartPointer<vtkActor>::New(); 38 sphereActor->SetMapper(sphereMapper); 39 40 vtkSmartPointer<vtkRenderer> renderer1 = vtkSmartPointer<vtkRenderer>::New(); 41 renderer1->AddActor(coneActor); 42 renderer1->SetBackground(1.0, 0.3, 0.2); 43 renderer1->SetViewport(0.0, 0.0, 0.5, 0.5); 44 vtkSmartPointer<vtkRenderer> renderer2 = vtkSmartPointer<vtkRenderer>::New(); 45 renderer2->AddActor(cubeActor); 46 renderer2->SetBackground(0.2, 1.0, 0.6); 47 renderer2->SetViewport(0.5, 0.0, 1.0, 0.5); 48 vtkSmartPointer<vtkRenderer> renderer3 = vtkSmartPointer<vtkRenderer>::New(); 49 renderer3->AddActor(cylinderActor); 50 renderer3->SetBackground(0.2, 0.5, 1.0); 51 renderer3->SetViewport(0.0, 0.5, 0.5, 1.0); 52 vtkSmartPointer<vtkRenderer> renderer4 = vtkSmartPointer<vtkRenderer>::New(); 53 renderer4->AddActor(sphereActor); 54 renderer4->SetBackground(1.0, 1.0, 0.3); 55 renderer4->SetViewport(0.5, 0.5, 1.0, 1.0); 56 57 vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New(); 58 renWin->AddRenderer(renderer1); 59 renWin->AddRenderer(renderer2); 60 renWin->AddRenderer(renderer3); 61 renWin->AddRenderer(renderer4); 62 renWin->SetSize(640, 480); 63 renWin->Render(); 64 renWin->SetWindowName("ViewFour"); 65 66 vtkSmartPointer<vtkRenderWindowInteractor> interactor = 67 vtkSmartPointer<vtkRenderWindowInteractor>::New(); 68 interactor->SetRenderWindow(renWin); 69 70 renWin->Render(); 71 interactor->Initialize(); 72 interactor->Start(); 73 74 return EXIT_SUCCESS; 75 }