Как отобразить координаты окна в координаты объекта, используя vtk - PullRequest
2 голосов
/ 02 апреля 2019

Я делаю программу 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();

, но я понятия не имею, как отобразить координаты окна в объекткоординаты в втк

Ответы [ 2 ]

2 голосов
/ 02 апреля 2019

Это некорректная задача , потому что вы не можете найти информацию о глубине из одной 2D-позиции. В общем случае не существует единственного решения.

Но есть несколько вариантов:

  1. Вы сделали проекцию от координат объекта до координат экрана, и вы можете хранить информацию о глубине где-нибудь для обратной проекции.
  2. Вы хотите получить трехмерное положение объекта на экране. Таким образом, вы используете технологии видеоигр, такие как трассировка лучей. Идея состоит в том, чтобы отправить луч из камеры и принять пересечение между лучом и объектом в качестве положения объекта. Это реализовано в vtk https://blog.kitware.com/ray-casting-ray-tracing-with-vtk/ enter image description here.
2 голосов
/ 02 апреля 2019

Да, 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]);
...