1、前言
在三维空间里定义的三维模型,最后显示时都是投影到二维平面,比如在屏幕上显示。
三维到二维的投影包括透视投影(Perspective Projection)和正交投影(Orthogonale Projection)。正交投影也叫平行投影。
变换的基本元素均是三维坐标点,三维坐标点(x,y,z)通常用齐次坐标(xh,yh,zh,wh)来表示。
若wh=0,则表示无穷远的点。
利用齐次坐标,可以将空间变换用4X4的矩阵来表示。平移、旋转、缩放等仿射变换都可以用矩阵相乘的形式表示。
VTK里与空间变换相关的类有:
vtkTransform2D、vtkTransform、vtkPerspectiveTransform、vtkGeneralTransform、vtkTransfromFilter、vtkMatrix4X4t等。
2、关键代码
vtkTransform transform = vtkTransform.New();
transform.PostMultiply();
transform.RotateZ(40); //设置绕Z轴旋转40度
transform.Translate(10, 0, 0); //平移大小(10,0,0);
actor.SetUserTransform(transform); //设置用户定义的变换矩阵,实现模型的空间变换。
先定义了 vtkTransform 对象,并设置使用右乘计算变换矩阵。
RotateZ()设置绕Z轴旋转40°,并使用 Translate()设置平移大小为(10,0,0),
最后通过 vtkActor::SetUserTransform()方法设置用户定义的变换矩阵,实现模型的空间变换。
3、完整代码
vtkCylinderSource cylinderSource = vtkCylinderSource.New();
cylinderSource.SetHeight(3.0);
cylinderSource.SetRadius(1.0);
cylinderSource.SetResolution(100);
vtkPolyDataMapper polyDataMapper = vtkPolyDataMapper.New();
polyDataMapper.SetInputConnection(cylinderSource.GetOutputPort());
vtkActor actor = vtkActor.New();
actor.SetMapper(polyDataMapper);
vtkTransform transform = vtkTransform.New();
transform.PostMultiply();
transform.RotateZ(40); //设置绕Z轴旋转40度
transform.Translate(10, 0, 0); //平移大小(10,0,0);
actor.SetUserTransform(transform); //设置用户定义的变换矩阵,实现模型的空间变换。
vtkRenderer renderer = vtkRenderer.New();
renderer.AddActor(actor);
renderer.SetBackground(0.3, 0.8, 0.7);
vtkLight myLigth = vtkLight.New();
myLigth.SetColor(0, 1, 1);
myLigth.SetPosition(0, 0, 1);
double[] infos = renderer.GetActiveCamera().GetFocalPoint();
myLigth.SetFocalPoint(infos[0], infos[1], infos[2]);
renderer.AddLight(myLigth);
vtkRenderWindow renWin = renderWindowControl.RenderWindow;
renWin.AddRenderer(renderer);
renWin.Render();