У меня есть глубокие проблемы относительно понимания преобразований, вовлеченных в ВТК. 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 () возвращает матрицу преобразования, которая отображается из координат камеры в координаты области просмотра.
Это хорошее описание преобразований, вовлеченных в рендеринг OpenGL:
OpenGL Projection Matrix — это матрица, которая отображается от координат глаза до координат клипа. Несомненно, что координаты глаза в OpenGL совпадают с координатами камеры в VTK. Но совпадают ли координаты клипа в OpenGL с координатами области просмотра VTK?
Моя цель — смоделировать настоящую веб-камеру (уже откалиброванную) в VTK для рендеринга 3D-модели.
Ну, документация, на которую вы ссылались, объясняет это (выделение мое):
vtkCamera::GetProjectionTransformMatrix
:Вернуть матрицу проекционного преобразования, которая преобразует с камеры
координаты к координатам области просмотра. Этот метод вычисляет аспект,
Nearz и Farz, а затем вызывает более конкретную подпись
ПолучитькомпозитныйProjectionTransformMatrix
с:
vtkCamera::GetCompositeProjectionTransformMatrix
:Возврат конкатенации ViewTransform и
ProjectionTransform. Это преобразование преобразует мировые координаты в
координаты области просмотра. «Аспект» — это ширина / высота
область просмотра, а nearz и farz — это значения Z-буфера, которые отображаются на
ближние и дальние плоскости отсечения. Координаты области просмотра точки, расположенной внутри усеченного конуса, находятся в диапазоне
([-1, + 1], [- 1, + 1], [Nearz, фарз]).
Обратите внимание, что это не соответствует ни размеру окна OpenGL, ни нормализованному пространству устройства. Если вы найдете термин «координаты области просмотра» для этого плохой выбор, но как бы то ни было. Что меня больше беспокоит, так это то, что матрица фактически не преобразуется в это «пространство области просмотра», а в некоторый эквивалент пространства клипа. Только после разделения перспективы координаты будут находиться в диапазоне, указанном для приведенного выше определения «пространства области просмотра».
Но совпадают ли координаты клипа в OpenGL с координатами области просмотра
ВТК?
Так что ответ ясен нет. Но это близко. По сути, эта проекционная матрица представляет собой просто масштаб и сдвиг по измерению z, и между этими двумя значениями легко выполнить преобразование. В принципе, вы можете просто взять znear
а также zfar
из матрицы VTK и поместите ее в формулу матрицы проекции OpenGL, которую вы связали выше, заменив только эти два элемента матрицы.