如何在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])