【问题标题】:How to convert world coordinate to view coordinate in VTK如何将世界坐标转换为VTK中的视图坐标
【发布时间】:2021-11-27 20:43:58
【问题描述】:

在我的程序(基于python)中,需要将一个点从世界坐标([x,y,z])转换为视图坐标([j,k,t],j和k在-1和1之间,t 是 VTK 中的深度)。我用SetCoordinateSystemToView() 方法找到了vtkCoordinate 类。但它不起作用。

coordinate = vtk.vtkCoordinate()
coordinate.SetCoordinateSystemToWorld()  
coordinate.SetValue(x,y,z)
coordinate.SetCoordinateSystemToDisplay() 
viewCoord=coordinate.GetComputedValue(renderer)

结果很奇怪,而且肯定是错误的。有一些方法如GetComputedDisplayValue()GetComputedViewportValue() 可以从坐标系中得到相应的结果以显示或视口坐标系,但没有类似GetComputedViewValue() 的方法。很迷茫,求帮助 谢谢。

【问题讨论】:

    标签: vtk coordinate-systems


    【解决方案1】:

    vtkCamera 类中有一个方法world2ViewportMatrix=GetCompositeProjectionTransformMatrix(aspect,nearz,farz) 可以获取将世界坐标转换为视口坐标的矩阵。

    然后viewPortCoord=world2ViewportMatrix.MultiplyPoint([worldPosition[0],worldPosition[1],worldPosition[2],1])

    [viewPortCoord[0]/viewPortCoord[3], viewPortCoord[1]/viewPortCoord[3]]是视口坐标([-1,1]*[-1,1]),[viewPortCoord[2]/viewPortCoord[3]是深度([nearZ,farZ])

    【讨论】:

      【解决方案2】:

      这行得通:

      import vtk
      
      coordinate = vtk.vtkCoordinate()
      coordinate.SetCoordinateSystemToWorld()
      coordinate.SetValue(1,2,1)
      
      # test:
      from vedo import *
      plt = Plotter()
      print("press shift-I on the red dot, then press q")
      plt.show(Cube(), Point([1,2,1], r=20), axes=1)
      
      viewCoord = coordinate.GetComputedViewportValue(plt.renderer)
      print(viewCoord) # matches!
      

      【讨论】:

      • 谢谢。但是在我的程序(vtk 9.0.3)中,GetComputedViewportValue()GetComputedDisplayValue()的结果是一样的(像素坐标)。我想要的是带有深度信息的标准化显示坐标([0,1])。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多