簡體   English   中英

如何使用VTK將窗口坐標映射到對象坐標

[英]How to map window coordinates into object coordinates using vtk

我正在執行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中將窗口坐標映射為對象坐標

是的,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]);

這是一個不適的問題,因為您無法從單個2D位置找到深度信息。 在一般情況下,沒有唯一的解決方案。

但是存在一些選擇:

  1. 您已經完成了從對象坐標到屏幕坐標的投影,並且可以將深度信息保留在某個位置以進行反向投影。
  2. 您想要獲取對象在屏幕上的3D位置。 因此,您使用視頻游戲技術,例如光線追蹤。 這個想法是從照相機發出光線,並將光線和物體之間的交點作為物體位置。 它在vtk https://blog.kitware.com/ray-casting-ray-tracing-with-vtk/中實現 在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM