В чем разница между ProjectionTransformMatrix из VTK и GL_PROJECTION из OpenGL?

У меня есть глубокие проблемы относительно понимания преобразований, вовлеченных в ВТК. OpenGL имеет довольно хорошую документацию, и у меня сложилось впечатление, что VTK очень похож на OpenGL (во многих отношениях). Но когда дело доходит до преобразований, это, кажется, совсем другая история.

Это хорошая документация OpenGL о преобразованиях:
http://www.songho.ca/opengl/gl_transform.html

Матрица перспективной проекции в OpenGL:

введите описание изображения здесь

Я хотел посмотреть, даст ли эта формула, примененная в ВТК, матрицу проекции ВТК (путем перекрестной проверки с матрицей проекции ВТК).

Соответствующие параметры камеры и рендерера:

camera->SetPosition(0,0,20);
camera->SetFocalPoint(0,0,0);
double crSet[2] = {10, 1000};
renderer->GetActiveCamera()->SetClippingRange(crSet);
double windowSize[2];
renderWindow->SetSize(1280,720);
renderWindowInteractor->GetSize(windowSize);
proj = renderer->GetActiveCamera()->GetProjectionTransformMatrix(windowSize[0]/windowSize[1], crSet[0], crSet[1]);

Матрица проекционного преобразования, которую я получил для этой конфигурации:

введите описание изображения здесь

Значения (3,3) и (3,4) матрицы проекции (допустим, она имеет индекс от 1 до 4 для строк и столбцов) должны быть — (f + n) / (fn) и -2 * f * n / (фн) соответственно. В моих настройках камеры VTK, Nearz равен 10, а Farz равен 1000, и поэтому я должен получить -1,020 и -20,20 соответственно в (3,3) и (3,4) местах матрицы. Но это -1010 и -10000.

Я изменил свои значения диапазона отсечения, чтобы увидеть изменения, и позиция (3,3) всегда равна nearz + farz, что для меня не имеет смысла. Кроме того, было бы здорово, если бы кто-то мог объяснить, почему это 3,7320 в позициях (1,1) и (2,2). И это значение НЕ изменяется, когда я меняю размер окна рендерера. Довольно озадачивает для меня.

В ссылке на класс VTKCamera я вижу, что GetProjectionTransformMatrix () возвращает матрицу преобразования, которая отображается из координат камеры в координаты области просмотра.

VTK Camera Class Reference

Это хорошее описание преобразований, вовлеченных в рендеринг OpenGL:

введите описание изображения здесь

OpenGL Projection Matrix — это матрица, которая отображается от координат глаза до координат клипа. Несомненно, что координаты глаза в OpenGL совпадают с координатами камеры в VTK. Но совпадают ли координаты клипа в OpenGL с координатами области просмотра VTK?

Моя цель — смоделировать настоящую веб-камеру (уже откалиброванную) в VTK для рендеринга 3D-модели.

3

Решение

Ну, документация, на которую вы ссылались, объясняет это (выделение мое):

vtkCamera::GetProjectionTransformMatrix:

Вернуть матрицу проекционного преобразования, которая преобразует с камеры
координаты к координатам области просмотра
. Этот метод вычисляет аспект,
Nearz и Farz, а затем вызывает более конкретную подпись
ПолучитькомпозитныйProjectionTransformMatrix

с:

vtkCamera::GetCompositeProjectionTransformMatrix:

Возврат конкатенации ViewTransform и
ProjectionTransform. Это преобразование преобразует мировые координаты в
координаты области просмотра. «Аспект» — это ширина / высота
область просмотра, а nearz и farz — это значения Z-буфера, которые отображаются на
ближние и дальние плоскости отсечения. Координаты области просмотра точки, расположенной внутри усеченного конуса, находятся в диапазоне
([-1, + 1], [- 1, + 1], [Nearz, фарз]).

Обратите внимание, что это не соответствует ни размеру окна OpenGL, ни нормализованному пространству устройства. Если вы найдете термин «координаты области просмотра» для этого плохой выбор, но как бы то ни было. Что меня больше беспокоит, так это то, что матрица фактически не преобразуется в это «пространство области просмотра», а в некоторый эквивалент пространства клипа. Только после разделения перспективы координаты будут находиться в диапазоне, указанном для приведенного выше определения «пространства области просмотра».

Но совпадают ли координаты клипа в OpenGL с координатами области просмотра
ВТК?

Так что ответ ясен нет. Но это близко. По сути, эта проекционная матрица представляет собой просто масштаб и сдвиг по измерению z, и между этими двумя значениями легко выполнить преобразование. В принципе, вы можете просто взять znear а также zfar из матрицы VTK и поместите ее в формулу матрицы проекции OpenGL, которую вы связали выше, заменив только эти два элемента матрицы.

2

Другие решения


По вопросам рекламы [email protected]