2

我正在做一个 vtk 程序,因为我需要使用 vtk 将窗口坐标映射到对象坐标

我有OpenGL代码:

  winX = 0.2;//some float values
  winY = 0.43;//some float values
  double posX, posY, posZ;

glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
glGetDoublev( GL_PROJECTION_MATRIX, projection );
glGetIntegerv( GL_VIEWPORT, viewport );
glReadPixels(winX, winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ)
gluUnProject(winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ);

我不知道如何使用 vtk 来做到这一点?任何帮助将不胜感激。我也用谷歌搜索并找到了一个解决方案来获取这样的模型视图矩阵

      renderWindow->GetRenderers()->GetFirstRenderer()->GetActiveCamera()->GetViewTransformMatrix();

但我不知道如何将窗口坐标映射到 vtk 中的对象坐标

4

2 回答 2

3

是的,VTK 可以将屏幕坐标映射到世界坐标。您可以根据需要调整以下代码(仅限 2D 案例以下):

// 1. Get the position in the widget.
int* clickPosition = this->GetInteractor()->GetEventPosition();
const int x = clickPosition[0];
const int y = clickPosition[1];

// 2. Transform screen coordinates to "world coordinates" i.e. into real coordinates.
vtkSmartPointer<vtkCoordinate> coordinate = vtkSmartPointer<vtkCoordinate>::New();
coordinate->SetCoordinateSystemToDisplay();
coordinate->SetValue(x, y, 0);
double* worldCoordinates = coordinate->GetComputedWorldValue(widget->GetRenderWindow()->GetRenderers()->GetFirstRenderer());

double worldX(worldCoordinates[0]), worldY(worldCoordinates[1]);
于 2019-04-02T08:38:05.863 回答
2

这是一个不适定问题,因为您无法从单个 2D 位置找到深度信息。在一般情况下,没有唯一的解决方案。

但是存在一些选择:

  1. 您已经完成了从对象坐标到屏幕坐标的投影,您可以将深度信息保存在某处以进行反投影。
  2. 您想在屏幕上获取对象的 3D 位置。所以你使用视频游戏技术,如光线追踪。这个想法是从相机发送一条射线,并将射线和物体之间的交点作为物体位置。它在 vtk https://blog.kitware.com/ray-casting-ray-tracing-with-vtk/在此处输入图像描述中实现。
于 2019-04-02T08:55:39.360 回答