计算机图像学里广泛应用的坐标系统有四种,分别是:模型坐标系统(model),世界坐标系统(world),视图坐标系统(view)和显示坐标系统(display)
①模型坐标系统:定义模型时所用的坐标系统,通常就是笛卡尔坐标系统,以inches或meters为单位。之前我们定义一个vtkConeSource,其实就是一个模型坐标系统里的模型。
②世界坐标系统:三维空间中放置actors的坐标系统,actor的其中一个责任就是负责转换模型坐标系统中的坐标到世界坐标系统中去。每一个模型都有其自己的模型坐标系统,但是它们只有一个共同的世界坐标系统。世界坐标系统也是放置和定位照相机(camera)和光源(light)的坐标系统。
③视图坐标系统:表示照相机可见的一个系统,由x,y值组成,范围位于(-1,1),z值表示深度坐标。x,y值指定物体在图像平面的位置,而z值表示的是离照相机的距离。照相机的位置信息是由一个4*4的矩阵来表示的,这个矩阵用于把世界坐标变换为视图坐标。
④显示坐标系统:以像素为单位,屏幕上显示的窗体的大小决定了如何把范围为(-1,1)的视图坐标系统映射到以像素为单位的显示坐标系统。这就涉及到视口的概念,我们可以渲染两个不同的场景,然后把这两个不同的场景放置在同一个窗口当中(看程序操作)。视口的x,y取值为(0,1),显示坐标系统里的z值也表示深度信息。
代码;
1 //tips:如果不是用cmake编译,而是用vs编译的,需要加这三行。 2 #include "vtkAutoInit.h" 3 VTK_MODULE_INIT(vtkRenderingOpenGL2); // VTK was built with vtkRenderingOpenGL2 4 VTK_MODULE_INIT(vtkInteractionStyle); 5 6 #include <vtkConeSource.h> 7 #include <vtkCubeSource.h> 8 #include <vtkRenderer.h> 9 #include <vtkPolyDataMapper.h> 10 #include <vtkRenderWindow.h> 11 #include <vtkActor.h> 12 #include <vtkRenderWindowInteractor.h> 13 14 int main() 15 { 16 vtkConeSource *cone = vtkConeSource::New(); 17 cone->SetResolution(8); 18 cone->SetHeight(5); 19 cone->SetRadius(3); 20 21 vtkCubeSource *cube = vtkCubeSource::New(); 22 23 vtkPolyDataMapper *coneMapper = vtkPolyDataMapper::New(); 24 //coneMapper->SetInputData(cone->GetOutput()); 25 coneMapper->SetInputConnection(cone->GetOutputPort()); 26 27 vtkPolyDataMapper *cubeMapper = vtkPolyDataMapper::New(); 28 /*cubeMapper->SetInputData(cube->GetOutput());*/ 29 cubeMapper->SetInputConnection(cube->GetOutputPort()); 30 31 vtkActor *vtkactor = vtkActor::New(); 32 vtkactor->SetMapper(coneMapper); 33 34 vtkActor *vtkactor2 = vtkActor::New(); 35 vtkactor2->SetMapper(cubeMapper); 36 37 vtkRenderer *render = vtkRenderer::New(); 38 render->AddActor(vtkactor); 39 render->SetBackground(0.1, 0.2, 0.3); 40 render->SetViewport(0, 0, 0.5, 1.0); 41 42 vtkRenderer *render2 = vtkRenderer::New(); 43 render2->AddActor(vtkactor2); 44 render2->SetBackground(0.1, 0.2, 0); 45 render2->SetViewport(0.5, 0, 1.0, 1.0); 46 47 vtkRenderWindow *window = vtkRenderWindow::New(); 48 window->SetSize(500, 500); 49 window->AddRenderer(render); 50 window->AddRenderer(render2); 51 52 vtkRenderWindowInteractor *interactor = vtkRenderWindowInteractor::New(); 53 interactor->SetRenderWindow(window);//关联要交互的窗口 54 55 window->Render(); 56 57 interactor->Initialize(); 58 interactor->Start(); 59 60 return 0; 61 }
效果图:
注意:如果不加vtkRenderWindowInteractor,窗口会一闪而过。
注:viewport的解释图。一个窗口可以分为四部分,用左下和右上的坐标就可以确定。