如何在VTK中将世界坐标转换为视图坐标
How to convert world coordinate to view coordinate in VTK
在我的程序中(基于python),一个点需要从世界坐标([x,y,z])转换为视图坐标([j,k,t],j and k在-1 和 1 之间,t 是深度)在 VTK 中。我找到 vtkCoordinate
class 和 SetCoordinateSystemToView()
方法。但它不起作用。
coordinate = vtk.vtkCoordinate()
coordinate.SetCoordinateSystemToWorld()
coordinate.SetValue(x,y,z)
coordinate.SetCoordinateSystemToDisplay()
viewCoord=coordinate.GetComputedValue(renderer)
结果很奇怪,肯定是错的。有一些像GetComputedDisplayValue()
或GetComputedViewportValue()
这样的方法可以从一个坐标系得到相应的结果到显示或视口坐标系,但是没有像GetComputedViewValue()
这样的方法。很迷茫,求帮助
谢谢。
这个有效:
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!
classvtkCamera
中有一个方法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])
在我的程序中(基于python),一个点需要从世界坐标([x,y,z])转换为视图坐标([j,k,t],j and k在-1 和 1 之间,t 是深度)在 VTK 中。我找到 vtkCoordinate
class 和 SetCoordinateSystemToView()
方法。但它不起作用。
coordinate = vtk.vtkCoordinate()
coordinate.SetCoordinateSystemToWorld()
coordinate.SetValue(x,y,z)
coordinate.SetCoordinateSystemToDisplay()
viewCoord=coordinate.GetComputedValue(renderer)
结果很奇怪,肯定是错的。有一些像GetComputedDisplayValue()
或GetComputedViewportValue()
这样的方法可以从一个坐标系得到相应的结果到显示或视口坐标系,但是没有像GetComputedViewValue()
这样的方法。很迷茫,求帮助
谢谢。
这个有效:
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!
classvtkCamera
中有一个方法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])