Как преобразовать координаты окна в координаты объекта с помощью 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


person Community    schedule 02.04.2019    source источник


Ответы (2)


Да, 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]);
person Thomas Lang    schedule 02.04.2019
comment
почему виджет используется? Я не понял, сэр - person ; 03.04.2019
comment
Ах да, это вне среды, где VTK встроен в окно QT, поэтому нужно получить доступ к фактическому VTK-Widget. - person Thomas Lang; 03.04.2019
comment
какой виджет vtk сэр. Я не так много знаю о виджетах vtk. - person ; 03.04.2019
comment
Это просто QVTKOpenGLWidget. - person Thomas Lang; 03.04.2019
comment
спасибо за ответ, сэр, но я делаю в visualstudio - person ; 03.04.2019
comment
Пожалуйста, но это не имеет буквально ничего общего с вашей IDE. Это просто еще один тип виджета в библиотеке Qt. Если вы используете простой VTK, вам просто нужно использовать renderWindow вместо widget->GetRenderWindow() - person Thomas Lang; 03.04.2019
comment
Спасибо за объяснение, сэр :-). Я попробую это. - person ; 03.04.2019

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

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

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