计算机图像学里广泛应用的坐标系统有四种,分别是:模型坐标系统(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 }