VTK知识学习(8)-坐标系统
1、概述
计算机图形学里常用的坐标系统有4种:
1)、Model坐标系统。定义模型时所采用的坐标系统,通常是局部的笛卡儿坐标系。
2)、World坐标系统。是放置Actor的三维空间坐标系。
Actor(vtkActor类)其中的一个功能就是负责将模型从Model坐标系统变换到World坐标系统。
每一个模型可以定义自己的Model坐标,但World坐标系只有一个,每一个Actor必须通过放缩、放置、平移等操作将Model坐标变换到World坐标系。
World坐标系同时也是相机和灯光所在的坐标系统。
3)、view坐标系统。是相机所看见的坐标系统。
XYZ轴取值为[-1,1],XY值表示像平面上的位置,Z值表示到相机的距离。相机负责将World坐标系变换到View坐标系。
4)、Display坐标系统。与View坐标系统类似,但各坐标的坐标值不是[-1,1],而是使用屏幕像素值。
另外还有两种表示坐标点的方式:
以屏幕像素值为单位和归一化坐标值 。
它们之间的关系如图所示。
2、坐标系细分
Display X、Y轴的坐标取值为渲染窗口的像素值。坐标原点位于渲染窗口的左下角。
NORMALIZED DISPLAY X、Y轴坐标取值范围为[0,1],跟DISPLAY一样,也是定义在渲染窗口里的。
VIEWPORT X、Y的坐标值定义在视口或者渲染器(Renderer)里。
NORMALIZED VIEWPORT X、Y坐标值定义在视口或渲染器里,取值范围为[0,1].
VIEW X、Y、Z坐标值定义在相机所在的坐标系里,取值范围为[-1,1],Z值表示深度信息。
WORLD X、Y、Z坐标值定义在世界坐标系。
USERDEFINED 用户自定义坐标系统。
vtkCoordinate可以用来表示坐标系统,其内部提供了函数接口来定义坐标系统:
SetCoordinateSystemToDisplay()
SetCoordinateSystemToNormalizedDisplay()
SetCoordinateSystemToViewport()
SetCoordinateSystemToNormalizedViewport()
SetCoordinateSystemToView()
SetCoordinateSystemToWorld()
3、示例代码
vtkConeSource cone = vtkConeSource.New();
vtkCubeSource cube = vtkCubeSource.New();
vtkCylinderSource cylinder = vtkCylinderSource.New();
vtkSphereSource sphere = vtkSphereSource.New();vtkPolyDataMapper coneMapper = vtkPolyDataMapper.New();
coneMapper.SetInputConnection(cone.GetOutputPort());
vtkPolyDataMapper cubeMapper = vtkPolyDataMapper.New();
cubeMapper.SetInputConnection(cube.GetOutputPort());
vtkPolyDataMapper cylinderMapper = vtkPolyDataMapper.New();
cylinderMapper.SetInputConnection(cylinder.GetOutputPort());
vtkPolyDataMapper sphereMapper = vtkPolyDataMapper.New();
sphereMapper.SetInputConnection(sphere.GetOutputPort());vtkActor coneActor = vtkActor.New();
coneActor.SetMapper(coneMapper);
vtkActor cubeActor = vtkActor.New();
cubeActor.SetMapper(cubeMapper);
vtkActor cylinderActor = vtkActor.New();
cylinderActor.SetMapper(cylinderMapper);
vtkActor sphereActor = vtkActor.New();
sphereActor.SetMapper(sphereMapper);//将一个窗口分为4个视图
vtkRenderer renderer1 = vtkRenderer.New();
renderer1.AddActor(coneActor);
renderer1.SetBackground(1.0, 0.0, 0.0);
renderer1.SetViewport(0.0, 0.0, 0.5, 0.5);
vtkRenderer renderer2 = vtkRenderer.New();
renderer2.AddActor(cubeActor);
renderer2.SetBackground(0.0, 1.0, 0.0);
renderer2.SetViewport(0.5, 0.0, 1.0, 0.5);
vtkRenderer renderer3 = vtkRenderer.New();
renderer3.AddActor(cylinderActor);
renderer3.SetBackground(0.0, 0.0, 1.0);
renderer3.SetViewport(0.0, 0.5, 0.5, 1.0);
vtkRenderer renderer4 = vtkRenderer.New();
renderer4.AddActor(sphereActor);
renderer4.SetBackground(1.0, 1.0, 0.0);
renderer4.SetViewport(0.5, 0.5, 1.0, 1.0);vtkRenderWindow renWin = renderWindowControl.RenderWindow;
renWin.AddRenderer(renderer1);
renWin.AddRenderer(renderer2);
renWin.AddRenderer(renderer3);
renWin.AddRenderer(renderer4);
renWin.SetWindowName("Viewport");
renWin.Render();