三维程序设计中,通常会在控件窗口中设置和显示坐标轴系线,方便操作和使用。VTY库中提供vtkAxesActor类,方便用户快捷实现三维坐标的实现。效果如下:
C#核心代码如下:
vtkAxesActor axesActor = vtkAxesActor.New(); // 创建“坐标”角色
render1.AddActor(axesActor); // 渲染坐标角色
说明:
1.坐标原点位于世界坐标系的(0,0,0)点。
2. 坐标自带箭头和默认颜色、大小。
3.坐标对象自带带告示板效果的“X”,“Y”和“Z”。
4.坐标轴会自动与视点控件联动(不需要另外编程)。
5.可通过vtkTransform类的设定,移动、旋转和缩放坐标轴。
6.可通过设定 vtkAxesActor的属性改变坐标轴颜色等属性。
提供renderWindowControl1的Load事件C#源代码,供大家调试使用。请特别注意坐标轴的旋转和缩放参数的设置,这可能导致坐标轴变形。
private void renderWindowControl1_Load(object sender, EventArgs e)
{
// 1.Create a simple sphere. A pipeline is created.
// 1.新建球体,创建“管道pipeline”。
// --- 1.1 新建数据--“数据源Source”---
// (1)球体
vtkSphereSource sphere = vtkSphereSource.New(); // 新建球
sphere.SetThetaResolution(8); // 设置球纬度参数
sphere.SetPhiResolution(16); // 设置球经度参数
sphere.SetRadius(0.1); // 设置球的半径
// (2)柱体
vtkCylinderSource cylinder = vtkCylinderSource.New();
cylinder.SetHeight(1.0);
cylinder.SetRadius(0.05);
cylinder.SetResolution(10);
// (3)3D文字
vtkVectorText text3D = new vtkVectorText();
text3D.SetText("VTK");
// --- 1.2 数据加工 -- "过滤器Filter" -- 收缩 ---
vtkShrinkPolyData shrink = vtkShrinkPolyData.New(); // 新建数据收缩操作器
shrink.SetInputConnection(sphere.GetOutputPort()); // 连接管道
shrink.SetShrinkFactor(1.0); // 收缩“面”操作
// --- 1.3 数据制图 -- "制图器Mapper" ---
// (1)球体
vtkPolyDataMapper sphereMapper = vtkPolyDataMapper.New(); // 新建制图器
sphereMapper.SetInputConnection(shrink.GetOutputPort()); // 连接管道
// (2)柱体
vtkPolyDataMapper cylinderMapper = vtkPolyDataMapper.New(); // 新建制图器
cylinderMapper.SetInputConnection(cylinder.GetOutputPort()); // 连接管道
// (3)3D文字
vtkPolyDataMapper text3DMapper = vtkPolyDataMapper.New();
text3DMapper.SetInputConnection(text3D.GetOutputPort());
// 2.The actor links the data pipeline to the rendering subsystem
// 2.创建“角色Actor”,连接“管道pipeline”和“渲染系统rendering subsystem”
// --- 2.1 新建角色--“角色Actor”---
// (1)球体
vtkActor sphereActor = vtkActor.New(); // 新建角色
sphereActor.SetMapper(sphereMapper); // 传递制图器
sphereActor.GetProperty().SetColor(1, 0, 0); // 设置“角色”颜色[RGB]
// (2)柱体
vtkActor cylinderActor = vtkActor.New(); // 新建角色
cylinderActor.SetMapper(cylinderMapper); // 传递制图器
cylinderActor.GetProperty().SetColor(0, 1, 0); // 设置“角色”颜色[RGB]
vtkTransform transform = vtkTransform.New(); // 空间变换对象
transform.PostMultiply(); // 设置右乘变换矩阵
transform.RotateX(60); // 绕X轴旋转60度
transform.RotateZ(30); // 绕Z轴旋转30度
//transform.Scale(2.0, 1.0, 1.0); // 沿X个方向放大2倍
transform.Translate(2.0, 0.0, 0.0); // 沿X轴移动2.0个单位
cylinderActor.SetUserTransform(transform); // 柱体空间变换
// (3)3D文字
vtkFollower text3DActor = new vtkFollower();
text3DActor.SetMapper(text3DMapper);
text3DActor.SetScale(0.3, 0.3, 0.5); // 大小
text3DActor.AddPosition(0, 0, 0); // 位置(文字左下角坐标)
text3DActor.GetProperty().SetColor(0.0, 1.0, 0.0); // 颜色
// (4)坐标轴
vtkAxesActor axesActor = vtkAxesActor.New(); // 创建坐标轴角色
axesActor.SetUserTransform(transform); // 设置 坐标轴移动、旋转和缩放
// 2.2 Create components of the rendering subsystem
// --- 2.2 创建渲染--“渲染系统rendering subsystem”---
// (1)新建“渲染器Renderer”和“渲染窗口RenderWindow”
// renderWindowControl1控件提供“渲染窗口”
//vtkRenderer ren1 = renderWindowControl1.RenderWindow.GetRenderers().GetFirstRenderer();
vtkRenderer render1 = vtkRenderer.New(); // 新建渲染器
vtkRenderWindow renWin = renderWindowControl1.RenderWindow;
renWin.AddRenderer(render1); // 添加渲染器
// Add the actors to the renderer, set the window size
// (2)将“角色Actor”添加到“渲染器Renderer”并渲染
render1.AddActor(cylinderActor);
render1.AddActor(sphereActor);
//render1.AddActor(text3DActor);
text3DActor.SetCamera(render1.GetActiveCamera());
render1.AddViewProp(text3DActor);
render1.AddActor(axesActor); // 渲染坐标轴角色
render1.SetBackground(0.0, 0.0, 0.0); //设置背景颜色
renWin.Render(); // 渲染渲染窗口
//renWin.Start();
// (3)设置"相机Camera"
vtkCamera camera = render1.GetActiveCamera(); // 新建相机
camera.Zoom(1.0); // 相机缩放
}