自学内容网 自学内容网

VTK知识学习(9)-空间变换

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();

4、效果


原文地址:https://blog.csdn.net/weixin_45114627/article/details/143854484

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!