C# VTK 交互式小坐标轴盒

点击坐标轴盒的每个面可以切换视角。

这个坐标系盒子是由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

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你可以使用C#VTK(Visualization Toolkit)来显示坐标轴。下面是一个简单的示例代码: ```csharp using Kitware.VTK; class Program { static void Main(string[] args) { // 创建一个vtkRenderer vtkRenderer renderer = vtkRenderer.New(); // 创建一个vtkRenderWindow vtkRenderWindow renderWindow = vtkRenderWindow.New(); renderWindow.AddRenderer(renderer); // 创建一个vtkRenderWindowInteractor vtkRenderWindowInteractor interactor = vtkRenderWindowInteractor.New(); interactor.SetRenderWindow(renderWindow); // 创建一个vtkAxesActor vtkAxesActor axesActor = vtkAxesActor.New(); // 设置坐标轴的长度和标签的可见性 axesActor.SetTotalLength(1, 1, 1); axesActor.SetXAxisLabelText("X"); axesActor.SetYAxisLabelText("Y"); axesActor.SetZAxisLabelText("Z"); axesActor.GetXAxisCaptionActor2D().SetVisibility(1); axesActor.GetYAxisCaptionActor2D().SetVisibility(1); axesActor.GetZAxisCaptionActor2D().SetVisibility(1); // 将坐标轴添加到渲染器中 renderer.AddActor(axesActor); // 渲染并启动交互器 renderWindow.Render(); interactor.Start(); } } ``` 这段代码创建了一个vtkRenderWindow和一个vtkRenderer,并将vtkAxesActor添加到渲染器中。然后通过设置坐标轴的长度和标签可见性来自定义坐标轴。最后,渲染并启动交互器以显示窗口和坐标轴。 确保你已经将VTK库添加到你的项目中,并将其引用添加到代码文件中。此外,你可能还需要通过NuGet包管理器安装VTK库。 希望这个示例能帮助到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值