点击坐标轴盒的每个面可以切换视角。
这个坐标系盒子是由6个plane 和 6个文本封装的,鼠标交互时判断是点击哪一个plane。vtk 原本有左下角坐标系的类但是无法实现自定义的形状且自定义交互,因此在查阅了vtk相关的源代码后发现,小坐标实际上是一个在场景Renderer 上面叠加了一个小的Renderer。
1.生成盒子模型添加到坐标系 Render
public vtkActor DrawPlane(Point3d normal, Point3d center, Point3d orgin, Point3d p1, Point3d p2, Point3d color)
{
vtkPlaneSource plane = new vtkPlaneSource();
plane.SetNormal(normal.X, normal.Y, normal.Z);
plane.SetCenter(center.X, center.Y, center.Z);
plane.SetOrigin(orgin.X, orgin.Y, orgin.Z);
plane.SetPoint1(p1.X, p1.Y, p1.Z);
plane.SetPoint2(p2.X, p2.Y, p2.Z);
plane.Update();
vtkPolyDataMapper mapper = new vtkPolyDataMapper();
mapper.SetInputData(plane.GetOutput());
mapper.Update();
vtkActor actor = new vtkActor();
actor.SetMapper(mapper);
actor.GetProperty().SetColor(color.X, color.Y, color.Z);
actor.PickableOn();
return actor;
}
public vtkFollower DrawVectorText(string text, Point3d pos, Point3d color)
{
vtkVectorText vectorText = new vtkVectorText();
vectorText.SetText(text);
vtkPolyDataMapper mapper = new vtkPolyDataMapper();
mapper.SetInputConnection(vectorText.GetOutputPort());
mapper.Update();
vtkFollower textActor = new vtkFollower();
textActor.SetMapper(mapper);
textActor.SetPosition(pos.X, pos.Y, pos.Z);
textActor.SetScale(4, 4, 4);
textActor.GetProperty().SetColor(color.X, color.Y, color.Z);
textActor.PickableOff();
return textActor;
}
2.交互判断
public void Set3DViewDirection(ViewDirectionType direction)
{
Camera.SetFocalPoint(0, 0, 0);
switch (direction)
{
case ViewDirectionType.None:
case ViewDirectionType.Default:
Camera?.SetPosition(0, 0, 1);
Camera?.SetViewUp(0, 1, 0);
return;
case ViewDirectionType.Front:
Camera?.SetPosition(0, 0, 1);
Camera?.SetViewUp(0, 1, 0);
break;
case ViewDirectionType.Back:
Camera?.SetPosition(0, 0, -1);
Camera.SetViewUp(0, 1, 0);
break;
case ViewDirectionType.Left:
Camera?.SetPosition(-1, 0, 0);
Camera.SetViewUp(0, 1, 0);
break;
case ViewDirectionType.Right:
Camera?.SetPosition(1, 0, 0);
Camera.SetViewUp(0, 1, 0);
break;
case ViewDirectionType.Top:
Camera?.SetPosition(0, 1, 0);
Camera.SetViewUp(0, 0, -1);
break;
case ViewDirectionType.Down:
Camera?.SetPosition(0, -1, 0);
Camera.SetViewUp(0, 0, 12);
break;
}
Camera?.Modified();
Renderer.SetActiveCamera(Camera);
Renderer.ResetCamera();
Renderer.ResetCameraClippingRange();
}
3.Render 叠加
三维场景:Renderer.SetLayer(0);
小坐标系:Renderer.SetLayer(1); Renderer.SetViewport(x1,y1,x2,y2);定位Renderer